我定義了哈希和陣列常量,當將它們傳遞給函式時,我必須將它們作為參考傳遞。但是我想知道正確的語法是什么。
考慮這個例子:
#!/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
uj5u.com熱心網友回復:
constant pragma檔案中的List Constants部分告訴我們
常量可以是多于(或少于)一個值的串列。
...
串列常量是串列,而不是陣列。
這意味著,除其他屬性外,不能像參考單個物體、陣列(變數)一樣參考該“串列常量”;它表現為一個串列。?
為了完成所要求的,我們需要從該串列中構建一個(匿名)陣列參考并傳遞它,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本身是一個常量,但與之關聯的串列不是只讀的
use constant AC => qw(a b c);
(AC)[1] = "other";
say for AC;
印刷
a
other
c
他們只是不是恒定的。
§ 我可以看到另外兩種方式
常量 pragma 產生(實作為)子例程。然后可以使用它并按原樣傳遞它,
f(\&AC)然后按原樣使用它,say for $r->()。但是,現在我們必須從該串列符號 (
AC) 中傳遞和取消參考一個子例程,并獲得一個串列。這是一個非常糟糕的黑客攻擊。問題中的代碼使用“常量串列”。可以改用參考,并且可以這樣傳遞
use constant AC => [ qw(a b c) ]; # same sub f { } as above f( AC ); # prints as expected但是,除了首先將其復制到 arrayref 之外,我看不到如何取消參考
AC以獲取整個串列(@{ AC }不去?),例如 inf()。但這違背了將其作為一個目標的目的constant——所有對恒定性的偽裝都被放棄了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464667.html
下一篇:為什么“每個參考的引數型別必須是test.pl第17行的unblessedhashref或arrayref。”?
