作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我决定尝试一下 Perl,我偶然发现了一种似乎有效的语言结构,但我简直不敢相信。因为我想这背后有一些理由,所以我决定问一个问题。
使用以下 Perl 代码:
%data = ('John Paul' => ('Age' => 45), 'Lisa' => 30);
print "\$data{'John Paul'} = $data{'John Paul'}{'Age'}\n";
print "\$data{'Lisa'} = $data{'Lisa'}\n";
我的目的是检查散列的散列是如何工作的。上面的代码打印:
$data{'John Paul'} =
$data{'Lisa'} =
要使其成为有效的哈希值,需要:
%data = ('John Paul' => {'Age' => 45}, 'Lisa' => 30);
结果将是:
$data{'John Paul'} = 45
$data{'Lisa'} = 30
有人知道吗:
{}
而不是 ()
? ()
时,我没有收到错误或错误警告而不是 {}
对于内部哈希?很容易犯这样的错误。更何况,('Age' => 45)
不仅破坏了 'John Paul'
的值也适用于 'Lisa'
.我无法想象在数千行代码的项目中搜索这种“错误”。 最佳答案
( 'John Paul' => ( 'Age' => 45 ), 'Lisa' => 30 )
只是另一种写作方式
'John Paul', 'Age', 45, 'Lisa', 30
Parens 不创建任何数据结构;它们只是影响优先级,如
(3+4)*5
.我们不写的原因
my %h = a => 4;
或等价物
my %h = 'a', 4;
是它会被解释为
( my %h = 'a' ), 4;
创建哈希的是
my %data
,不是括号。赋值的右侧只是在堆栈上放置了任意数量的标量,而不是散列。赋值运算符将这些标量添加到哈希中。
{}
进来。
my %data = ( 'John Paul' => { 'Age' => 45 }, 'Lisa' => 30 );
基本上相当于
my %anon = ( 'Age' => 45 );
my %data = ( 'John Paul' => \%anon, 'Lisa' => 30 );
请注意
\%anon
返回一个标量,一个对散列的引用。这与
( 'John Paul' => \%anon, 'Lisa' => 30 )
根本不同和
'John Paul' => \%anon, 'Lisa' => 30
返回,四个标量。
Why there is non uniformity and the internal hash needs
{}
instead of()
?
()
.例如,以下是完全有效的:
my %h1 = 'm'..'p';
sub f { return x => 4, y => 5 }
my %h2 = f();
my %h3 = do { i => 6, j => 7 };
()
与哈希无关。缺乏统一性源于缺乏平行性。一用
{}
创建一个哈希。一用
()
覆盖优先级。
my %data = ( 'John Paul' => ({ 'Age' => 45 }), 'Lisa' => 30 ); # ok (but weird)
这与以下内容非常不同:
my %data = ( 'John Paul' => ( 'Age' => 45 ), 'Lisa' => 30 ); # XXX
Why do I get no error or warning that something is wrong when there is () instead of {} for the internal hash?
()
有效,使用
()
通常需要包含逗号的周围表达式。那么它到底应该在什么时候发出警告呢?关键是这是否应该是警告或其他内容是有争议的
perlcritic
发现,至少乍一看。后者肯定会找到这个,但我不知道它是否存在规则。
关于Perl 散列的散列原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66561258/
我是一名优秀的程序员,十分优秀!