perl - 如何正确使用 perl 引用

标签 perl reference

我在这里有一个关于裁判的非常菜鸟的问题,尽管至少仍然让我感到困惑......
在下面的代码示例中,我正在尝试创建数组的散列:

#!/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;

倾销者的输出是
{
          '1' => [
                   [
                     'a1',
                     1,
                     1,
                     1
                   ],
                   [
                     'a2',
                     2,
                     2,
                     2
                   ]
                 ],
          '2' => $VAR1->{'1'}
        }

这里的问题是:
为什么 $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   
                   ]   
                 ]   
        }   

任何帮助表示赞赏。提前致谢!
-担

最佳答案

不是那个$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@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

编辑更新的问题:要复制数组,您可以编写:
my @orig = (1, 2, 3);
my @new = @orig;

或者:
my $orig_ref = [1, 2, 3];
my $new_ref = [@$orig_ref]; # arrayref -> array -> list -> array -> arrayref

在您的情况下,如果我理解正确,您需要执行稍微“深”的复制:您不仅需要具有相同元素的两个数组,还需要两个数组,其元素是对具有相同元素的不同数组的引用。没有内置的 Perl 方法可以做到这一点,但您可以编写一个循环,或使用 map功能:
my @orig = ([1, 2, 3], [4, 5, 6]);
my @new = map [@$_], @orig;

所以:
for my $i ( 1 .. 2 ) {
    $h{"$i"} = [map [@$_], @a];
}

关于perl - 如何正确使用 perl 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16378182/

相关文章:

reference - Rust 是否(通常)引用 Voldemort 类型?

c++ - 有什么办法可以帮助代码返回值是 const 引用吗?

reference - Rust 可变值与可变引用

perl - Marpa 解析器似乎无法处理可选的第一个符号?

arrays - Perl 如何将数组作为参数传递给另一个 Perl 脚本

python - 将多维数组从 perl 脚本传递到 python 脚本

C# 在数组中保存对字符串变量的引用

C++ 按值传递和按引用传递函数内的赋值之间有区别吗?

Perl - 找不到文件

perl - 运行时错误 "Can' t 修改非左值子例程”