参数“*”在数组元素中不是数字

时间:2015-04-27 23:08:17

标签: perl

我想从一个看似如下的文件中创建一个数组哈希:

xx500173:56QWER  45   A    rtt34  34C
...

我想拥有一个独特的“密钥”(例如column1_column2)

#!/usr/bin/perl
use warnings;
use strict;


my $seq;
while(<>){
chomp;
my @line = split(/\s+/, $_);

my $key = $line[0] . "_" . $line[1]; #try to make a unique key for each entry

map { $seq->{ $_->[$key] } = [@$_[0..4]] } [ split/\s+/ ];
}

foreach my $s (keys %{$seq} ) {
print $s,": ",join( "\t", @{ $seq->{$s}} ) . "\n";
}

但是我收到以下错误:

Argument "xx500173:56QWER_45" isn't numeric in array element

键是数字还是字符串是否重要?

2 个答案:

答案 0 :(得分:1)

数组[]的索引应为数字,但$key不是数字。假设您希望所有以空格分隔的标记作为数组的元素:

use warnings;
use strict;

my $seq;
while (<DATA>) {
    chomp;
    my @line = split;
    my $key = $line[0] . "_" . $line[1]; #try to make a unique key for each entry
    $seq->{$key} = [ @line ];
}

foreach my $s ( keys %{$seq} ) {
    print $s, ": ", join( "\t", @{ $seq->{$s} } ) . "\n";
}

__DATA__
xx500173:56QWER  45   A    rtt34  34C

输出:

xx500173:56QWER_45: xx500173:56QWER     45      A       rtt34   34C

答案 1 :(得分:1)

你对这条线感到困惑

map { $seq->{ $_->[$key] } = [@$_[0..4]] } [ split/\s+/ ];

这是错误的,因为

  • map是一个操作符,用于通过对输入列表的每个元素执行相同的操作将一个列表转换为另一个列表,但是忽略了返回的值

  • 输入列表只有一个项目 - [ split/\s+/ ]

  • 返回的数组引用

您所写的内容与

相同
$_ = [ split /\s+/ ];
$seq->{ $_->[$key] } = [ @$_[0..4] ];

问题是$_->[$key]尝试使用字符串$key索引匿名数组,这显然是错误的。

这里所需要的只是

$seq->{$key} = [ @line[0..4] ];

并且您的完整程序应如下所示

#!/usr/bin/perl

use strict;
use warnings;

my $seq;

while ( <> ) {
  chomp;
  my @line = split;

  $seq->{"$line[0]_$line[1]"} = [ @line[0..4] ];
}

for my $s ( keys %{$seq} ) {
  printf "%s: %s\n", $s, join("\t", @{ $seq->{$s} } );
}