perl - 是否可以在 perl 中使用散列(不是 hashrefs)的散列?

标签 perl hash syntax multidimensional-array nested

在 perl 中,可以使用哈希,例如my %a = (2, "two");以及 hashrefs,例如my $b = {2 => "two"};
每当我创建一个多维散列时,顶级散列的值总是 hashrefs,即调用 ref()在他们身上返回 "HASH" .是否有可能只有散列的散列,而没有额外的间接级别?

此外,当处理散列的散列时,perl 允许在访问子散列的元素时省略取消引用运算符:

my %a;
$a{2} = {2 => "two"};

# the following are both valid:
$a{2}->{2}
$a{2}{2}

我认为第二个只是第一个的语法糖。然而,这似乎与简单的非嵌套 hashref 所需的语法不一致,如 $b->{2}有效而 $b{2}不是。

我问的原因是我想说
for my %hash (values %a) { 

甚至
for my %hash (map(%{$_}, values %a)) {

但这两者都会在编译时导致“循环变量上的 $ 丢失”错误。

最佳答案

一开始,只有标量、散列和数组。实际上,那是 Perl4,但是在设计 Perl5 时,绝对的向后兼容性是一个关键点。这意味着 $hash{entry} = @array将不得不继续将数组大小分配给该散列条目,而不是将数组放入散列中。所以集合只能包含标量。

这是需要引用的主要原因之一——散列引用和数组引用允许我们将集合作为单个标量引用。散列引用的语法需要与散列的语法不同。取消引用箭头 -> (从 C 中借来)可用于 hashref 访问:$hashref->{entry} .因为哈希永远不能直接包含一个集合,下标之间的解引用箭头对于哈希和哈希引用之间的消歧是不必要的,所以 $ref->{a}->{b}$ref->{a}{b}做同样的事。但是,hashref 访问不能使用 $ref{entry}因为该语法已经用于哈希访问,如 $name%name可以作为单独的变量同时存在。

简而言之,语法很难看,但出于向后兼容的原因。

目前,for my %hash (@hash_references)for my @array (@hash_references)据我所知是不允许的。我个人认为这种语法没有任何问题,但不可否认,隐式取消引用相当令人困惑。不得不使用 %$ref而不是 %hash真的没有那么糟糕。

顺便说一句,Perl6 摆脱了引用,因为除了向后兼容性之外,散列和散列引用之间的这种差异是完全没有必要的。集合变量的行为更像标量,尽管有像“项目上下文”这样的新上下文来帮助解决缺少引用的问题。

关于perl - 是否可以在 perl 中使用散列(不是 hashrefs)的散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23397932/

相关文章:

perl - gsutil cp : concurrent execution leads to local file corruption

ruby 如果散列键包含文本,则返回散列键

ruby - 我怎样才能避免在我的两个总和解决方案中使用相同的元素

MySQL FK 语法 : insert column called practice into table cred_insurances that is FK to table practices

php - 通过 HTML 表单插入数据的 SQL Near 错误

SQL - 字段值的条件?

perl - 如何检查 302 http 响应

regex - perl 正则表达式转义字符

perl - 为什么 Apache 会提示 CGI.pm 由于内存换行而在 4001 行发生了 panic ?

java - 哪种键/值对序列化格式最适合在 RDBMS 中进行索引?