【问题标题】:Problems printing an array in Perl [duplicate]在 Perl 中打印数组时出现问题 [重复]
【发布时间】:2014-10-28 22:17:26
【问题描述】:

我有以下 perl 代码:

use strict;
use warnings;

my %hash;

open FILE, $ARGV[0];
while (my $line = <FILE>) {
    if ($line =~ /gene_type "protein_coding";/) {
        $line =~ /gene_id "([A-Za-z0-9.]*)"/;
        my $genename = $1;
        my @chomp = split(/\t/, $line);
        my @coordinates = ($chomp[3], $chomp[4]);
        if (!defined $hash{$genename}) {
            push @{$hash{$genename}}, [@coordinates];
            next;
        }
        for my $coord (@{$hash{$genename}}) {
            print $coord."\n";
        }
    }
}

此代码创建一个包含数组的哈希。不过,我无法打印数组。它给出了以下错误:

Use of uninitialized value $coord[0] in concatenation (.) or string at untitled.pl line 16, <FILE> line 17813.
Use of uninitialized value $coord[0] in concatenation (.) or string at untitled.pl line 16, <FILE> line 17814.
Use of uninitialized value $coord[0] in concatenation (.) or string at untitled.pl line 16, <FILE> line 17815.
Use of uninitialized value $coord[0] in concatenation (.) or string at untitled.pl line 16, <FILE> line 17816.
Use of uninitialized value $coord[0] in concatenation (.) or string at untitled.pl line 16, <FILE> line 17817.

只打印$coord,没有[0],它会给出以下内容:

ARRAY(0xac5b18)
ARRAY(0xac5b18)
ARRAY(0xac5b18)
ARRAY(0xac5b18)

我的输入文件是:

chr1    HAVANA  exon    972861  973010  .   +   .   gene_id "ENSG00000187583.7"; transcript_id "ENST00000379407.4"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "PLEKHN1"; transcript_type "protein_coding"; transcript_status "KNOWN"; transcript_name "PLEKHN1-004"; exon_number 11; exon_id "ENSE00001386720.1"; level 2; protein_id "ENSP00000368717.2"; tag "basic"; tag "appris_candidate"; tag "CCDS"; ccdsid "CCDS53256.1"; havana_gene "OTTHUMG00000040756.4"; havana_transcript "OTTHUMT00000473255.1";
chr1    HAVANA  CDS 972861  973010  .   +   0   gene_id "ENSG00000187583.7"; transcript_id "ENST00000379407.4"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "PLEKHN1"; transcript_type "protein_coding"; transcript_status "KNOWN"; transcript_name "PLEKHN1-004"; exon_number 11; exon_id "ENSE00001386720.1"; level 2; protein_id "ENSP00000368717.2"; tag "basic"; tag "appris_candidate"; tag "CCDS"; ccdsid "CCDS53256.1"; havana_gene "OTTHUMG00000040756.4"; havana_transcript "OTTHUMT00000473255.1";
chr1    HAVANA  exon    973500  973640  .   +   .   gene_id "ENSG00000187583.7"; transcript_id "ENST00000379407.4"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "PLEKHN1"; transcript_type "protein_coding"; transcript_status "KNOWN"; transcript_name "PLEKHN1-004"; exon_number 12; exon_id "ENSE00001371278.1"; level 2; protein_id "ENSP00000368717.2"; tag "basic"; tag "appris_candidate"; tag "CCDS"; ccdsid "CCDS53256.1"; havana_gene "OTTHUMG00000040756.4"; havana_transcript "OTTHUMT00000473255.1";
chr1    HAVANA  CDS 973500  973640  .   +   0   gene_id "ENSG00000187583.7"; transcript_id "ENST00000379407.4"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "PLEKHN1"; transcript_type "protein_coding"; transcript_status "KNOWN"; transcript_name "PLEKHN1-004"; exon_number 12; exon_id "ENSE00001371278.1"; level 2; protein_id "ENSP00000368717.2"; tag "basic"; tag "appris_candidate"; tag "CCDS"; ccdsid "CCDS53256.1"; havana_gene "OTTHUMG00000040756.4"; havana_transcript "OTTHUMT00000473255.1";

为什么会这样?

【问题讨论】:

    标签: arrays perl hash printing


    【解决方案1】:

    $coord 是对数组的引用。使用arrow operator 取消引用:

    print $coord->[0], "\n";
    

    perlreftut 中的更多信息。

    【讨论】:

      【解决方案2】:

      $coord 是一个数组引用。取消引用它以获取实际的数组:

      print "@$coord\n";
      

      另外,在存储数组时,您将词法数组@coordinates 复制到匿名数组。这不是必需的,您可以直接存储对数组的引用,因为在循环的每次迭代中都会创建一个新的:

      push @{ $hash{$genename} }, \@coordinates;
      

      【讨论】:

        猜你喜欢
        • 2022-11-18
        • 2021-01-22
        • 2022-11-26
        • 2011-09-02
        • 2019-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-16
        相关资源
        最近更新 更多