变量在Perl中返回到先前的值

时间:2017-08-24 08:44:43

标签: perl

我只有一个月的perl经验。 对于基于perl的程序执行问题,推荐变量返回到先前的值。 问题是什么? 这是代码。

1st();
2nd();
sub 1st {
        $cmd = "cat asdf";
}
sub 2nd {
   if ( $code =~ /aa/ ) {
            my $cmd = "$reg $annotation";
            out_log($cmd);
    } else {
            my $cmd = "$reg $annotation";
            out_log($cmd);
    }
    out_log("$cmd");
    open (Work,$cmd);
}

在这种状态下,$ cmd在if语句中注册,但在if语句后执行$ cmd,$ cmd值返回子例程1st的值。 谢谢你的建议。

1 个答案:

答案 0 :(得分:4)

您正在混合 lexical package 变量。如果您的计划有use strictuse warnings,那就非常明显了。

如果你没有用my声明变量,Perl会认为它是一个包变量。它将从程序的每个部分(在同一名称空间中)中可见。

如果您使用my声明变量,则它将是 lexical 。这意味着它只存在于它创建的范围中。

my $foo = 1;         #
                     #
if ($foo) {       #  #
    my $bar = 2;  #  #
}                 #  # 
                  ^  ^
                  |  | scope that $foo exists in
                  | scope that $bar exists in

同样的事情发生在这里。

您正在将$::cmd子集中的包变量::main"cat asdf"命名空间)设置为1st。然后,您调用2nd子,该子将进入else分支。在该范围内,它将创建一个新的词汇$cmd。它仅在该程序的该部分有效。然后传递给out_log(),它可能会打印出来。之后,您将$::cmd的{​​{1}}值传递给"cat asdf"。此时,新的out_log()不再存在。

code with freehand lines

如果你的程序中有$cmd,程序根本不起作用,因为在这种情况下默认的包变量行为被关闭,所以你必须定义变量。

实际上你根本不应该使用包变量,而是将参数传递给你的函数。

除此之外,还有一些其他的东西在你的程序中不是很好的做法。您应该使用3参数use strict和词法文件句柄,并检查open的返回值。

函数名称不能以数字开头,因此open1st不是有效名称。在他们做或代表什么之后命名事物会更好。这使得以后更容易阅读您的程序。

完整的程序可能看起来像那样。

2nd