如何在perl中多次使用相同的代码块

时间:2016-01-11 20:54:02

标签: perl

假设我有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;
    }

4 个答案:

答案 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)将公共代码移到条件之外。