'$ degree> = 5'를 (를) 실제 코드로 평가하려고합니다. 문자열을 코드 (eval으로 수행 할 수 있음)로 평가하는 대신 코드 참조를 전달하는 것이 일반적으로 더 안전하고 종종 더 강력합니다. 이 같은 요구에 따라 조건부 서브 우퍼를 생성하는 발전기 서브 루틴을 사용할 수 있습니다
sub generate_condition {
my ($test, $bound) = @_;
return sub { return $test >= $bound; };
}
my %condition;
$condition{'hub'}{'1'} = generate_condition($degree, 5);
if($condition{$parameter}{1}->()) { ... }
그것은 좀 더 까다로운 얻는다 당신이 >=
(즉, 관계 자체가) 동적으로도 생성 할 경우. 그런 다음 몇 가지 선택 사항이 있습니다. 하나는 stringy eval로 돌아가며 모든 위험을 감수해야합니다 (특히 사용자가 문자열을 지정하게하는 경우). 다른 하나는 generate_condition()
하위의 찾아보기 테이블입니다.
generate_condition()
은 호출 될 때 생성시 바인딩 된 조건을 평가하는 서브 루틴 참조를 반환합니다.
다음은 Perl의 조건을 받아들이고 테스트 할 인수와 함께 서브 루틴으로 랩핑하는 일반화 된 솔루션입니다. 하위 참조는 다음 조건을 평가하기 위해 호출 할 수 있습니다
use strict;
use warnings;
use feature qw/state/;
sub generate_condition {
my ($test, $relation, $bound) = @_;
die "Bad relationship\n"
if ! $relation =~ m/^(?:<=?|>=?|==|l[te]|g[te]|cmp)$/;
state $relationships = {
'<' => sub { return $test < $bound },
'<=' => sub { return $test <= $bound },
'==' => sub { return $test == $bound },
'>=' => sub { return $test >= $bound },
'>' => sub { return $test > $bound },
'<=>' => sub { return $test <=> $bound },
'lt' => sub { return $test lt $bound },
'le' => sub { return $test le $bound },
'eq' => sub { return $test eq $bound },
'ge' => sub { return $test ge $bound },
'gt' => sub { return $test gt $bound },
'cmp' => sub { return $test cmp $bound },
};
return $relationships->{$relation};
}
my $true_condition = generate_condition(10, '>', 5);
my $false_condition = generate_condition('flower', 'eq', 'stamp');
print '10 is greater than 5: ',
$true_condition->() ? "true\n" : "false\n";
print '"flower" is equal to "stamp": ',
$false_condition->() ? "true\n" : "false\n";
종종 당신은 하나의 통화 시간에보다는 서브 루틴 제조시에 바인딩 열린 하나 개의 매개 변수를 떠나 관심 사물의 이러한 종류의를 구성 할 때."$bound
"및 "$ relation"매개 변수 만 바인딩하고 서브 루틴 호출시에는 사양에 대해 "$test
"을 열어두고 싶다고 가정 해 봅시다. ,
my $condition = generate_condition('<', 5);
if($condition->(2)) {
print "Yes, 2 is less than 5\n";
}
을 목표 관계형 평가 왼손과 오른쪽 측면 모두 런타임에 바인딩을 제공하는 경우 :
sub generate_condition {
my ($relation, $bound) = @_;
die "Bad relationship\n"
if ! $relation =~ m/^(?:<=?|>=?|==|l[te]|g[te]|cmp)$/;
state $relationships = {
'<' => sub { return $_[0] < $bound },
# ......
을 그리고 이런 식으로 호출 :이처럼 하위 세대를 수정할 것 이 작동합니다 :
sub generate_condition {
my $relation = shift;
die "Bad relationship\n"
if ! $relation =~ m/^(?:<=?|>=?|==|l[te]|g[te]|cmp)$/;
state $relationships = {
'<' => sub { return $_[0] < $_[1] },
'<=' => sub { return $_[0] <= $_[1] },
# ...... and so on .....
return $relationship->($relation);
}
my $condition = generate_condition('<');
if($condition->(2,10)) { print "True.\n"; }
도구의이 종류는 함수형 프로그래밍의 범주에 속하는, 마크 제이슨 도미 누스의 책아름다운 자세히 설명
당신은 $ condition { 'hub'} { '1'} = '$ degree => 5'를 의미합니까? ? – squiguy