我有一组3或4个单独的Perl脚本,它们曾经是一个简单的管道的一部分,但我现在正试图将它们组合在一个脚本中以便于使用(现在没有子程序功能)。问题是在不同的脚本中定义了几个具有相同名称的变量。我找到的解决方法是给这些变量赋予不同的名称,但它可能开始变得混乱,并且可能不是这样做的正确方法。 我知道全局和局部变量的概念,但我不太明白它们是如何工作的。
处理这类变量是否有任何经验法则?您是否知道任何可以对变量范围有所了解或有任何建议的好文档?
感谢。
编辑:我已经使用“使用警告;使用严格;”并使用“my”声明变量。问题实际上可能与范围块的定义以及如何使它们彼此独立有关......
答案 0 :(得分:5)
经验法则是将代码放在子程序中,每个程序都集中在较大进程的一个简单明确定义的部分。从这一个决策流程中可以获得许多良性结果,包括您所询问的变量范围问题的自然解决方案。
sub foo {
my $x = 99;
...
}
sub bar {
my $x = 1234; # Won't interfere with foo's $x.
...
}
如果由于某种原因,你真的不想这样做,你可以将代码的每个部分包装在作用域块中,并确保用my
声明所有变量(你应该这样做)后者几乎总是作为一种常见的做法):
{
my $x = 99;
...
}
{
my $x = 1234; # Won't interfere with the other $x.
...
}
答案 1 :(得分:5)
由于您使用全局变量(实际上可能存在于包main
中),您可能会遇到麻烦。您应该尽量避免使用全局变量。
为此,您应熟悉变量范围的含义。虽然有点过时,Coping with Scoping提供了对此主题的良好介绍。另请参阅this answer以及问题How to properly use Global variables in perl的其他问题。 (简答:尽可能避免使用它们。)
变量范围和限制使用全局变量的原则实际上适用于 所有 编程语言。你应该养成尽可能接近变量的习惯。
最后,为了避免许多麻烦,养成以下习惯:
use strict;
和use warnings;
,以及my
内声明sub
的变量(将这些变量的范围限制为sub
)。(有关此建议的更多信息,请参阅this PerlMonks article。)
我将此练习称为“佩戴安全带的Perl编程”。 : - )