代码之家  ›  专栏  ›  技术社区  ›  con

Perl6中的多维哈希元素

  •  7
  • con  · 技术社区  · 6 年前

    我尝试在Perl6中分配散列变量,就像在Perl中那样。当我正在读取一个文件时,我接受了某些元素并将其分配给散列,因此:

    %key<$barcode><$position> = $sample-id
    

    在Perl5中,这应该是

    $key{$barcode}{$position} = $sample_id
    

    这样做之后,我可以打印散列赋值,所以我认为赋值是有效的。

    当我用

    say %key.perl;
    

    这只给予

    {"\$barcode" => ${"\$position" => "ZZ12345"}}
    

    我怎样才能像perl5那样打印出这个多维哈希 Data::Dumper DDP https://metacpan.org/pod/Data::Printer 因为 say %key.perl 似乎不适用于多维哈希吗?

    2 回复  |  直到 6 年前
        1
  •  9
  •   Scimon Proctor    6 年前

    <> 是一样的 {''} 在Perl5中,所以只能用于字符串键。如果要使用变量名,请使用:

    %key{$barcode}{$position} = $sample_id 这样就可以了。

    您还可以使用双尖括号选项来进行字符串插值。

    %key<<$barcode>><<$position>> = $sample_id

        2
  •  1
  •   Brad Gilbert    6 年前

    你误解了Perl_6语言。 (这是可以理解的,不是第一次)

    下面是您试图使用的功能的一节简短历史课。


    在Perl_5中,如果在 {} 是一个赤裸裸的词。

    use v5.12;
    
    my %hash;
    $hash{fubar} = 'abc';
    # $hash{'fubar'} = 'abc';
    
    say qq'"@{[ $hash{fubar} ]}"';
    # "abc"
    

    这是一个特殊的案例,Perl_6设计的目标之一是尽可能少地使用特殊的案例。因此以下内容在Perl_6中不起作用。

    use v6.d;
    
    my %hash;
    %hash{fubar} = 'abc';
    # %hash{ fubar() } = 'abc';
    
    say qq'"%hash{fubar}"';
    # say qq'"%hash{ fubar() }"';
    
    ===SORRY!=== Error while compiling ./test.p6
    Undeclared routine:
        fubar used at lines 4, 7
    

    这个错误意味着它甚至无法编译。


    在两种Perl语言中都有一个用于引用单词的特性。

    use v5;
    my @array = qw< a b c d >;
    
    use v6;
    my @array = qw< a b c d >;
    

    在Perl_6中,可以缩短为

    use v6;
    my @array =   < a b c d >;
    

    qw 是非常短的 Q :q :w / Q :single :words 在珀尔第6。它支持单引号行为,并支持拆分为单词。(在空白处拆分)
    ( <> 因为中缀运算符 < 此处不应出现。)

    以弥补 {} 它没有被复制过来,后循环修复 <> 加入。它结合了 量子阱 {} 特征。

    use v6;
    my %hash;
    
    %hash{qw< foo bar baz >};
    %hash{  < foo bar baz >};
    %hash<    foo bar baz >;  # <---
    

    Perl_6中还有一个更高级的QuoteWords功能

    use v6;
    my $a = 'a b "c d"';
    
    say qqww<< $a e f 'g h ' '$a'>>.perl;
    say     << $a e f 'g h ' '$a'>>.perl;
    say     «  $a e f 'g h ' '$a' ».perl;
    # All 3 are exactly equivalent
    # ("a", "b", "c d", "e", "f", "g h ", "\$a")
    

    qqww 是短的 Q :qq :ww / Q :double :quotewords . 这是启用双引号行为和启用引号分词。

    这个 :double 是什么使插值 $a .
    :quotewords 在空格中拆分单词,但也允许引号控制拆分的位置。
    (注意 夸夸其谈 最后发生)

    ( qqw qww 也可以,但是没有缩短的方法来编写它们。)

    还有一个后循环修复 <<>> / «» .

    use v6;
    my %hash;
    my $a = 'a b "c d "';
    
    %hash{<< $a e f 'g h ' '$a' >>};
    %hash<<  $a e f 'g h ' '$a' >>;
    %hash«   $a e f 'g h ' '$a'  »;
    
    # All 3 are exactly equivalent to
    %hash{'a', 'b', 'c d ', 'e', 'f', 'g h ', '$a'};
    #               ^^^^^^            ^^^^^^
    

    这样做是为了 <> 不是什么特殊情况。


    很多例子使用的原因 %hash<fubar> 它是惯用的perl_6。
    也许应该把它看作是文档中一个更高级的特性,并减少了使用量,因为到目前为止,您还不是第一个犯这种错误的人。