Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl映射传递参数_Perl_Map - Fatal编程技术网

Perl映射传递参数

Perl映射传递参数,perl,map,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

我正在用自己的子程序尝试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";

区别在于,在第二种情况下,您显式地传递参数,而在第一种情况下,您什么也不传递

@answers = map(mysqr, @questions);      # same as mysqr(), no argument passed
@answers = map {mysqr($_)} @questions;  # $_ is passed on to $input
您可能会想到这样一个事实,即许多Perl内置函数在没有给出参数的情况下使用
$\uuuu
。然而,这不是用户定义的子例程的默认行为。如果您想要这个功能,您需要自己添加它。不过,我要提醒你,这通常不是一个好主意

请注意,如果使用始终应该使用的
使用警告,则会出现描述性错误:

Use of uninitialized value $input in multiplication (*) at foo.pl line 8.
它告诉您没有数据被传递到
$input


不使用警告并不是从代码中删除错误,它只是隐藏错误,就像在汽车中隐藏“低机油”警告灯并不能防止发动机故障一样。

Map始终将参数列表的一个元素指定给
$\uucode>,然后计算表达式。因此,
map mysqr($)、1,2,3,4,5
对元素1,2,3,4,5中的每一个调用
mysqr
,因为
$依次设置为1,2,3,4,5中的每一个

调用内置函数时,您经常可以忽略
$\uuu
的原因是,许多Perl内置函数如果没有给定参数,默认情况下将在
$\uu
上运行。例如,
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

使用
$
,而不是
$
$input
。或者,你可以抓住原型这把双刃剑,编写
子mysqr({my($input)=@;…}
,在这种情况下可能更可取。更可取的解决方案是
死“mysqr:没有给出参数”,除非@也有可能,因为他们说,有不止一种方法可以做到这一点。@microbe不客气。我给你的建议是:不要使用默认使用
$的解决方案。它会以微妙的方式从背后咬你。总是通过争论。