在下面的代码示例中,我正在尝试创建数组的哈希:
#!/usr/bin/perluse 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'} }
这里的问题是:
为什么$h {‘2’}引用$h {‘1’}?我正在尝试使用由@a数组构成的相同键值创建哈希%h.我希望散列的每个键值都基于@a拥有它自己的AoA,但我得到的引用是$h {‘1’}.我究竟做错了什么??
我试图实现的Dumper输出是:
{ '1' => [ [ 'a1',1 ],[ 'a2',2 ] ],'2' => [ [ 'a1',2 ] ] }
任何帮助赞赏.提前致谢!
-担
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];}@H_502_84@ 总结
以上是内存溢出为你收集整理的如何正确使用perl引用全部内容,希望文章能够帮你解决如何正确使用perl引用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)