有没有人知道如何在perl中使用字符串对作为密钥进行哈希?
像...一样的东西。
{
($key1, $key2) => $value1;
($key1, $key3) => $value2;
($key2, $key3) => $value3;
等...
答案 0 :(得分:12)
您不能将一对标量作为散列键,但您可以制作多级散列:
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
答案 1 :(得分:2)
您可以使用invisible separator加入坐标:
主要针对数学,隐形分隔符(
U+2063
)在字符之间提供了一个分隔符,可以省略标点符号或空格,例如像ij
这样的二维索引。
#!/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.
答案 2 :(得分:1)
我这样做:
{ "$key1\x1F$key2" => $value, ... }
通常使用辅助方法:
sub getKey() {
return join( "\x1F", @_ );
}
{ getKey( $key1, $key2 ) => $value, ... }
-----编辑-----
更新了上面的代码,以便根据recommendation from @chepner above
使用ASCII单位分隔符答案 3 :(得分:1)
用法:哈希中单值的多个键可用于实现 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 :(得分:0)
在哈希键中隐式(或显式)使用$;,用于多维仿真,如下所示:
my %hash;
$hash{$key1, $key2} = $value; # or %hash = ( $key1.$;.$key2 => $value );
print $hash{$key1, $key2} # returns $value
你甚至可以设置$;如果需要,为\ x1F(默认为\ 034,来自awk中的SUBSEP):
local $; = "\x1F";