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

Eug*_*ash 13 perl

在5.10之前的Perl中没有"状态"声明.

我在这些Perls中遇到了一个创建静态变量的例子: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";
}
Run Code Online (Sandbox Code Playgroud)

打印:

+
++
+++
++++
+++++
++++++
+++++++
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*man 15

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

Deprecated use of my() in false conditional
Run Code Online (Sandbox Code Playgroud)

即使你不能使用state(即你的代码需要能够在5.10之前的Perl版本下运行),my $x if 0诀窍就是懒惰.否则使用封闭:

{
    my $x;
    sub counter {
        $x = '1' unless defined $x;
        print $x++, "\n";
    }
}
Run Code Online (Sandbox Code Playgroud)


FMc*_*FMc 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";
    }
}
Run Code Online (Sandbox Code Playgroud)


dax*_*xim 9

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

use strict;

sub add {
    my @arr;

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

my $iter = add();
$iter->() for 1..7;
Run Code Online (Sandbox Code Playgroud)