首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >散列的Perl散列

散列的Perl散列
EN

Stack Overflow用户
提问于 2021-03-10 08:48:04
回答 2查看 112关注 0票数 4

我决定尝试一下Perl,我偶然发现了一种看似有效的语言结构,但我无法相信它是有效的。由于我想这背后有一些理由,我决定问一个问题。

使用下面的Perl代码:

代码语言:javascript
复制
%data = ('John Paul' => ('Age' => 45), 'Lisa' => 30);
print "\$data{'John Paul'} = $data{'John Paul'}{'Age'}\n";
print "\$data{'Lisa'} = $data{'Lisa'}\n";

我的目的是检查散列是如何工作的。以上代码打印:

代码语言:javascript
复制
$data{'John Paul'} =
$data{'Lisa'} =

要使它成为一个有效的散列哈希,您需要:

代码语言:javascript
复制
%data = ('John Paul' => {'Age' => 45}, 'Lisa' => 30);

其结果将是:

代码语言:javascript
复制
$data{'John Paul'} = 45
$data{'Lisa'} = 30

有没有人知道:

为什么存在不均匀性,内部散列需要()

  • Why而不是,当内部哈希有()而不是{}时,我没有收到错误或警告吗?犯这样的错误是很容易的。而且,('Age' => 45)不仅破坏了'John Paul'的值,而且破坏了'Lisa'的值。我无法想象在有数千行代码的项目中搜索这样的“bug”。
EN

回答 2

Stack Overflow用户

发布于 2021-03-10 10:43:21

代码语言:javascript
复制
( 'John Paul' => ( 'Age' => 45 ), 'Lisa' => 30 )

只是另一种写作方式

代码语言:javascript
复制
'John Paul', 'Age', 45, 'Lisa', 30

Parens不会创建任何数据结构;它们只会影响优先级,就像在(3+4)*5中一样。我们不写信的原因

代码语言:javascript
复制
my %h = a => 4;

或等量

代码语言:javascript
复制
my %h = 'a', 4;

它会被解释为

代码语言:javascript
复制
( my %h = 'a' ), 4;

创建散列的是my %data,而不是父类。分配的右边只是在堆栈上放置任意数量的标量,而不是散列。赋值运算符将这些标量添加到散列中。

但有时,我们想要创建一个匿名散列。这就是{}进来的地方。

代码语言:javascript
复制
my %data = ( 'John Paul' => { 'Age' => 45 }, 'Lisa' => 30 );

基本上相当于

代码语言:javascript
复制
my %anon = ( 'Age' => 45 );
my %data = ( 'John Paul' => \%anon, 'Lisa' => 30 );

注意,\%anon返回一个标量,一个对散列的引用。这从根本上不同于( 'John Paul' => \%anon, 'Lisa' => 30 )'John Paul' => \%anon, 'Lisa' => 30返回的四个标量。

为什么存在不均匀性,内部散列需要{}而不是()__?

这个问题的一个基本前提是错误的:散列不需要()。例如,以下内容完全有效:

代码语言:javascript
复制
my %h1 = 'm'..'p';
代码语言:javascript
复制
sub f { return x => 4, y => 5 }
my %h2 = f();
代码语言:javascript
复制
my %h3 = do { i => 6, j => 7 };

()与散列无关。缺乏统一性来自于缺乏平行。一种是使用{}来创建哈希。一种是使用()覆盖优先级。

因为父母只会影响优先级,所以我们可以使用

代码语言:javascript
复制
my %data = ( 'John Paul' => ({ 'Age' => 45 }), 'Lisa' => 30 );  # ok (but weird)

这与以下各点有很大不同:

代码语言:javascript
复制
my %data = ( 'John Paul' => ( 'Age' => 45 ), 'Lisa' => 30 );  # XXX

为什么当存在()而不是内部哈希的{}时,没有错误或警告是错误的?

不仅使用()有效,还需要在包含逗号的表达式周围使用()。那么它应该在什么时候发出警告呢?问题是,至少乍一看,这应该是一个警告还是perlcritic发现的东西,这是一个值得商榷的问题。后者肯定会发现这一点,但我不知道是否存在关于它的规则。

票数 4
EN

Stack Overflow用户

发布于 2021-03-10 08:56:14

为什么存在非均匀性,内部哈希需要{}而不是()?

对散列的赋值是标量列表(键和值之间的交替)。

不能将散列(因为它不是标量)作为值,但可以有散列引用。

列表会变平。

为什么当存在()而不是内部哈希的{}时,没有错误或警告是错误的?

因为您没有在the use strict; use warnings; pragmas中打开它们(在默认情况下,这是出于可怕的向后兼容性的原因而关闭的,但它将是on by default in Perl 7)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66561258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档