首页 文章

Perl词汇范围变量在声明中的效率

提问于
浏览
0

Final Edit :我最好清理未来读者的问题 .

我最近继承了某人的Perl代码,并且有一个有趣的设置,我想知道它是否可以提高效率 .

该程序设置为使用 strictwarnings (应该如此) . 该程序设置为使用 global 变量;意味着变量被声明并初始化为程序顶部的 undef . 然后在程序内的各个循环中将超出初始 undef 的特定值分配给变量 . 设置完成后,会有一个单独的报表部分(在所有内部循环和子例程运行之后)使用变量作为其内容 .

有很多变量,只是在程序的顶部创建一个初始变量声明似乎是重复的,以便稍后可用于输出/报告目的(并保持符合严格的编译指示) . 根据我的理解和迄今为止收到的所有评论,似乎这是唯一的方法,因为定义的词汇范围变量仅在其声明的范围内持续存在 . 因此,为了使它成为 global ,它需要提前宣布(即在顶部) .

我_257608_声明了,当然仍然在 strict's 参数范围内?

我之前的例子令人困惑,所以我将在这里写一个伪代码示例来传达这个概念(我没有原始资源):

# Initial declaration to create "Global variables" -- imagine about 30 or so
my ($var1, $var2, $var3); # Global

# Imagine a foreach loop going through a hash and assigning values 
# to previously declared variables
for my $k (keys %h){
  ...
  $var = 1; #$var gets set to 1 within the foreach loop
  ...
}
print "The final calculated report is as follows:\n";

#output $var after loop is done later in program
print "Variable 1 comes to $var1\n";

所以问题是:是否有一个可接受的快捷方式在上面的 foreach 循环中声明 $var1 并将其范围升级到 foreach 循环之外,所以它实际上是"Global"?这样就可以避免在程序顶部声明并初始化为 undef ,并且仍然可以在程序的输出中使用它 .

根据已经收到的反馈,由于定义的范围限制,答案似乎是强调“否” .

2 回答

  • 2

    根据你自己的问题:

    所以问题是:是否有一个可接受的快捷方式在上面的foreach循环中声明$ var1并将其范围升级到foreach循环之外,所以它实际上是“全局”?这样就可以避免在程序顶部声明并初始化为undef,并且仍然可以在程序的输出中使用它 .

    您可以通过使用包括命名空间在内的整个名称来引用变量名而不首先声明它:

    use strict;
    use warnings;
    
    my %h = (
        first   => 'value 1',
        second  => 'value 2',
        third   => 'value 3',
    );
    
    for my $k (keys %h) {
        print "Processing key $k...\n";
        $main::var = 1;
    }
    
    print "Variable var is now $main::var\n";
    

    我假设 main 为你的命名空间,这是默认的 . 如果您的脚本声明 package ,那么您需要使用该名称 . 此外,如果您没有先声明变量,则每次都需要使用整个package :: name格式 .

    然而,就这么明确:你不需要“声明并初始化变量为undef” . 如果你这样做:

    my ($var1, $var2, $var3);
    

    这些变量已经初始化为 undef .

    现在,您还需要了解词法变量和全局变量之间的区别 . 使用关键字 my 在脚本顶部声明变量将使其在脚本的所有其余部分中可用,无论您是在块内还是在块外 . 但它们并非真正全球化,因为任何外部模块或脚本都看不到它们 . 如果将关键字 my 更改为 our ,则它们是全局的,并且在该脚本之外的任何位置都可见 .

  • 1

    我只是想知道是否有一个快捷方式可以将变量的范围提升为全局,无论它在何处声明,当然仍然保持在严格的参数范围内?

    使用全局变量是愚蠢的,但可能 .

    use vars qw( $foo );
    

    在任何使用之前它仍然需要存在 .

相关问题