代码之家  ›  专栏  ›  技术社区  ›  Aakash Goel

如何在Perl中自动初始化所有标量变量?

  •  7
  • Aakash Goel  · 技术社区  · 14 年前

    Perl语言 automatically initializes variables undef

    是否有方法重写此默认行为并告诉Perl解释器将变量初始化为 zero (或其他固定值)?

    4 回复  |  直到 7 年前
        1
  •  13
  •   Sinan Ünür    14 年前

    代码完整性中的建议对于C等语言很重要,因为

    int f(void) {
       int counter;
    }
    

    价值 counter 不管发生什么事都会占据你的记忆。

    在Perl中,当您使用

    my $counter;
    

    $counter undef 不是随便的垃圾。

    因此,建议背后的动机,即确保所有变量以已知值开始,在Perl中是自动满足的,不需要做任何事情。

    你用计数器做的是增加或减少它们。结果:

    my $counter;
    # ...
    ++ $counter;
    

    在Perl中定义良好。 $计数器 将保持价值 1

    最后,我认为,在大多数情况下,Perl中不需要计数器,大量使用计数器变量的代码可能需要重写。

        2
  •  11
  •   Eric Strom    14 年前

    据我所知,这是不可能的(而且不应该,这比 $[ ).

    my ($x, $y, $z) = (0) x 3;
    

    或将初始化移到函数:

    sub zero {$_ = 0 for @_}
    
    zero my ($x, $y, $z);
    

    甚至:

    $_ = 0 for my ($x, $y, $z);
    
        3
  •  5
  •   Ether    14 年前

    在Perl中,您可以在第一次需要变量时正确地声明它们,因此通常不需要先声明它们(无论是否初始化),然后再使用它们。此外,运营商如 ++

    # this is perfectly legal:
    my $counter;
    while ($some_loop)
    {
        $counter++;
    }
    

    但是,我可以插入一个插头 Moose

    package MyClass;
    use strict;
    use warnings;
    use Moose;
    
    has some_string => (
        is => 'rw', isa => 'Str',
        default => 'initial value',
    );
    
    has some_number => (
        is => 'rw', isa => 'Int',
        default => 0,
    );
    __PACKAGE__->meta->make_immutable;
    1;
    
    package main;
    my $object = MyClass->new;
    print "string has value: ", $object->some_string, "\n";
    print "number has value: ", $object->some_number, "\n";
    

    印刷品:


    数字具有值:0

        4
  •  0
  •   Dave Sherohman    14 年前

    你想这样做是有具体的原因,还是仅仅是因为 代码完成

    如果是前者,请分享原因,我们可以适当地讨论如何实现你的真正目标。

    如果是后者,请记住 是一组用C编写程序的准则,而不是Perl。Perl不是C语言,它有自己的优点和缺点,这也意味着它有一套不同的。。。我讨厌用这个短语。。。最佳实践。适用于一种语言的准则不一定适用于另一种语言。”当您声明变量时,总是初始化变量(如果可能的话)“这在C中是一个很好的实践,但在Perl中通常是不必要的。