On Mon, Feb 09, 2009 at 12:41:07PM -0000, Taylor, Andrew (ASPIRE) wrote:
> Hello
>
> I'm processing a file of test data that looks something like:
>
> FH1,data1,data2,data3,...etc
> FH2,data1,data2,data3,...etc
> FH1,data1,data2,data3,...etc
>
> Each line split into an array and processed.
>
> The first element (FH1, FH2, etc) is the name of the filehandle the
> output should be printed to.
>
> I'm trying to do something like:
>
> use strict;
> use warnings;
>
> open (FH1, ">file1");
> open (FH2, ">file2");
>
> open (INPUT, "<inputfile");
>
> while (<INPUT>)
> {
> ...split line
> ...process data
> ...create output
>
> my $FH = $split_line[0]
>
> print $FH "$output\n";
>
> }
>
> But I get the error:
> "Can't use string ("FH1") as a symbol ref while "strict refs" in use at
> my_script.pl line 387, <INPUT> line 1."
You are using "strict refs", which is a good idea in general. But then
you are trying to use a symbolic ref, which you explicitly said you
wouldn't do.
The solution therefore, is to allow symbolic refs where you are trying
to use them. This can be done by placing <no strict "refs";> just above
your print statement.
> The closest thing I've found is the following from the perldocs website:
>
> $fh = SOME_FH; # bareword is strict-subs hostile
> $fh = "SOME_FH"; # strict-refs hostile; same package only
> $fh = *SOME_FH; # typeglob
> $fh = \*SOME_FH; # ref to typeglob (bless-able)
> $fh = *SOME_FH{IO}; # blessed IO::Handle from *SOME_FH
> typeglob
>
> But I don't think that answers my question (or if it does, I'm too dumb
> to see that answer...)
The clue is on the second line.
The whole thing does seem a little fragile though, with such a tight
connection between the internals of your program and the data in your
file.
--
Paul Johnson - [email protected]
http://www.pjcj.net
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/