Arrays 将哈希值绑定到迭代数组的元素
在Arrays 将哈希值绑定到迭代数组的元素,arrays,perl,reference,Arrays,Perl,Reference,在perldbi中,可以将哈希元素值绑定到查询结果的特定列。 这样, 获取每一行时,哈希元素值将更新为当前行 我试图找出是否有一种方法可以在core perl中实现这一点, 使用(数组的数组)的散列 最终目标是能够运行以下内容: my $i; my @a = ( [1,2,3], [4,5,6], [7,8,9] ); my %superhash{'first', 'second', 'third'} = (\$i[0], \$i[1], \$i[2]); for $i (@a) {
perldbi
中,可以将哈希元素值绑定到查询结果的特定列。这样,
获取每一行时,哈希元素值将更新为当前行 我试图找出是否有一种方法可以在core perl中实现这一点,
使用(数组的数组)的散列 最终目标是能够运行以下内容:
my $i;
my @a = (
[1,2,3],
[4,5,6],
[7,8,9]
);
my %superhash{'first', 'second', 'third'} = (\$i[0], \$i[1], \$i[2]);
for $i (@a) {
print ${$hash{'first'}} . "\n";
}
我希望能够将$hash{'first'}
指向arrayref
中的第一个元素,而不必事先指向数组
预期产出:
1
4
7
当然,该代码不起作用,因为没有
$i
引用的元素,因此它们是未定义的。您可以通过绑定
来构思一些东西,也就是说,可以使这样的代码起作用:
for my $i (@a) {
tie %hash, 'FirstSecondThird', $i;
print $hash{first}, "\n";
}
神奇之处在于包的定义FirstSecondThird
(注意,这不是优化的):
收益率:
4
10
16
接口是Perl制作神奇变量的方法。在这种情况下,由于for
循环分配给其循环变量的方式,需要引入一点glob魔力
my @a = (
[1,2,3],
[4,5,6],
[7,8,9]
);
{package Tie::Rows;
my %keys = qw(first 0 second 1 third 2);
sub TIEHASH {bless [$_[1]]} # store glob reference
sub FETCH {$${$_[0][0]}[$keys{$_[1]}]} # deref glob as array, lookup key
}
tie my %hash, 'Tie::Rows', *i; # passing the glob here
for our $i (@a) { # since the for loop aliases at that level
print $hash{first} . "\n";
}
哪张照片
1
4
7
2
5
8
您还可以利用动态范围来解决此问题:
sub first () {$$_[0]} # each of these uses the array in $_
sub second () {$$_[1]}
sub third () {$$_[2]}
for (@a) { # for loop puts each array into $_
print second, $/;
}
哪张照片
1
4
7
2
5
8
除非您的数据很大,否则最好将每一行复制到一个散列中,如下所示
for my $i (@a) {
my %data;
@data{qw/first second third/} = @$i;
print $data{first}, "\n";
}
这两种解释都很棒。非常感谢。