【问题标题】:Pairs as hash keys对作为哈希键
【发布时间】:2013-02-24 04:35:31
【问题描述】:

有谁知道如何在 perl 中使用成对的字符串作为键来创建哈希?

类似...

{
    ($key1, $key2) => $value1;
    ($key1, $key3) => $value2;
    ($key2, $key3) => $value3;

等等……

【问题讨论】:

标签: perl list hash


【解决方案1】:

我这样做:

{ "$key1\x1F$key2" => $value, ... }

通常使用辅助方法:

sub getKey() {
    return join( "\x1F", @_ );
}

{ getKey( $key1, $key2 ) => $value, ... }

-- 编辑 -----

根据recommendation from @chepner above更新了上面的代码以使用ASCII单位分隔符

【讨论】:

  • 或者你可以设置$;到 "\x1F" 并使用 $hash{$key1,$key2} = $value 或 { "$key1$;$key2" => $value}
  • @MkV,一定要喜欢 perl... 有很多方法可以做任何事情 :)
【解决方案2】:

你不能有一对标量作为哈希键,但你可以做一个多级哈希:

my %hash;
$hash{$key1}{$key2} = $value1;
$hash{$key1}{$key3} = $value2;
$hash{$key2}{$key3} = $value3;

如果你想一次定义它:

my %hash = ( $key1 => { $key2 => $value1, $key3 => $value2 },
             $key2 => { $key3 => $value3 } );

或者,如果它适合您的情况,您可以将您的密钥连接在一起

$hash{$key1 . $key2} = $value1;   # etc

或者添加分隔符来分隔键:

$hash{"$key1:$key2"} = $value1;   # etc

【讨论】:

  • 你的第一个建议很好,至于第二个,最好有一个分隔符来防止像 123 456 和 12 3456 这样的冲突......
  • 为此目的定义了 ASCII 字符;单位分隔符(十六进制 1f)可能是最合适的。
【解决方案3】:

用法:散列中单个值的多个可用于实现2D矩阵N维矩阵

#!/usr/bin/perl -w
use warnings;
use strict;
use Data::Dumper;

my %hash = ();

my ($a, $b, $c) = (2,3,4);
$hash{"$a, $b ,$c"} = 1;
$hash{"$b, $c ,$a"} = 1;

foreach(keys(%hash) )
{
    my @a = split(/,/, $_);
    print Dumper(@a);
}

【讨论】:

    【解决方案4】:

    您可以使用invisible separator 加入坐标:

    主要用于数学,不可见分隔符 (U+2063) 提供字符之间的分隔符,其中可以省略标点符号或空格,例如在i⁣j 等二维索引中。

    #!/usr/bin/env perl
    
    use utf8;
    use v5.12;
    use strict;
    use warnings;
    use warnings qw(FATAL utf8);
    use open qw(:std :utf8);
    use charnames qw(:full :short);
    
    use YAML;
    
    my %sparse_matrix = (
        mk_key(34,56) => -1,
        mk_key(1200,11) => 1,
    );
    
    print Dump \%sparse_matrix;
    
    sub mk_key { join("\N{INVISIBLE SEPARATOR}", @_) }
    
    sub mk_vec { map [split "\N{INVISIBLE SEPARATOR}"], @_ }
    
    ~/tmp> perl mm.pl |xxd
    0000000: 2d2d 2d0a 3132 3030 e281 a331 313a 2031 ---.1200...11: 1
    0000010:0a33 34e2 81a3 3536 3a20 2d31 0a .34...56:-1。

    【讨论】:

      【解决方案5】:

      在哈希键中隐式(或显式)使用$;,用于多维仿真,如下所示:

      my %hash;
      $hash{$key1, $key2} = $value; # or %hash = ( $key1.$;.$key2 => $value );
      print $hash{$key1, $key2} # returns $value
      

      你甚至可以设置 $;如果需要,转至 \x1F(默认为 \034,来自 awk 中的 SUBSEP):

      local $; = "\x1F";
      

      【讨论】:

        猜你喜欢
        • 2011-03-29
        • 2011-07-01
        • 2016-11-30
        • 2016-01-28
        • 1970-01-01
        • 2013-11-18
        • 2011-12-03
        • 2015-09-21
        • 2021-07-19
        相关资源
        最近更新 更多