你应该如何在perl中使用Getopt :: Long声明与标志相关的变量?

时间:2015-07-13 21:28:07

标签: perl getopt-long

我使用Getopt :: Long来解析perl脚本的命令行标志和参数。对于某些标志,我需要声明脚本中仅在选择了该标志时使用的变量 - 否则它们永远不会被使用。我想有条件地声明它们,即只有在使用该标志时才能使我不会有一堆未使用的变量。以下是一些不起作用的示例代码,但说明了我想要做的事情。

use Getopt::Long qw(GetOptions);
my ($f1, $f2, $f3);
GetOptions('f1' => \$f1, 'f2' => \$f2, 'f3' => \$f3);

if($f2){
     #declare some variables needed only if $f2 is turned on
}

任何人都可以推荐正确的方法吗?

2 个答案:

答案 0 :(得分:0)

您应该始终在最小的范围中声明您的变量。 Perl中的范围通常是一个块。

use strict;
use warnings;

sub foo {
  my $bar = 5;
  say $bar;
}

sub baz {
  my $bar = 23;
  say $bar;
}

foo();
baz();
say $bar; # this will give an error

以上代码会出现错误"全局符号" $ bar"需要明确的包名称"因为未在块$bar之外声明。如果删除标记的行,它将输出两个值,它们彼此分开。

在整个代码中应该应用相同的原则。尽可能晚地在尽可能小的范围内(或在最大的必要条件下)声明变量。

答案 1 :(得分:0)

如果我理解正确,你会毫无理由地试图节省极少量的内存。无法帮助你。

另一方面,如果你试图使用不应该使用的全局变量,你可以使用以下内容:

use Carp            qw( croak );
use Variable::Magic qw( cast wizard );

use constant DEBUG => 1;

sub deny_access_to_scalar {
    my $name = $_[0];

    cast($_[1], wizard(
        get => sub { croak("Variable $name accessed when it shouldn't"); },
        set => sub { croak("Variable $name accessed when it shouldn't"); },
    ));
}

my $f2 = 1;

my $f2a;
deny_access_to_scalar(f2a => $f2a) if DEBUG && $f2;

$f2a = 123;