我只有一个月的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的值。 谢谢你的建议。
答案 0 :(得分:4)
您正在混合 lexical 和 package 变量。如果您的计划有use strict
和use 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()
不再存在。
如果你的程序中有$cmd
,程序根本不起作用,因为在这种情况下默认的包变量行为被关闭,所以你必须定义变量。
实际上你根本不应该使用包变量,而是将参数传递给你的函数。
除此之外,还有一些其他的东西在你的程序中不是很好的做法。您应该使用3参数use strict
和词法文件句柄,并检查open
的返回值。
函数名称不能以数字开头,因此open
和1st
不是有效名称。在他们做或代表什么之后命名事物会更好。这使得以后更容易阅读您的程序。
完整的程序可能看起来像那样。
2nd