Perl中是否可以聲明一個子例程,以便在調用參數時不會將參數傳遞給它?如何使用所需參數創建子程序?
回答
我認爲這種類型的事情是關於最好的,你目前可以做的:
#!/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.";
}
}
請注意,這隻會在傳遞不適合的參數列表時產生*運行時錯誤*。我不需要簽名功能。例如:'用鯉魚; ... croak「takeOneOrTwoScalars的參數太少」if @_ <1; croak「takeOneOrTwoScalars的參數太多」,如果@_> 2' – amon
一些可以與 prototypes (persub)來實現,在一定程度上
Perl的支持非常有限使用函數原型設計進行編譯時參數檢查。
...
......這個功能的目的主要是爲了讓你定義的工作就像內置功能
例如宣佈爲sub f1(\@)
和sub f2($$)
子程序,潛艇只能被稱爲f1(@ary)
(數組變量,@
)和f2(SCALAR, SCALAR)
或者存在編譯時錯誤。
但還有很多其他細節,有很多細微的疑慮;請閱讀下面的文檔和鏈接。原型是而不是類似於編譯語言中的函數簽名,並且不打算做那個工作,即使它們可能以這種方式出現。即使輕微的誤用也會導致微妙的錯誤。見
FMTYEWTK about Prototypes in Perl(perlmonks)
Understand why you probably don't need prototypes(EffectivePerler)
The problem with prototypes(現代的Perl)
所有這一切說如果適當地使用時,它們可以是有用的。見OP ikegami的評論。
- 1. 如何創建所需的WebMethod參數
- 2. 創建Outlook約會所需的參數
- 3. 如何在soap webservices中創建所需的參數?
- 4. 如何使用參數創建packaged_task?
- 5. 創建子應用程序
- 6. 使用參數而不需要創建存儲過程
- 7. 如何創建服務所需的數據時使用DI需要ajax調用
- 8. 在R腳本中,如何使用所有參數的變量創建序列?
- 9. 創建子進程jBPM的參數
- 10. 如何創建Ruby程序子?
- 11. 如何傳遞參數()所創建叉過程
- 12. 如何使用NSURLConnection創建程序?
- 13. 如何使用參數運行電子應用程序?
- 14. 如何使用sqlserver中的參數創建存儲過程
- 15. 如何在存儲過程中使用RAISERROR創建參數?
- 16. 如何使用參數創建\啓動線程
- 17. 如何使用Nvarchar(max)參數創建CLR存儲過程?
- 18. 需要幫助使用數組創建發票程序
- 19. 如何創建如何使用應用程序的教程
- 20. 如何使用開關類型參數子程序在Perl
- 21. 如何使用Range變量作爲子程序參數
- 22. 創建使用參數
- 23. 使用命令行的參數創建一個C++程序
- 24. 如何用參數創建SQL函數?
- 25. 如何使用fork創建一定數量的子進程()
- 26. 如何使用Sequelize創建所需的「BelongsTo」關聯?
- 27. 如何使用k-ng模型創建所需的字段?
- 28. 使用瓶子,需要創建網頁
- 29. 如何使用離子2應用程序中的參數創建HTTP PUT到WebAPI?
- 30. 如何使用數據庫創建Windows應用程序設置?
如何在編譯時判斷f(@a)是否將參數傳遞給'f'? – ikegami
理論上可以使用Devel :: CallChecker或B :: CallChecker進行某種編譯時檢查,但這需要您熟悉Perl內部知識,並且有許多失敗模式。例如。它只會在某些子程序調用時不能用於方法。如果在列表上下文中評估任何參數,它將不起作用。 Perl的核心是一個動態語言。子進程可變大小列表,而不是固定大小的參數元組。我只是很高興語言只是足夠靜態檢測未知的潛艇和變量,不像更多的動態語言,如Python。 – amon
PPR呢? – simbabque