首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Perl中的引用数组

Perl中的引用数组
EN

Stack Overflow用户
提问于 2015-11-25 11:09:22
回答 1查看 323关注 0票数 0

我已经阅读了参考文档,但我不知道如何取消数组中的数组引用。不明白为什么@{$HoA{$cols[0]}}也只打印数组的长度。任何澄清都是非常感谢的。

file.txt

代码语言:javascript
运行
AI代码解释
复制
    aa      bb
    bb      cc

该方案:

代码语言:javascript
运行
AI代码解释
复制
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

# my $filename = "file.txt";
my @newarray;

my %HoA = (
        aa        => [ "GAT_1", "GAT_2", "GAT_3", "GAT_4" ],
        bb        => [ "GAT_6", "GAT_1", "GAT_5", "GAT_4", "GAT_2" ],
        cc        => [ "GAT_6", "GAT_4", "GAT_3", "GAT_1", "GAT_2" ],
      );

open (FILE, '<' ,"$filename") or print "$filename does not exist\n";


while (<FILE>) {
    my @cols = split;
    $cols[0] = $HoA{ $cols[0] };
    #$cols[0] = @{$HoA{ $cols[0]} };
    $cols[1] = $HoA{ $cols[1] };
    #$cols[1] = @{$HoA{ $cols[1] }};
    push ( @newarray, join( " ", @cols ));
}

close FILE;

print Dumper(\@newarray);

这是我的预期输出:

代码语言:javascript
运行
AI代码解释
复制
$VAR1 = [
          [
            [
              'GAT_1',
              'GAT_2',
              'GAT_3',
              'GAT_4'
            ],
            [
              'GAT_6',
              'GAT_1',
              'GAT_5',
              'GAT_4',
              'GAT_2'
            ],
        [
              'GAT_6',
              'GAT_1',
              'GAT_5',
              'GAT_4',
              'GAT_2'   
            ],
            [
              'GAT_6',
              'GAT_4',
              'GAT_3',
              'GAT_1',
              'GAT_2'
            ],

          ]
        ];

这是我的实际输出:

代码语言:javascript
运行
AI代码解释
复制
$VAR1 = [
          'ARRAY(0x7f80110060e8) ARRAY(0x7f801102eb58)',
          'ARRAY(0x7f801102eb58) ARRAY(0x7f801102f308)'
        ];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-25 12:15:01

最大的问题是这条线:

代码语言:javascript
运行
AI代码解释
复制
    push ( @newarray, join( " ", @cols ));

join本质上是一个字符串操作:@cols是一个引用数组,join然后忠实地对其进行串缩,以便能够将它们与" "连接起来。

你真正想要的可能是:

代码语言:javascript
运行
AI代码解释
复制
    push ( @newarray, [@cols] );

其中,[ ... ]符号创建一个新的匿名数组(在本例中使用@cols中的值填充)并返回对它的引用。

此外,与之相反的是:

代码语言:javascript
运行
AI代码解释
复制
    $cols[0] = $HoA{ $cols[0] };

(这会导致@newarray%HoA最终包含对相同基础数组的引用),您可能希望这样做:

代码语言:javascript
运行
AI代码解释
复制
    $cols[0] = [ @{$HoA{ $cols[0] }} ];

(这样,@newarray以完全独立的数组结束,这些数组从与%HoA中相同的数据开始)。这取决于以后是否打算修改任何数组。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33924605

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文