假设我有100个if块具有不同的if条件但是if中的代码几乎相同。
实施例
if($a==3)
{
$xxx=6;
#followed by 100 lines of code common to all if conditions
exit #ie exit if condition is met
}
if($b==9)
{
$yyy=9;
#followed by 100 lines of code common to all if conditions
exit #ie exit if condition is met
}
#followed by 100 more if blocks
是否有可能在某处编写公共代码,然后通过我的if块中的某个衬垫使用它。这将节省10000行相同的代码。
我不想使用子程序,因为公共代码包含许多不同的变量,例如,公共代码包含$ a,$ b,$ xxx,$ yyy和许多其他复杂情况。我需要的是以某种方式减少我的程序长度。
实施例
commoncode{
100 lines of code
}
if($a==3)
{
$xxx=6;
commoncode;
}
答案 0 :(得分:3)
你可能有x-y问题,但无论如何我都会回答这个问题。这是老式的东西,我绝不会在生产代码中使用这种东西。或者在运行一次忘记丢弃代码。但是这里......
你说你有一堆对所有代码都很常见的变量。
use strict;
use warnings;
my ( $foo, $bar, $qux );
# ... stuff happens
if ($foo == 1) {
$bar = 'asdf';
do 'commoncode.pl';
}
if ($foo == 2) {
$bar = 'jkloe';
do 'commoncode.pl';
}
我正在使用the do
keyword,它会加载一个代码文件并在同一范围内执行它。这有时非常有用,但大部分时间都是一个可怕的想法。
现在我们的 commoncode.pl 看起来像这样。
use feature 'say';
say $bar;
那就是它。当Perl解释器通过时,它将在运行时在每个块中执行。每次都会重读该文件,这会让它变慢。但它会完成工作。
但是,这仍然是一个坏主意,你应该考虑一个更好的解决方案来做到这一点。以下是一些建议:
答案 1 :(得分:1)
您可以使用闭包来执行此操作:
use strict;
use warnings;
# Define variables
my ( $xxx, $yyy ) = ( 0, 0 );
my $closure = sub {
# common code that works on $xxx, $yyy
print "xxx: $xxx\n";
print "yyy: $yyy\n";
};
$xxx = 1;
$yyy = 1;
$closure->();
$xxx = 2;
$yyy = 2;
$closure->();
输出:
# perl test.pl
xxx: 1
yyy: 1
xxx: 2
yyy: 2
正如其他人所提到的,如果这不只是一个一次性的脚本,你可能想花时间重构代码以使其更易于维护。
答案 2 :(得分:0)
我很高兴你问这个问题!只要有可能,DRY编程(不要重复自己)是一个很好的生活原则。在Perl中,您要做的是通过子例程完成的。
if($a == 3)
{
$xxx = 6;
&mySubroutineForCommonCode;
}
sub mySubroutineForCommonCode
{
#100 lines of code
}
答案 3 :(得分:0)
几乎可以肯定有一种更优雅的方式来解决您的实际问题,但这是解决您问题的最直接方式:
if($a==3){
$xxx=6;
}elsif($b==9){
$yyy=9;
} 100 more elsifs
...
}else{
# handle case if no conditionals match
}
#followed by 100 lines of code common to all if conditions
exit; # (note you'll need a little more logic if you don't want to exit if no conditionals match)
由于您只是为第一个条件匹配运行一次代码块,所以您需要做的就是1)将所有条件链接在一起并且2)将公共代码移到条件之外。