Perl映射传递参数

mic*_*obe 4 perl map

我正在尝试使用我自己的子程序map().当我使用Perl的内置函数尝试它时,它可以工作.但是当我用自己的子程序尝试map()时,它失败了.我无法指出导致错误的原因.

这是代码片段.

   #!/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";
Run Code Online (Sandbox Code Playgroud)

MJD*_*MJD 6

Map始终为参数列表分配元素$_,然后计算表达式.因此,对每个元素1,2,3,4,5进行map mysqr($_), 1,2,3,4,5调用mysqr,因为$_依次设置为1,2,3,4,5中的每一个.

$_在调用内置函数时经常可以省略的原因是,许多Perl内置函数(如果没有给出参数)将$_默认运行.例如,该lc功能执行此操作.你的mysqr功能没有这样做,但如果你改变它来做这个,第一个表格将起作用:

    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
Run Code Online (Sandbox Code Playgroud)

  • 另外,可以抢一把双刃剑即原型,写`子mysqr(_){我的($输入)= @_; ......},在这种情况下甚至可能更好. (2认同)