Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

Re: Re: Re: Scalars, Lists, and Arrays

by sierrathedog04 (Hermit)
on Apr 13, 2001 at 20:07 UTC ( #72380=note: print w/ replies, xml ) Need Help??

in reply to Re: Re: Scalars, Lists, and Arrays
in thread Scalars, Lists, and Arrays

There are other contexts as well. Camel III lists three of them. They are:

  • Boolean context, such as when we test for the existence of values in an array.
    while (@files) { my $file = shift @files; unlink $file or warn "Can't delete $file: $!\n; }
  • Void context. It is unclear from Camel III what this context does. The example Camel III gives is a statement consisting of the quoted string "Camel Lot"; Apparently the -w option on the perl interpreter does not like this context, and returns a warning on it. Maybe it's best to avoid this one altogether.

  • Interpolative context, which occurs inside quoted strings when one includes a variable name. The substitution operator s/// and some other expressions also occur in interpolative context.

    Boolean context is ubiquitous, so let's give this little brother of list and scalar its due!

Comment on Re: Re: Re: Scalars, Lists, and Arrays
Download Code
Re: Re: Re: Re: Scalars, Lists, and Arrays
by chromatic (Archbishop) on Apr 13, 2001 at 20:39 UTC
    Void context is where you have an expression (not to abuse Dominus' terminology too much) that doesn't go anywhere. For example, if you had:
    open(FILE, $filename) or die "Can't open $filename: $!"; "nothing to see here"; close FILE;
    Ignoring the fact that the program does nothing, the second line is a scalar expression (help me out here, if I abuse verbiage) in void context.

    When you abuse map to iterate over a list and don't assign the results to anything, you're using map in void context.

    It's generally not useful, but if you have an expression that can spend a lot of time creating a result value of some sort, it can be inefficient to use void context.

Re4: Scalars, Lists, and Arrays
by sachmet (Scribe) on Apr 13, 2001 at 20:41 UTC
    Void context ... Maybe its best to avoid this one altogether

    Void context is where you're performing an operation and doing nothing with the result. That is,
    #!/usr/bin/perl -cw "String";
    tells me:
    Useless use of a constant in void context at - line 2.
    In fact, I care about this because it generally indicates a problem with my program. What use is a constant where I don't store what that constant is?

    Void context can be useful. Consider:
    grep { s/\s+$// } @lines;
    which will remove all trailing whitespace from all the lines I have in @lines. grep normally returns the lines that matched the pattern. But because I'm in void context, the values just get thrown away and all I'm left with is @lines which contains every line missing its trailing whitespace. (By the way, the better way to do that is:
    foreach (@lines) { s/\s+$// }

    Consider also that some objects require methods to be run in void context. While you're not just throwing away their values, these things have side effects that perform useful work. For example, in CGI, you can do:
    which, while run in void context, imports all parameters into the 'R' namespace.

    So, in summary, -w isn't complaining because you're running things in void context. It's complaining because you're running in void context without doing anything that could be construed as useful.

    Update: D'oh, chromatic beat me to it.
Re: Scalars, Lists, and Arrays
by Dominus (Parson) on Apr 13, 2001 at 21:02 UTC
    Says sierrathedog04:
    "Boolean context" is 100% identical with scalar context. It is a fiction.

    Interpolative context
    That is not a context, because expressions are not evaluated in double-quoted strings. What value does localtime() produce in "The time is: localtime()\n"?

    Void context
    This one is a little different. For built-in Perl operators, it's identical to scalar context. The only time it might be different is for a user-defined function that explicitly tests whether wantarray yields an undefined value, and which does something different if so. Regardless, there's no question about what the return value is.

    The interesting one I think you left out is that the argument of defined is a different kind of context. defined(&foo) doesn't even call &foo.










              - tye (but my friends call me "Tye")

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://72380]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (5)
As of 2014-12-28 20:19 GMT
Find Nodes?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?

    Results (182 votes), past polls