in reply to Why are list items passed to die() combined into a string?

Lotus1:

If you check the docs (perldoc -f die), you'll see that's the intended behavior. It's not "bad practice" to pass in a list.

...roboticus

When your only tool is a hammer, all problems look like your thumb.

Replies are listed 'Best First'.
Re^2: Why are list items passed to die() combined into a string?
by Lotus1 (Vicar) on Jan 13, 2015 at 18:40 UTC

    roboticus wrote:

    If you check the docs (perldoc -f die), you'll see that's the intended behavior. ...

    Actually, I did read the perldoc for die and the only thing I saw about stringification was this:

    Because Perl stringifies uncaught exception messages before display, you'll probably want to overload stringification operations on exception objects.

    That isn't exactly obvious that it has anything to do with @_ or that die() is doing anything or what the intended behavior is with respect to @_.

    ... It's not "bad practice" to pass in a list.

    The reason I asked about "bad practice" is shown in the example below. Passing a list to a parameter will cause the second element of the list to go to the next parameter. In the original example it appears that @_ is always just a single item but this is confusing for anyone who maintains or reuses this code. I guess I just answered my own question; This is a very bad practice.

    use strict; use warnings; my @array1 = ( "this is a line\n", "this is a second line"); my @array2 = qw( one two three); sub1 ( @array1 ); sub sub1 { send_status_email('xxx@yy.com', 'subject',@_, \@array2); } sub send_status_email { my ($to_address, $status, $message, $ar_attachments ) = @_; print "To: $to_address\n"; print "Status: $status\n"; print "Message <$message>\n"; foreach ( @$ar_attachments ) { print "ar: $_\n"; } print "***************** sub finished\n"; } __END__ ** output ** To: xxx@yy.com Status: subject Message <this is a line > Can't use string ("this is a second line") as an ARRAY ref while "stri +ct refs" in use at C:\usr\dms\perl\test_sub_array.pl line 20.

      UPDATE: Ignore this... I'm not sure how I missed that you were pointing out the bad example of how not to use @_.

      You are passing @_ as the third argument to send_status_email followed by \@array2. Since @_ contains two items and send_status_email is expecting a scalar for the third argument, the second item in @_ is going into $ar_attachments. Here is one way to fix that:

      use strict; use warnings; my @array1 = ( "this is a line\n", "this is a second line"); my @array2 = qw( one two three); sub1 ( @array1 ); sub sub1 { send_status_email( 'xxx@yy.com', 'subject', \@_, \@array2); } sub send_status_email { my ($to_address, $status, $message, $ar_attachments ) = @_; print "To: $to_address\n"; print "Status: $status\n"; my $body = join '', @$message; print "Message <$body>\n"; foreach ( @$ar_attachments ) { print "ar: $_\n"; } print "***************** sub finished\n"; } __END__ To: xxx@yy.com Status: subject Message <this is a line this is a second line> ar: one ar: two ar: three ***************** sub finished