是';我的$x如果0';5.10之前的Perls静态变量创建可用技巧?

是';我的$x如果0';5.10之前的Perls静态变量创建可用技巧?,perl,Perl,在5.10之前的Perl中,没有“状态”声明 我遇到了一个在这些perl中创建静态变量的示例:my$x if 0。if 0条件使变量的行为类似于静态变量: use strict; use warnings; add() for 1..7; sub add { my @arr = () if 0; push @arr, '+'; print @arr, "\n"; } 印刷品: + ++ +++ ++++ +++++ ++++++ +++++++ 这种行为在5.10

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

我遇到了一个在这些perl中创建静态变量的示例:
my$x if 0
if 0
条件使变量的行为类似于静态变量:

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

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

    push @arr, '+';
    print @arr, "\n";
}
印刷品:

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

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

不,这很糟糕。改用闭包

use strict;

sub add {
    my @arr;

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

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

我总是使用范围括号来创建静态变量

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";
    }
}

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

Deprecated use of my() in false conditional
即使您不能使用
state
(即您的代码需要能够在5.10之前的Perl版本下运行),
我的$x if 0
技巧就是懒惰。使用闭包,否则:

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

嗯,不是Perl 5.0之前的版本:)说“不”意味着这个技巧在5.10之前是不可用的,而事实上,在5.10之前引入
state
关键字来修复它是一个可用的bug/特性不会发出警告。