जो आप करने का प्रयास कर रहे हैं वह वास्तविक कोड के रूप में '$ डिग्री> = 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}->()) { ... }
यह एक छोटे से अधिक मुश्किल हो जाता है आप >=
(यानी, रिश्ते ही) गतिशील रूप में अच्छी तरह से बनाया जा करना चाहते हैं। फिर आपके पास कुछ विकल्प हैं। कोई आपको अपने सभी जोखिमों के साथ स्ट्रिंग eval पर वापस ले जाता है (विशेष रूप से यदि आप अपने उपयोगकर्ता को स्ट्रिंग निर्दिष्ट करना शुरू करते हैं)। दूसरा generate_condition()
उप के भीतर एक लुकअप टेबल होगा।
generate_condition()
एक subroutine संदर्भ देता है जो लागू होने पर, सृजन के समय में स्थित स्थिति का मूल्यांकन करेगा।
यहां एक सामान्यीकृत समाधान है जो किसी भी पर्ल की सशर्तताओं को स्वीकार करेगा और उन्हें सबराउटिन में परीक्षण किए गए तर्कों के साथ लपेट देगा। subref तो सशर्त मूल्यांकन करने के लिए लागू किया जा सकता है:
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" पैरामीटर को बांधना चाहते हैं, लेकिन subroutine कॉल समय पर विनिर्देश के लिए "$test
" खोलें। आप इस तरह अपने उप पीढ़ी को संशोधित करेगा:
sub generate_condition {
my ($relation, $bound) = @_;
die "Bad relationship\n"
if ! $relation =~ m/^(?:<=?|>=?|==|l[te]|g[te]|cmp)$/;
state $relationships = {
'<' => sub { return $_[0] < $bound },
# ......
और फिर इस तरह यह आह्वान:
my $condition = generate_condition('<', 5);
if($condition->(2)) {
print "Yes, 2 is less than 5\n";
}
लक्ष्य रिलेशनल मूल्यांकन में दोनों बाईं और दाईं ओर की लेट बाइंडिंग प्रदान करने के लिए है, तो इस काम करेगा:
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"; }
उपकरण इस तरह की कार्यात्मक प्रोग्रामिंग की श्रेणी में आता है, और मार्क जेसन डोमिनस की किताबमें सुंदर विस्तार से कवर किया जाता है
क्या आपका मतलब $ शर्त {'हब'} {'1'} = '$ डिग्री => 5' है; ? – squiguy