gpt4 book ai didi

Perl 散列的散列原理

转载 作者:行者123 更新时间:2023-12-03 21:06:24 28 4
gpt4 key购买 nike

我决定尝试一下 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/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com