在$ 5.10之前,'my $ x if 0'技巧是否可用于Perls的静态变量创建?

时间:2010-01-29 09:54:05

标签: perl

在5.10之前的Perl中没有“状态”声明。

我遇到过在这些Perls中创建静态变量的示例:my $x if 0if 0条件使变量像静态变量一样:

use strict; use warnings;
add() for 1..7;

sub add {
    my @arr = () if 0;

    push @arr, '+';
    print @arr, "\n";
}

打印:

+
++
+++
++++
+++++
++++++
+++++++

在5.10之前的所有版本的Perl中,这种行为是否一致?

3 个答案:

答案 0 :(得分:15)

my $x if 0的行为是一个错误。它存活了很长时间,因为它有用并因此被使用;修复它会破坏现有代码。它是一致的,因此可以被认为是可用的,但这并不意味着你应该这样做。此“功能”已弃用,并在5.10发出警告:

Deprecated use of my() in false conditional

即使您不能使用state(即您的代码需要能够在5.10之前的Perl版本下运行),my $x if 0技巧只是懒惰。否则使用封闭:

{
    my $x;
    sub counter {
        $x = '1' unless defined $x;
        print $x++, "\n";
    }
}

答案 1 :(得分:14)

我总是使用作用域大括号来创建静态变量。

add() for 1..2;       # Append to existing.
add('foo', 'bar');    # Re-initialize if args are passed.
add() for 1..2;       # Append to existing.
{
    my @arr;
    sub add {
        @arr = @_ if @_;
        push @arr, '+';
        print @arr, "\n";
    }
}

答案 2 :(得分:9)

不,这非常糟糕。改为使用闭包。

use strict;

sub add {
    my @arr;

    return sub {
        push @arr, '+';
        print @arr, "\n";
    }
}

my $iter = add();
$iter->() for 1..7;