簡體   English   中英

對於我是否將標量或數組傳遞給perl中的子例程感到困惑?

[英]Confused about whether I'm passing a scalar or an array to a subroutine in perl?

我剛剛開始學習perl,我對此練習感到困惑(來自Learning Perl第4章)。

在greet()子例程的開頭,我試圖將參數$ _分配給我的$ name(我的$ name = $ _)變量,但它不起作用。 這本書說要用“我的名字=班次”; 但我不明白為什么 shift用於從數組中刪除一個值,據我所知,我的參數不是一個數組,它是一個標量內的字符串!

誰能解釋一下我不理解的東西?

謝謝! 這是整個代碼。

use 5.012;
use warnings;
use utf8;

sub greet {
   my $name = $_;
   state $last_person ;
   if (defined $last_person ) {
          print "Hi $name! $last_person is also here!\n";

   } else {
          print "Hi $name! You are the first one here!\n";
   }
   $last_person = $name;
}

greet( 'Fred' );
greet( 'Barney' );
greet( 'Wilma' );
greet( 'Betty' );

在Learning Perl(第6版)的第4章中,有一個名為Arguments的部分。 在那里它陳述如下:

這意味着第一個子例程參數在$_[0] ,第二個子例程存儲在$_[1] ,依此類推。 但是-這里是一個重要的注意事項-這些變量都毫無關系與$_變量,任何超過$dino[3]的元素@dino陣列)具有做$dino (一個完全不同的標量變量)。 只是參數列表必須在某個數組變量中才能使子程序使用它,而Perl為此目的使用@_

學習Perl,第6版,第4章

所以當你應該使用my $name = $_[0];時,你可能會錯誤地使用$_ my $name = $_[0]; ,或my $name = shift @_; 為方便起見,當你是一個子程序內, shift默認為關閉的換擋@_如果您提供沒有明確的說法,所以常見的成語是說my $name = shift;

對於那些需要其他資源的人來說, perldoc perlintro對於將參數傳遞給子程序並通過@_shift訪問它們也有一個很好的(並且適當簡要)解釋。

以下是perlintro的簡短片段:

那是什么shift 好吧,子程序的參數可以作為一個名為@_的特殊數組使用(有關詳細信息,請參閱perlvar )。 shift函數的默認參數恰好是@_ 所以my $logmessage = shift; 將第一項移出參數列表並將其分配給$logmessage

聽起來你已經跳過了章節的一部分。 您是否閱讀了關於參數的部分(最新的第六版第66頁)。 它說

Perl將列表傳遞給子例程; 也就是說,Perl使列表可用於子程序,但需要使用。 當然,您必須將此列表存儲在某處,因此Perl會在子例程的持續時間內自動將參數列表(參數列表的另一個名稱)存儲在名為@_的特殊數組變量中。 您可以訪問此數組以確定參數的數量和這些參數的值。

這意味着第一個子例程參數在$ _ [0]中,第二個子例程存儲在$ _ [1]中,依此類推。 但是 - 這里有一個重要的注意事項 - 這些變量與$ _變量沒有任何關系,任何超過$ dino [3](@dino數組的一個元素)都與$ dino(一個完全不同的標量變量)有關)。 只是參數列表必須在子程序的某個數組變量中才能使用它,而Perl為此目的使用數組@_。

所有perl子例程的參數都存在於一個參數數組中,您的書無法提及。

這個數組@_ ,並在你的情況下,通過shift你將得到你的第一個參數,這將是一個標量。

暫無
暫無

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

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