我在这里有关于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, 1 );
my @a2 = ( 'a2', 2, 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;
Run Code Online (Sandbox Code Playgroud)
Dumper输出是
{
'1' => [
[
'a1',
1,
1,
1
],
[
'a2',
2,
2,
2
]
],
'2' => $VAR1->{'1'}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是:
为什么$ h {'2'}引用$ h {'1'}?我正在尝试使用由@a数组构成的相同键值创建哈希%h.我希望散列的每个键值都基于@a拥有它自己的AoA,但我得到的引用是$ h {'1'}.我究竟做错了什么??
我试图实现的Dumper输出是:
{
'1' => [
[
'a1',
1,
1,
1
],
[
'a2',
2,
2,
2
]
],
'2' => [
[
'a1',
1,
1,
1
],
[
'a2',
2,
2,
2
]
]
}
Run Code Online (Sandbox Code Playgroud)
任何帮助赞赏.提前致谢!
-担
这并不是$h{'2'}对 的引用$h{'1'},而是两者都是对同一个数组(即 )的引用@a。您可能想要的是:
for my $i ( 1 .. 2 ) {
$h{"$i"} = $a[$i - 1];
}
Run Code Online (Sandbox Code Playgroud)
这相当于:
$h{'1'} = $a[0]; # i.e., $a1_ref
$h{'2'} = $a[1]; # i.e., $a2_ref
Run Code Online (Sandbox Code Playgroud)
其中$h{'1'}引用了@a1并$h{'2'}引用了@a2.
顺便说一句,您可能会发现使用这些符号[ ... ]以及(分别){ ... }创建对匿名数组和哈希的引用很有帮助。由于除了 via and之外,您从不使用@a1and ,因此您不妨直接创建后者:@a2$a1_ref$a2_ref
my $a1_ref = [ 'a1', 1, 1, 1 ]; # reference to a new array (no name needed)
my $a2_ref = [ 'a2', 2, 2, 2 ]; # ditto
Run Code Online (Sandbox Code Playgroud)
编辑更新的问题:要复制数组,您可以编写:
my @orig = (1, 2, 3);
my @new = @orig;
Run Code Online (Sandbox Code Playgroud)
或者:
my $orig_ref = [1, 2, 3];
my $new_ref = [@$orig_ref]; # arrayref -> array -> list -> array -> arrayref
Run Code Online (Sandbox Code Playgroud)
在你的情况下,如果我理解正确,你需要执行一个稍微“深”的复制:你不只是想要两个具有相同元素的数组,你想要两个数组,其元素是对具有相同元素的不同数组的引用。没有内置的 Perl 方法可以做到这一点,但您可以编写一个循环,或使用该map函数:
my @orig = ([1, 2, 3], [4, 5, 6]);
my @new = map [@$_], @orig;
Run Code Online (Sandbox Code Playgroud)
所以:
for my $i ( 1 .. 2 ) {
$h{"$i"} = [map [@$_], @a];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |