gpt4 book ai didi

perl - 如何传递定义为常量的数组的引用?

转载 作者:行者123 更新时间:2023-12-05 02:30:40 26 4
gpt4 key购买 nike

我定义了哈希和数组常量,将它们传递给函数时,我必须将它们作为引用传递。但是我想知道正确的语法是什么。

考虑这个例子:

#!/usr/bin/perl
use strict;
use warnings;

use constant AC => qw(a b c);

sub f($)
{
print "ref=", ref $_[0], "\n";
print "$_\n" foreach (@{$_[0]});
}

f(\AC);

当我运行它时,我得到:

ref=SCALAR
Use of uninitialized value $_ in concatenation (.) or string at /run/media/whatever/constref.pl line 10.

Perl 调试器将 AC 作为数组打印:

13: f(\AC);
DB<1> x AC
0 'a'
1 'b'
2 'c'
DB<2> c

最佳答案

List Constants constant pragma 部分文档告诉我们

Constants may be lists of more (or less) than one value.
...
List constants are lists, not arrays.

这意味着,在其他属性中,一个人不能引用那个“列表常量”,就好像它是一个单一的实体,就像一个数组变量一样;它表现为一个列表,一组标量。

为了完成所要求的,我们需要从该列表中构建一个(匿名)数组引用并传递它,f([AC])

use warnings;
use strict;
use feature 'say';

use constant AC => qw(a b c);

sub f {
my ($r) = @_;
say "ref=", ref $r;
say for @$r;
}

f( [ AC ] );

这会将“列表常量”作为单个值、数组引用传递,并按预期打印。但是,我不喜欢必须复制值,也不喜欢进一步失去任何表面上的恒定性。还有其他方法可以做到这一点,但我更不喜欢这些。 §

我建议重新考虑在需要适当的只读变量时使用的工具。

还有其他库,我推荐 Const::Fast , 或 Readonly .

use Const::Fast;    
const my @const_ary => qw(a b c);
f( \@const_ary ); # same f() from above

use Readonly;
Readonly my @carr => qw(a b c);
f( \@carr ); # same f() from above

这些是可以像处理任何其他变量一样处理的词法变量。请参阅文档。


尝试正式“引用”列表会导致引用列表

\($v, $t)  -->  \$v, \$t

虽然 AC 本身是一个常量,但它与 isn't read-only 关联的列表

use constant AC => qw(a b c);

(AC)[1] = "other";

say for AC;

打印

a
other
c

它们只是不稳定。


§我可以看到另外两种方式

  • constant pragma produces (is implemented as) a subroutine .然后一个人可以使用它并像这样传递它,f(\&AC),然后像这样使用它,比如 $r->().

    但是,现在我们必须传递并取消引用该列表符号 (AC) 的子例程,并获取列表。这是一个非常糟糕的黑客攻击。

  • 问题中的代码使用“常量列表”。可以改用引用,并且可以这样传递

    use constant AC => [ qw(a b c) ];

    # same sub f { } as above

    f( AC ); # prints as expected

    但是,除了将其复制到首先是一个 arrayref,就像在 f() 中一样。但这违背了将其作为 常量 的目的——以及所有 pretense to constant-ness被丢弃。

关于perl - 如何传递定义为常量的数组的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71782294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com