Perl 散列的散列原理

标签 perl hashtable

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

    相关文章:

    perl - 这个 perl 包装函数可以扩展到任何输入函数吗?

    perl - Perl 中的取消引用哈希列表

    perl - 为什么 psql 在此用户定义的函数中向主机名添加 '+' 符号

    c# - 为什么在个人类(class)上使用字典时不需要重写 GetHashCode?

    python - 高效算法perl或python

    regex - 正则表达式中的 perl 正则表达式

    python - tf.lookup.StaticHashTable 以列表(任意大小)作为值

    c - "Bad permissions for mapped region at address"哈希表的 Valgrind 错误

    java - 我可以将对象构造函数存储到数组或哈希表中吗?

    java - 比较存储在哈希表java中的对