2017-10-11 88 views
2

Perl中是否可以聲明一個子例程,以便在調用參數時不會將參數傳遞給它?如何使用所需參數創建子程序?

+2

如何在編譯時判斷f(@a)是否將參數傳遞給'f'? – ikegami

+0

理論上可以使用Devel :: CallChecker或B :: CallChecker進行某種編譯時檢查,但這需要您熟悉Perl內部知識,並且有許多失敗模式。例如。它只會在某些子程序調用時不能用於方法。如果在列表上下文中評估任何參數,它將不起作用。 Perl的核心是一個動態語言。子進程可變大小列表,而不是固定大小的參數元組。我只是很高興語言只是足夠靜態檢測未知的潛艇和變量,不像更多的動態語言,如Python。 – amon

+0

PPR呢? – simbabque

回答

1

我認爲這種類型的事情是關於最好的,你目前可以做的:

#!/usr/local/bin/perl -w 
use strict; 
require 5.020; 
use warnings; 
use feature qw(say signatures); 
no warnings "experimental::signatures"; 

print "Enter your first name: "; 
chomp(my $name1 = <STDIN>); 

print "Enter your last name: "; 
chomp(my $name2 = <STDIN>); 

say "Calling takesOneOrTwoScalars with 2 args"; 
takesOneOrTwoScalars($name1, $name2); 

say "Calling takesOneOrTwoScalars with 1 arg"; 
takesOneOrTwoScalars($name1); 

say "Calling takesOneOrTwoScalars with 0 args"; 
takesOneOrTwoScalars(); 

sub takesOneOrTwoScalars($firstName, $lastName="") 
{ 
    print "Hello, $firstName"; 
    if ($lastName) 
    { 
     say " $lastName"; 
    } 
    else 
    { 
     say ", I see you didn't give your last name."; 
    } 
} 
+3

請注意,這隻會在傳遞不適合的參數列表時產生*運行時錯誤*。我不需要簽名功能。例如:'用鯉魚; ... croak「takeOneOrTwoScalars的參數太少」if @_ <1; croak「takeOneOrTwoScalars的參數太多」,如果@_> 2' – amon

2

一些可以與 prototypes (persub)來實現,在一定程度上

Perl的支持非常有限使用函數原型設計進行編譯時參數檢查。
...
......這個功能的目的主要是爲了讓你定義的工作就像內置功能

例如宣佈爲sub f1(\@)sub f2($$)子程序,潛艇只能被稱爲f1(@ary)(數組變量,@)和f2(SCALAR, SCALAR)或者存在編譯時錯誤。

但還有很多其他細節,有很多細微的疑慮;請閱讀下面的文檔和鏈接。原型而不是類似於編譯語言中的函數簽名,並且不打算做那個工作,即使它們可能以這種方式出現。即使輕微的誤用也會導致微妙的錯誤。見

所有這一切說如果適當地使用時,它們可以是有用的。見OP ikegami的評論。

相關問題