Hey there, I'm not a total beginner to Perl, but am far enough into it to have a lot of questions, so I hope this is a suitable place for them :)
Fire away!
sub getResponse {
my $self = shift;
my $incoming = <$self->{filehandle}>;
...
gave me:
syntax error at NeuralPerl.pm line 50, near "<$self->{"
Typically, anything more complicated than a bareword (e.g. <FOO>) or a single variable (e.g. <$fh>) inside the angle-brackets will be interpreted as a glob(), rather than the readline() you wanted.
% perldoc perlop
...
If what's between the angle brackets is neither a filehandle
nor a simple scalar variable [etc.]So even if you were using a plain hash instead of the hashref
my $incoming = <$hash{filehandle}>;
This code still wouldn't do the right thing.
But you have a syntax error as well, because the hash-dereference
uses ">" as part of the "arrow", and so perl sees a matching pair
of angle brackets ("<" and ">") in the wrong place: <$self->{filehandle}>
^......^You've already found one solution (put the filehandle in a simple scalar variable) but you could also call readline() explicitly:
my $incoming = readline $self->{filehandle};
Oh, another one that I have hit a few times; is there a nice way of doing what this looks like it means: sub mySub { $foo = shift; @bar = shift; %baz = shift; ...
Currently I use things like @{ $_[1] } and so on, but I'm wondering if there is a way I can use shift.
You can use shift() inside the dereference if you add parens:
my @bar = @{ shift() };
Or you can assign the hash/array references to typeglobs.
sub f {
$foo = shift; # argument is a plain scalar
*bar = shift; # sets @bar, if $_[1] is an array reference
*baz = shift; # sets %baz, if $_[2] is a hash reference
...
}You can also just work with the references directly:
my $bar = shift;
push @$bar, 42; # or whateverAnd I think this is almost always the thing to do.
-- Steve
-- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>
