Is the 'my $x if 0' trick usable for static variable creation for Perls before 5.10?

后端 未结 3 1683
我在风中等你
我在风中等你 2020-12-11 15:58

In Perl before 5.10 there is no \"state\" declaration.

I\'ve come across an example of creating static variables in these Perls: my $x if 0. The i

相关标签:
3条回答
  • 2020-12-11 16:29

    No, it's very crummy. Use a closure instead.

    use strict;
    
    sub add {
        my @arr;
    
        return sub {
            push @arr, '+';
            print @arr, "\n";
        }
    }
    
    my $iter = add();
    $iter->() for 1..7;
    
    0 讨论(0)
  • 2020-12-11 16:36

    The behavior of my $x if 0 is a bug. It has survived for a long time because it's useful and thus used; fixing it would break existing code. It's consistent and could therefore be considered usable but that doesn't mean you should do so. This "feature" has been deprecated and issues a warning as of 5.10:

    Deprecated use of my() in false conditional
    

    Even if you can't use state (i.e your code needs to be able to run under versions of Perl prior to 5.10) the my $x if 0 trick is just laziness. Use a closure otherwise:

    {
        my $x;
        sub counter {
            $x = '1' unless defined $x;
            print $x++, "\n";
        }
    }
    
    0 讨论(0)
  • 2020-12-11 16:41

    I've always used scoping braces to create static variables.

    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";
        }
    }
    
    0 讨论(0)
提交回复
热议问题