Perl map passing arguments

dictionary, perl

Solution

Map always assigns an element of the argument list to `$_`, then evaluates the expression. So `map mysqr($_), 1,2,3,4,5` calls `mysqr` on each of the elements 1,2,3,4,5, because `$_` is set to each of 1,2,3,4,5 in turn.

The reason you can often omit the `$_` when calling a built-in function is that many Perl built-in functions, if not given an argument, will operate on `$_` by default. For example, the `lc` function does this. Your `mysqr` function doesn't do this, but if you changed it to do this, the first form would work:

    sub mysqr {
      my $input;
      if (@_) { ($input) = @_ }
      else    { $input = $_ }       # No argument was given, so default to $_
      my $answer = $input * $input;
      return $answer;
   }

   map(mysqr, 1,2,3,4,5);   # works now

Problem

I'm trying map() with my own subroutine. When I tried it with a Perl's builtin function, it works. But when I tried map() with my own subroutine, it fails. I couldn't point out what makes the error. Here is the code snippet. ``` #!/usr/bin/perl use strict; sub mysqr { my ($input) = @_; my $answer = $input * $input; return $answer; } my @questions = (1,2,3,4,5); my @answers; @answers = map(mysqr, @questions); # doesn't work. @answers = map {mysqr($_)} @questions; #works. print "map = "; print join(", ", @answers); print "\n"; ```

Original source