代码之家  ›  专栏  ›  技术社区  ›  FreonPSandoz

对左值Perl子例程的引用可以用作左值吗?

  •  0
  • FreonPSandoz  · 技术社区  · 2 年前

    我在使用Perl子例程引用作为左值时遇到了问题。我是在这里做错了什么,还是不可能这样做?我在Windows上使用ActiveState Perl 5.20。谢谢

    package Warning {
      use strict;
      use warnings;
      use Carp 'carp';
      sub new { 
        my $class = shift;
        return bless [@_], $class;
      }
      sub initbyname {
        my $self = shift;
        $self = $self->new unless ref $self;
        carp "'Warning' object already initialized" if @$self;
        while (@_) {
          my $method = shift;
          my $value = shift;
          my $sub = $self->can($method);
          $sub ? ( $sub->() = $value ) : 
              ( carp "method '$method' not found" );
         }
         return $self;
      }
      sub biff :lvalue { $_[0]->[ 0] }
      sub boff :lvalue { $_[0]->[ 1] }
    }
    
    package ThisWorks {
      use strict;
      use warnings;
      use Carp 'carp';
      sub new { 
        my $class = shift;
        return bless [@_], $class;
      }
      sub initbyname {
        my $self = shift;
        $self = $self->new unless ref $self;
        carp "'ThisWorks' object already initialized" if @$self;
        while (@_) {
          my $method = shift;
          my $value = shift;
          $self->can($method) ? ( $self->$method = $value ) :
              ( carp "method '$method' not found" );
         }
         return $self;
      }
      sub riff :lvalue { $_[0]->[ 0] }
      sub roff :lvalue { $_[0]->[ 1] }
    }
    
    package main;
    use v5.20;
    use strict;
    use warnings;
    my $warning   = Warning->initbyname( boff => 12 );
    my $thisworks = ThisWorks->initbyname( roff => 13 );
    say "warning->boff = ", $warning->boff // "uninitialized!";
    say "thisworks->roff = ", $thisworks->roff;
    

    打印:

    Useless assignment to a temporary at a.pl line 17.
    warning->boff = uninitialized!
    thisworks->roff = 13
    

    (好吧,我设法删除了空行,但现在它被格式化为代码。我想我需要一个“markdown”中的类。)

    1 回复  |  直到 2 年前
        1
  •  1
  •   ikegami Gilles Quénot    2 年前

    问题是 boff 分配给 $_[0]->[1] ,但你在打电话 boff 没有任何争论。

    $sub->()
    

    应该是

    $sub->( $self )