如何在Perl中定义匿名标量ref?

如何在Perl中定义匿名标量ref?,perl,reference,scalar,Perl,Reference,Scalar,如何在Perl中正确定义匿名标量ref my$scalar\u ref= my$array\u ref=[] my$hash_ref={}通常您只需声明而不初始化它 my $foo; # will be undef. 您必须考虑空散列引用和空数组参考点指向具有表示的数据结构。当取消引用时,它们都会给您一个空列表 说(强调我的): 实际上有两种类型的空字符串(有时称为“空”字符串),一种是已定义的字符串,另一种是未定义的字符串。定义的版本只是长度为零的字符串,例如“”。undefined ver

如何在Perl中正确定义匿名标量ref

my$scalar\u ref=

my$array\u ref=[]


my$hash_ref={}

通常您只需声明而不初始化它

my $foo; # will be undef.

您必须考虑空散列引用和空数组参考点指向具有表示的数据结构。当取消引用时,它们都会给您一个空列表

说(强调我的):

实际上有两种类型的空字符串(有时称为“空”字符串),一种是已定义的字符串,另一种是未定义的字符串。定义的版本只是长度为零的字符串,例如“”。undefined version是一个值,它指示某些内容没有实际值,例如当出现错误时,或在文件末尾,或当引用未初始化的变量或数组或哈希元素时。尽管在早期版本的Perl中,未定义的标量在第一次在需要定义值的地方使用时可能会被定义,但这种情况不再发生,除非perlref中解释过的罕见的自活情况。可以使用defined()运算符确定是否定义了标量值(这对数组或散列没有意义),并使用undef()运算符生成未定义的值

所以一个空标量(它实际上没有说)将是
undef
。如果你想让它成为一个参考,那就做一个吧

use strict;
use warnings;
use Data::Printer;

my $scalar_ref = \undef;
my $scalar = $$scalar_ref;

p $scalar_ref;
p $scalar;
这将输出:

\ undef
undef
但是,它将是只读的,因为它不是变量


无论如何,我的观点是,当取消引用时,一个空的hash ref和一个空的array ref都包含一个空列表
()
。这不是
undef
,而是一无所有。但并没有什么是标量值,因为一切不是零的东西都是标量值

my $a = [];

say ref $r;     # ARRAY
say scalar @$r; # 0
say "'@$r'";    # ''
因此,没有真正的方法来初始化。您只能不初始化。但是驼鹿无论如何都会把它变成
unde

你能做的就是让它成为标量参考

输出:

""

Foo  {
    Parents       Moose::Object
    public methods (3) : bar, has_bar, meta
    private methods (0)
    internals: {}
}
Use of uninitialized value in say at scratch.pl line 268.
谓词
给出的值不是真的(空字符串
“”
)<代码>未定义
也不是真的。制造麋鹿的人决定用它,但这真的没关系

您可能不希望有默认值,只需要将其设置为
ScalarRef
required



请注意,这也没有说明初始化空标量引用的任何内容。

我不完全确定您为什么需要这样做,但我建议:

my $ref = \undef;
print ref $ref;
或许:

my $ref = \0; 

如果您想引用某个可变存储,没有特别简洁的直接语法。你能做的最好的事情就是

my $var;
my $sref = \$var;
还是整洁

my $sref = \my $var;
或者,如果不希望变量本身在作用域中,可以使用do块:

my $sref = do { \my $tmp };
此时,您可以按值传递
$sref
,其他人将看到它引用的标量的任何变化

这种技术当然也适用于数组或散列引用,只是有更简洁的语法用于
[]
{}

my $aref = do { \my @tmp };  ## same as  my $aref = [];

my $href = do { \my %tmp };  ## same as  my $href = {};

@莱昂纳德的回答恰到好处。 另一个选项是使用临时匿名哈希值:

my $scalar_ref = \{_=>undef}->{_};
$$scalar_ref = "Hello!\n";
print $$scalar_ref;

它定义了一个空标量,我可以创建一个引用,但是我如何匿名定义它呢?为什么需要这样做?标量引用是标量。我正在创建一个
Moose
对象,它的属性类型为
ScalarRef
,我想为它定义一个默认值。@tjwrona1992如果你真的想这样做,并且需要定义它,一个合理的选项应该是
default=>sub{\(my$var)}
。严格来说,它不是匿名的,但是名字
$var
几乎一提到就不存在了。
default=>do{\my$var}
default=>sub{\my$var}
稍微便宜一点,您可以将它初始化为零:perl-E'$a=\0;一美元;假设$$a'因此
$a
现在是标量引用,引用的内容是标量0。请参阅我的更新版本。
my $scalar_ref = \{_=>undef}->{_};
$$scalar_ref = "Hello!\n";
print $$scalar_ref;