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

问题描述 投票:0回答:1

我在使用 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
perl subroutine lvalue
1个回答
2
投票

问题是

boff
分配给
$_[0]->[1]
,但您在不带任何参数的情况下调用
boff

$sub->()

应该是

$sub->( $self )
© www.soinside.com 2019 - 2024. All rights reserved.