簡體   English   中英

Perl映射傳遞參數

[英]Perl map passing arguments

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

Map始終將參數列表的元素分配給$_ ,然后計算表達式。 因此map mysqr($_), 1,2,3,4,5在每個元素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

區別在於,在第二種情況下,您顯式傳遞參數,而在第一種情況下,您不傳遞任何內容。

@answers = map(mysqr, @questions);      # same as mysqr(), no argument passed
@answers = map {mysqr($_)} @questions;  # $_ is passed on to $input

您可能會想到許多Perl內置函數在沒有給出參數時使用$_這一事實。 但是,這不是用戶定義的子例程的默認行為。 如果您需要該功能,則需要自己添加。 雖然被警告說這通常不是一個好主意。

請注意,如果您使用始終應該use warnings ,則會出現描述性錯誤:

Use of uninitialized value $input in multiplication (*) at foo.pl line 8.

這告訴您沒有數據傳遞給$input

不使用警告不是從代碼中刪除錯誤,它只是隱藏它們,就像隱藏汽車中的“低油”警告燈不會阻止引擎故障。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM