Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re^3: Multiple foreach loops in single statement

by Athanasius (Abbot)
on Oct 24, 2012 at 04:11 UTC ( #1000551=note: print w/ replies, xml ) Need Help??


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

...we can provide a list too in split function.

Sorry, no. split operates on a single string (a scalar), but not on a list:

13:57 >perl -wE " $s = q[abc]; $t = q[mno]; say for split(//, $s, $t); + " Argument "mno" isn't numeric in split at -e line 1. a b c 14:06 >perl -wE " $s = q[abc]; $t = q[mno]; say for split(//, ($s, $t) +); " Useless use of a variable in void context at -e line 1. m n o 14:06 >perl -wE " @u = (q[abc], q[mno]); say for split(//, @u); " 2 14:06 >
The docs however mention EXPR ... which I assumed to be a scalar.

Yes, your original assumption was correct. But split returns a list, which is why the output of split can be the subject of a foreach or a map.

Hope that helps,

Athanasius <°(((><contra mundum


Comment on Re^3: Multiple foreach loops in single statement
Download Code
Replies are listed 'Best First'.
Re^4: Multiple foreach loops in single statement
by gurpreetsingh13 (Scribe) on Oct 24, 2012 at 14:51 UTC
    I considered myself to have given a good start on perl(as it was in some other languages)....but the wisdom of monks here and my weakness in basics shows there is still a long way to go and a lot to know....

    Thanks for your help. :)

Re^4: Multiple foreach loops in single statement
by gurpreetsingh13 (Scribe) on Oct 24, 2012 at 13:22 UTC
    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.

      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

      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://1000551]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (17)
As of 2015-07-30 12:37 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 (271 votes), past polls