Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re^4: Multiple foreach loops in single statement

by gurpreetsingh13 (Scribe)
on Oct 24, 2012 at 13:22 UTC ( #1000635=note: print w/ replies, xml ) Need Help??


in reply to Re^3: Multiple foreach loops in single statement
in thread Multiple foreach loops in single statement

No. See it clearly.

perl -e '@lines=`cat file.pl`;print $#lines,"\n", $lines[2];'

Output:

18 use Unicode::Collate::Locale;

this returns a list infact - a list of strings after pumping in entire file splitted on newline.

And we are providing this list in place of an EXPR in split which makes it a point that we can provide a list too instead of a string.


Comment on Re^4: Multiple foreach loops in single statement
Select or Download Code
Replies are listed 'Best First'.
Re^5: Multiple foreach loops in single statement
by Anonymous Monk on Oct 24, 2012 at 13:30 UTC
Re^5: Multiple foreach loops in single statement
by Athanasius (Abbot) on Oct 24, 2012 at 13:56 UTC

    gurpreetsingh13,

    I understand your reasoning, and for most languages you would be correct. But Perl is different: in Perl, the behaviour of functions and operators depends on context. For example, here is what the documentation says about backticks:

    The collected standard output of the command is returned ... In scalar context, it comes back as a single (potentially multi-line) string, or undef if the command failed. In list context, returns a list of lines ..., or an empty list if the command failed.

    So, in your script:

    perl -e 'print chr(ord()+1) foreach(split //,`cat file.pl`);'

    the expression `cat file.pl` is in scalar context (because split expects a scalar expression here), so the output of the cat command is fed to split as a single, multi-line string. But in your other script:

    perl -e '@lines=`cat file.pl`;print $#lines,"\n", $lines[2];'

    the assignment to an array (@lines) puts `cat file.pl` into list context, so the output of the cat command is here not a single string as before, but rather a list of strings (one for each line).

    Context is a central concept in Perl. You can read up on it in the references given by Anonymous Monk, above, or in Chapter 2 of Programming Perl by Christiansen, foy, and Wall (in the section beginning on page 76 of the 4th Edition).

    Hope that helps,

    Athanasius <°(((><contra mundum

Re^5: Multiple foreach loops in single statement
by ikegami (Pope) on Mar 02, 2013 at 22:54 UTC
    split's second argument is evaluated in scalar context, so it's more like
    my $output = `cat file.pl`;
    than
    my @output = `cat file.pl`;

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (10)
As of 2015-07-31 04:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (274 votes), past polls