Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot

Puzzled over 'my'

by myomancer (Novice)
on Oct 23, 2003 at 12:42 UTC ( #301561=perlquestion: print w/replies, xml ) Need Help??
myomancer has asked for the wisdom of the Perl Monks concerning the following question:

I was trying to use grep in a scalar context, and thought this would work:
my($ok) = grep {/Some String/} @anArray;
But this just returned "Some String" rather than a number. If I remove 'my', the code works as I expected. This has upset my mental picture of what 'my' actually does. Please can anybody point me at a good resource to explain the subtleties if 'my'? Many thanks, Myomancer

Replies are listed 'Best First'.
Re: Puzzled over 'my'
by shenme (Priest) on Oct 23, 2003 at 12:50 UTC
    Change it to
    my $ok = grep {/Some String/} @anArray;
    and you'll go back to scalar context.   Using the parentheses forced the matches into array context.
Re: Puzzled over 'my'
by Anonymous Monk on Oct 23, 2003 at 12:53 UTC
    This is list context.

    my($ok) = grep {/Some String/} @anArray;

    This is scalar context

    my $ok = grep {/Some String/} @anArray;
Re: Puzzled over 'my'
by tadman (Prior) on Oct 23, 2003 at 20:47 UTC
    You must've not only removed the my, but the brackets as well. It was the brackets, mind you, that are the key here.

    Including brackets means that you're assigning a list to a list, in this case, the result of the grep operation into a list containing the variable $ok. Thus, the first thing grepped goes into the first variable, and you get "Some String".

    If you want to know how many things you got, you need to force a list to scalar conversion. That might sound fancy, but it's just a way of saying you want to assign the list directly to the variable instead of to a list of variables. No brackets. If you're a bit fuzzy, here's some examples;
    my @list = ("A","B","C"); my ($var) = @list; # $var becomes "A" my $var = @list; # $var becomes 3 my ($var) = scalar(@list); # $var becomes 3 my $var = scalar(@list); # $var becomes 3 (same idea)

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://301561]
Approved by phydeauxarff
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (5)
As of 2018-02-24 08:46 GMT
Find Nodes?
    Voting Booth?
    When it is dark outside I am happiest to see ...

    Results (310 votes). Check out past polls.