in reply to print command runs after call to subroutine

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.

Replies are listed 'Best First'.
Re^2: print command runs after call to subroutine
by Fuhrer_of_Flapjacks (Initiate) on Oct 19, 2016 at 12:54 UTC

    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);