다른 답변은 코드 참조 또는 별칭을 사용하여 정확합니다. 그러나 앨리어스 예제는 yicky 타입 글롭 구문을 도입하고 엄격한 것을 잊어 버립니다.
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()
으로 전화하면됩니다. 당신은 함수로서 그것을 export하지 않을 것입니다, 나는 단지 코드 레퍼런스를 사용하고 aliasing을 잊어 버릴 것입니다.
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) 첫 번째 두 문장 중 어느 것도 작동하지 않을 때 세 번째 정의를 가지길 원할 수 있습니다. 전화를 걸면 차이가 생길 수 있습니다. –
"엄격한 사용; 경고 'all';" 이들은 당신이 만나는 종류의 문제들입니다. – JDrago