Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将哈希值绑定到迭代数组的元素_Arrays_Perl_Reference - Fatal编程技术网

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";
}

这两种解释都很棒。非常感谢。