Có ai biết cách tạo băm với các cặp chuỗi đóng vai trò như các khóa trong perl không?Cặp làm khóa băm
Cái gì đó như ...
{
($key1, $key2) => $value1;
($key1, $key3) => $value2;
($key2, $key3) => $value3;
vv ....
Có ai biết cách tạo băm với các cặp chuỗi đóng vai trò như các khóa trong perl không?Cặp làm khóa băm
Cái gì đó như ...
{
($key1, $key2) => $value1;
($key1, $key3) => $value2;
($key2, $key3) => $value3;
vv ....
Bạn không thể có một cặp vô hướng như một chìa khóa băm, nhưng bạn có thể làm cho một đa cấp băm:
my %hash;
$hash{$key1}{$key2} = $value1;
$hash{$key1}{$key3} = $value2;
$hash{$key2}{$key3} = $value3;
Nếu bạn muốn xác định nó tất cả cùng một lúc:
my %hash = ($key1 => { $key2 => $value1, $key3 => $value2 },
$key2 => { $key3 => $value3 });
Ngoài ra, nếu nó hoạt động cho tình hình của bạn, bạn chỉ có thể nối chìa khóa của bạn s cùng
$hash{$key1 . $key2} = $value1; # etc
Hoặc thêm một dấu phân cách để tách các phím:
$hash{"$key1:$key2"} = $value1; # etc
Tôi làm điều này:
{ "$key1\x1F$key2" => $value, ... }
Thông thường với một phương pháp helper:
sub getKey() {
return join("\x1F", @_);
}
{ getKey($key1, $key2) => $value, ... }
--- - EDIT -----
Cập nhật mã trên để sử dụng Separator ASCII Unit theo recommendation from @chepner above
Cách sử dụng: Nhiều phím của một giá trị duy nhất trong một băm có thể được sử dụng để thực hiện một 2D ma trận hoặc Ma trận không gian!
#!/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);
}
Bạn có thể sử dụng một invisible separator tham gia tọa độ:
Chủ yếu cho toán học, Đấng Vô Hình Separator (
U+2063
) cung cấp một tách giữa các nhân vật mà chấm câu hoặc không gian có thể được bỏ qua như trong một hai chỉ số ba chiều như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.
Sử dụng $; ngầm (hoặc rõ ràng) trong phím băm của bạn, sử dụng cho thi đua đa chiều, như vậy:
my %hash;
$hash{$key1, $key2} = $value; # or %hash = ($key1.$;.$key2 => $value);
print $hash{$key1, $key2} # returns $value
Bạn thậm chí có thể đặt $; tới \ x1F nếu cần (mặc định là \ 034, từ SUBSEP trong awk):
local $; = "\x1F";
Related: [Hash :: MultiKey] (http://p3rl.org/Hash::MultiKey) [Tie :: RefHash] (http://p3rl.org/Tie::RefHash) [Có thể Perl lưu trữ một tham chiếu mảng dưới dạng khóa băm không?] (Http: // stackoverflow.com/questions/3083433/can-perl-store-an-array-tham chiếu-as-a-băm-khóa) [Cách sử dụng 'tham chiếu chương trình con' làm khóa băm] (http://stackoverflow.com/questions/10795386/how-to-use-a-subroutine-reference-as-a-băm-key) – daxim