Perl中正确的变量声明方式

时间:2013-12-14 23:05:24

标签: perl variables scope

我有一组3或4个单独的Perl脚本,它们曾经是一个简单的管道的一部分,但我现在正试图将它们组合在一个脚本中以便于使用(现在没有子程序功能)。问题是在不同的脚本中定义了几个具有相同名称的变量。我找到的解决方法是给这些变量赋予不同的名称,但它可能开始变得混乱,并且可能不是这样做的正确方法。 我知道全局和局部变量的概念,但我不太明白它们是如何工作的。

处理这类变量是否有任何经验法则?您是否知道任何可以对变量范围有所了解或有任何建议的好文档?

感谢。

编辑:我已经使用“使用警告;使用严格;”并使用“my”声明变量。问题实际上可能与范围块的定义以及如何使它们彼此独立有关......

2 个答案:

答案 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的其他问题。 (简答:尽可能避免使用它们。)

变量范围和限制使用全局变量的原则实际上适用于 所有 编程语言。你应该养成尽可能接近变量的习惯。

最后,为了避免许多麻烦,养成以下习惯:

  • 在每个Perl源文件的顶部包含use strict;use warnings;,以及
  • 在每个my内声明sub的变量(将这些变量的范围限制为sub)。

(有关此建议的更多信息,请参阅this PerlMonks article。)

我将此练习称为“佩戴安全带的Perl编程”。 : - )