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

Im still learning so this is a very low-level question. I just would like to understand what's going on here please. here is my code:

#! /usr/bin/perl use strict; use warnings; use 5.14.0; sub display { foreach(@_) { print "$_\n" } } my @numberSet = 1..10; print "\n show all the elements!\n". &display(@numberSet) ;

as you can you see, I want the output to print "show all the elements" and then display all the elements of the array using the subroutine. But the subroutine runs first and then the print happens. Why is this ?

1 2 3 4 5 6 7 8 9 10 show all the elements!

Replies are listed 'Best First'.
Re: print command runs after call to subroutine
by Corion (Patriarch) on Oct 19, 2016 at 12:32 UTC

    Because the evaluation order is different from the order in your source code. To construct the argument passed to your final print line, Perl needs to run the display subroutine to get at its return value. The display subroutine prints out some stuff and returns nothing. This result is then appended to the final print statement.

    If you want a different order of execution, consider using one print statement and a simple call to display, or even better, consider making display return a string instead of printing it.

    sub display { my( $result ) = ''; foreach( @_ ) { $result = $result . "$_\n"; }: return $result }

    Also, your style of calling display is somewhat fraught with dangers. I recommend using the more common style of simply using the subroutine name with parentheses instead:

    display( 1..10 );

    Using &display() brings you close to the danger of using &display;, which has the subtle side-effect of using the (parent callers) @_ as arguments instead of passing no arguments.

      The alternative you suggest for the display subroutine makes sense. So I guess it's good practice to always have a sub return a value and have that display in the "main" portion of the code rather than print anything within the sub itself (unless of course there is a specific need for that to happen)?

      As for your other recommendations, to address those, I was just trying to write a sub that can accept any number of parameters rather than a fixed amount. I would imagine that in a more concrete scenario, a fixed number more likely be used.

      Thank you for the help.

        Personally, I've found that in most situations I don't want subroutines to print out stuff, because having them print stuff makes it harder to suppress that output later, when rewriting the script.

        Perl does not enforce the number of parameters anyway, so you can always write the following:

        sub display { ... }; display(1,2); display(1,2,3,4);