任何人都可以向我解释这个只读的例外情况吗?

Axe*_*man 5 perl readonly

下面是我的代码(不要担心模块顶部有USUW)

我正在测试数组引用是否是只读的,如果是这种情况,那么我将它复制到另一个数组引用.测试显示该数组不是只读的,但是当它运行时,它会因该错误而失败.(对于那些你不熟悉的我或Smart::Comments--those ###Smart::Comments.)

### readonly( $arg_ref ) : readonly( $arg_ref )
### readonly( @$arg_ref ) : readonly( @$arg_ref )
my @ro = map { readonly( $_ ) } @$arg_ref;
### @ro
if ( readonly $arg_ref ) {
    $arg_ref = [ @$arg_ref ];
}
return map { my $val = shift @$arg_ref;
             $_ => $val 
            } @_ 
            ;
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

### readonly( $arg_ref ) : 0
### readonly( @$arg_ref ) : 0

### @ro: [
###        0,
###        0,
###        0,
###        0,
###        0
###      ]
Run Code Online (Sandbox Code Playgroud)

但这是错误:

Modification of a read-only value attempted at ....pm line 247.
Run Code Online (Sandbox Code Playgroud)

(247是:

return map { my $val = shift @$arg_ref;
Run Code Online (Sandbox Code Playgroud)

)

有没有人对这个问题有所了解?我们正在运行Perl 5.8.7.有关如何解决它的任何想法?

Eth*_*her 0

它看起来不像Scalar::Util::readonly的结果可以被信任地按照您想要的方式使用。证人:

perl -MScalar::Util=readonly -MReadonly -wle'
    Readonly my $arg_ref => [ qw(a b c)];
    print readonly $arg_ref;
    $arg_ref = 1;'
Run Code Online (Sandbox Code Playgroud)

印刷:

0
 Modification of a read-only value attempted at -e line 1.
Run Code Online (Sandbox Code Playgroud)

(在 perl5.8.8 下测试,Readonly 1.03,Scalar::Util 1.23)