代码之家  ›  专栏  ›  技术社区  ›  Dummy00001

全局变量何时赋值?

  •  2
  • Dummy00001  · 技术社区  · 14 年前

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    print &get_keys(), "\n";
    
    use vars qw/%hello/;  # same effect with 'my %hello = (...);'
    %hello = ( a => 1, b => 2 );
    
    sub get_keys
    {
            return join(', ', sort keys %hello);
    }
    

    这是故意的吗?

    我也会很高兴的RTFM指针。

    3 回复  |  直到 14 年前
        1
  •  8
  •   FMc TLP    14 年前

    perlsub :

    A my 具有编译时和 运行时效果。在编译时 编译器注意到了这一点。这个 这样做的主要作用是 use strict 'vars' 初始化延迟到运行 合适的时间。

    # At this point, %hello is a lexically scope variable (the my took effect
    # at compile time), but it still has no keys.
    print get_keys();
    
    my %hello = ( a => 1, b => 2 );
    
    # Now the hash has content.
    print get_keys();
    
    sub get_keys { join ' ', keys %hello, "\n" }
    

    our 而不是 use vars foo() 而不是 &foo() .

        2
  •  4
  •   dave4420    14 年前

    是的,这是故意的行为。你打电话来 get_keys() 分配给之前 %hello %你好 在中为空 undef ,而数组和哈希值默认设置为空。)

    如果你愿意的话 要立即初始化,请使用BEGIN块:

    use vars qw/%hello/;
    BEGIN {
        %hello = ( a => 1, b => 2 );
    }
    

    请注意,如果您使用 my (或 our ,那么这就行不通了:

    BEGIN {
        my %hello = ( a => 1, b => 2 );
    }
    

    my %hello;
    BEGIN {
        %hello = ( a => 1, b => 2 );
    }
    
        3
  •  3
  •   Eugene Yarmash    14 年前

    这个 use vars

    顺便说一句,这个pragma已经过时了。从 perldoc vars :

    注意:对于当前包中的变量,提供的功能 本pragma已被“我们的”声明取代,可在 Perl v5.6.0或更高版本。请参阅perlfunc中的“我们的”。