8

有谁知道如何用成对的字符串作为 perl 中的键来制作散列?

就像是...

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

ETC....

4

5 回答 5

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
于 2013-03-08T15:21:59.283 回答
2

您可以使用不可见的分隔符来加入坐标:

主要用于数学,不可见分隔符 ( 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。
于 2013-03-08T17:02:28.357 回答
1

我这样做:

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

通常使用辅助方法:

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

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

- - - 编辑 - - -

根据上面@chepner的建议,更新了上面的代码以使用 ASCII 单元分隔符

于 2013-03-08T15:20:40.177 回答
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);
}
于 2013-03-08T16:22:57.610 回答
1

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

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

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

local $; = "\x1F";
于 2013-03-09T04:50:14.467 回答