其他答案是正確的,使用代碼引用或別名。但是別名示例引入了yicky typeglob語法,並忘記處理strict。
Alias是一個被遺忘的模塊,它包裝了所有需要的參數,以保證嚴格的參考名稱。
use strict;
use Alias;
my $difference_method = $ARGV[0];
if("square" eq $difference_method) {
alias difference => sub { return ($_[0] - $_[1]) ** 2 };
}
elsif("constant" eq $difference_method) {
alias difference => sub { return 1 };
}
else {
die "Unknown difference method $difference_method";
}
而現在difference($a, $b)
的作品。
如果您只需在自己的代碼中調用difference()
即ie。你不會將它作爲函數導出,我只是使用代碼引用並忘記別名。
my $difference_method = $ARGV[0];
my $Difference;
if("square" eq $difference_method) {
$Difference => sub { return ($_[0] - $_[1]) ** 2 };
}
elsif("constant" eq $difference_method) {
$Difference => sub { return 1 };
}
else {
die "Unknown difference method $difference_method";
}
$Difference->($a, $b);
有條件地改變函數的功能會使代碼難以遵循,並且不夠靈活,就像改變任何全局行爲一樣。
my $Difference_Method = $ARGV[0];
sub difference {
if($Difference_Method eq 'square') {
return ($_[0] - $_[1]) ** 2;
}
elsif($Difference_Method eq 'constant') {
return 1;
}
else {
die "Unknown difference method $Difference_Method";
}
}
你有形式的子程序任何時候...
sub foo {
if($Global) {
...do this...
}
else {
...do that...
}
}
你有一個問題:當你意識到你只是優化這一點,變得更加明顯。
別名對於在運行時使用閉包生成類似函數非常有用,而不是通過手工粘貼它們來減少&。但這是另一個問題。
當你處於這種狀態時,你可能想要確保你或者A)死亡,如果在你做這件事之前有無效的參數,或者B)有第三個定義,以免前兩個語句無效。如果你試着打電話給&差異,那就不好了,它不在那裏。 – 2009-02-25 23:28:09
當你不「嚴格使用;全部使用警告」;「這些都是你遇到的問題。 – JDrago 2009-02-26 00:21:18