我决定尝试一下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'的值。我无法想象在有数千行代码的项目中搜索这样的“bug”。发布于 2021-03-10 10:43:21
( 'John Paul' => ( 'Age' => 45 ), 'Lisa' => 30 )只是另一种写作方式
'John Paul', 'Age', 45, 'Lisa', 30Parens不会创建任何数据结构;它们只会影响优先级,就像在(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返回的四个标量。
为什么存在不均匀性,内部散列需要
{}而不是()__?
这个问题的一个基本前提是错误的:散列不需要()。例如,以下内容完全有效:
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为什么当存在()而不是内部哈希的{}时,没有错误或警告是错误的?
不仅使用()有效,还需要在包含逗号的表达式周围使用()。那么它应该在什么时候发出警告呢?问题是,至少乍一看,这应该是一个警告还是perlcritic发现的东西,这是一个值得商榷的问题。后者肯定会发现这一点,但我不知道是否存在关于它的规则。
发布于 2021-03-10 08:56:14
为什么存在非均匀性,内部哈希需要{}而不是()?
对散列的赋值是标量列表(键和值之间的交替)。
不能将散列(因为它不是标量)作为值,但可以有散列引用。
列表会变平。
为什么当存在()而不是内部哈希的{}时,没有错误或警告是错误的?
因为您没有在the use strict; use warnings; pragmas中打开它们(在默认情况下,这是出于可怕的向后兼容性的原因而关闭的,但它将是on by default in Perl 7)。
https://stackoverflow.com/questions/66561258
复制相似问题