如何正确使用perl引用
发布时间:2020-12-16 06:29:18 所属栏目:大数据 来源:网络整理
导读:我在这里有一个关于refs的非常noob-ish问题,但至少仍然让我感到困惑…… 在下面的代码示例中,我正在尝试创建数组的哈希: #!/usr/bin/perluse strict;use warnings;use 5.010;use Data::Dumper;$Data::Dumper::Sortkeys = 1;$Data::Dumper::Terse = 1;$Data:
我在这里有一个关于refs的非常noob-ish问题,但至少仍然让我感到困惑……
在下面的代码示例中,我正在尝试创建数组的哈希: #!/usr/bin/perl use strict; use warnings; use 5.010; use Data::Dumper; $Data::Dumper::Sortkeys = 1; $Data::Dumper::Terse = 1; $Data::Dumper::Quotekeys = 0; my @a1 = ( 'a1',1,1 ); my @a2 = ( 'a2',2,2 ); my $a1_ref = @a1; my $a2_ref = @a2; my @a = ( $a1_ref,$a2_ref ); my %h = (); for my $i ( 1 .. 2 ) { $h{"$i"} = @a; } say Dumper %h; Dumper输出是 { '1' => [ [ 'a1',1 ],[ 'a2',2 ] ],'2' => $VAR1->{'1'} } 这里的问题是: { '1' => [ [ 'a1',1 ],[ 'a2',2 ] ],'2' => [ [ 'a1',2 ] ] } 任何帮助赞赏.提前致谢! 解决方法
并不是$h {‘2’}是对$h {‘1’}的引用,但两者都是对同一数组的引用,即@a.你可能想要的是:
for my $i ( 1 .. 2 ) { $h{"$i"} = $a[$i - 1]; } 这相当于: $h{'1'} = $a[0]; # i.e.,$a1_ref $h{'2'} = $a[1]; # i.e.,$a2_ref 这使得$h {‘1’}对@ a1的引用和$h {‘2’}对@ a2的引用. 顺便提一下,您可能会发现使用符号[…]和{…}来创建对匿名数组和散列(分别)的引用会很有帮助.由于除了通过$a1_ref和$a2_ref之外你永远不会使用@ a1和@ a2,你也可以直接创建后者: my $a1_ref = [ 'a1',1 ]; # reference to a new array (no name needed) my $a2_ref = [ 'a2',2 ]; # ditto 编辑更新的问题:要复制数组,您可以编写: my @orig = (1,3); my @new = @orig; 要么: my $orig_ref = [1,3]; my $new_ref = [@$orig_ref]; # arrayref -> array -> list -> array -> arrayref 在你的情况下,如果我理解正确,你需要执行一个稍微“深度”的副本:你不只是想要两个具有相同元素的数组,你想要两个数组,其元素是对具有相同元素的不同数组的引用.没有内置的Perl方法可以做到这一点,但你可以写一个循环,或使用map函数: my @orig = ([1,3],[4,5,6]); my @new = map [@$_],@orig; 所以: for my $i ( 1 .. 2 ) { $h{"$i"} = [map [@$_],@a]; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |