【问题标题】:Perl: Constant value in hash-keyPerl:哈希键中的常量值
【发布时间】:2023-04-08 05:41:01
【问题描述】:

我有点惊讶。如果我为散列键使用常量,Perl 不会使用该值。我需要在它前面加上 & 才能做到这一点。

use constant A => "a";
use constant B => "b";

my %h = (A => "1", &B => "2");

print "\n". A . ", " . B;
foreach (sort (keys (%h)))
{
    print "\n"  . $_ . "=" . $h {$_};
}

输出:

a, b
A=1
b=2

但我希望(第二行不同)。

a, b
a=1
b=2

当使用常量作为哈希键时,没有 & 的任何方法?

感谢您的帮助!

【问题讨论】:

    标签: perl hash constants


    【解决方案1】:

    它记录在 CAVEATS 下的 constant 中。

    常用的方式是使用()

    my %h = (A => "1", B() => "2");
    

    或切换到“非字符串化的胖逗号”(或简单的逗号):

    my %h = (A => "1", B ,=> "2");
    

    使用& 不会内联常量,您可以使用B::Deparse 进行验证:

    $ perl -MO=Deparse ~/1.pl
    sub B () { 'b' }
    use constant ('A', 'a');
    use constant ('B', 'b');
    my(%h) = ('A', '1', &B, '2');
    print "\na, b";
    foreach $_ (sort keys %h) {
        print "\n" . $_ . '=' . $h{$_};
    }
    /home/choroba/1.pl syntax OK
    

    【讨论】:

    • 我使用(B)(编译为"b")而不是B()(编译为较慢的子调用,并且需要知道常量即使不是子调用也可以用作子调用)。
    • @ikegami:Deparse 显示 B() 以与 (B) 相同的方式编译为“b”。不过,简洁显示了一个小的差异:s*/FOLDsP*/FOLD,我不明白。简洁显示没有差异。
    • 嗯,好的。尽管如此,仍需要将常量视为子项,这很糟糕,并且需要内部知识。
    • 这是记录在案的解决方法,但我更喜欢你的解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多