skullbowl has asked for the wisdom of the Perl Monks concerning the following question:

Thanks to boo_radley for highlightling usage of foreach loop. I was thinkering around with it. Can anybody explain to me why the following codes does not print Suaveantiakobskimerlynboo_radle ?

@monks = ('Suaveant', 'iakobski', 'merlyn', 'boo_radley'); while (<>) { foreach (@monks) { chop; } print; }

Replies are listed 'Best First'.
Re: foreach loop
by Sherlock (Deacon) on May 02, 2001 at 19:37 UTC
    You may want to try something like this:
    @monks = ('Suaveant', 'iakobski', 'merlyn', 'boo_radley'); foreach (@monks) { chop; print; }
    The line while(<>) simply accepts input from STDIN until nothing else is received, so I don't see why you really want to use that. Secondly, the print should really be within the loop. The foreach loop will loop over each element in the array @monks and perform whatever operations you have within that block on that element. In this case, I think you want to do a chop and then a print - by putting it into the loop, you'll get this effect on every element of the array.

    By running this snippet, I was able to produce the output you wanted: Suaveantiakobskimerlynboo_radle.

    Hopefully, this makes a little more sense to you. You can go here for more information on foreach loops.

    Good luck,
    - Sherlock
Re: foreach loop
by the_slycer (Chaplain) on May 02, 2001 at 19:39 UTC
    You are not running the print within the foreach loop. So, once out of the foreach loop, $_ becomes whatever is coming from the diamond operator (which is typically the file stated on the command line).

    If you run the print within the foreach loop it will print almost exactly what you think.

    I say almost because you are chopping the last character from (for) each of those monks :-). If you want to get rid of newlines - which is not necessary in this case - use chomp instead of chop.
Re: foreach loop
by azatoth (Curate) on May 02, 2001 at 19:37 UTC
Re: foreach loop
by iakobski (Pilgrim) on May 02, 2001 at 19:37 UTC
    It nearly does if you put the print in the loop:
    @monks = ('Suaveant', 'iakobski', 'merlyn', 'boo_radley'); while (<>) { foreach (@monks) { chop; print; } }
    then you get Suaveaniakobskmerlyboo_radle

    iakobski

Re: foreach loop
by alfie (Pilgrim) on May 02, 2001 at 19:40 UTC
    Because $_ is only available in the scope of the current block. So after the foreach block is finished $_ refers to the read line.

    Btw.: You should have expected Suaveaniakobskmerlyboo_radle for using the chop ;-)
    --
    use signature; signature(" So long\nAlfie");

Re: foreach loop
by hdp (Beadle) on May 02, 2001 at 19:40 UTC
    Given Sherlock's fix, your output will be Suaveaniakobskmerlyboo_radle -- chop hits each string, not just the last one.

    hdp.