我想从一个看似如下的文件中创建一个数组哈希:
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
键是数字还是字符串是否重要?
答案 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} } );
}