我有一个入藏号码列表,我希望使用下面的Perl脚本随机配对:
#!/usr/bin/perl -w
use List::Util qw(shuffle);
my $file = 'randomseq_acc.txt';
my @identifiers = map { (split /\n/)[1] } <$file>;
chomp @identifiers;
#Shuffle them and put in a hash
@identifiers = shuffle @identifiers;
my %pairs = (@identifiers);
#print the pairs
for (keys %pairs) {
print "$_ and $pairs{$_} are partners\n";
但不断收到错误。
文件randomseq_acc.txt
中的入藏号是:
1094711
1586007
2XFX_C
Q27031.2
P22497.2
Q9TVU5.1
Q4N4N8.1
P28547.2
P15711.1
AAC46910.1
AAA98602.1
AAA98601.1
AAA98600.1
EAN33235.2
EAN34465.1
EAN34464.1
EAN34463.1
EAN34462.1
EAN34461.1
EAN34460.1
答案 0 :(得分:2)
我需要添加右侧右大括号才能编译脚本。
当数组从0开始索引时,(split /\n/)[1]
返回第二个字段,即每行上的换行符后面的内容(即什么都没有)。将其更改为[0]
以使其正常工作:
my @identifiers = map { (split /\n/)[0] } <$file>; # Still wrong.
菱形运算符需要文件句柄,而不是文件名。使用open
将两者关联起来:
open my $FH, '<', $file or die $!;
my @identifiers = map { (split /\n/)[0] } <$FH>;
使用split
删除换行符并不常见。我可能会用别的东西:
map { /(.*)/ } <$FH>
# or
map { chomp; $_ } <$FH>
# or, thanks to ikegami
chomp(my @identifiers = <$FH>);
因此,最终结果如下:
#!/usr/bin/perl
use warnings;
use strict;
use List::Util qw(shuffle);
my $filename = '...';
open my $FH, '<', $filename or die $!;
chomp(my @identifiers = <$FH>);
my %pairs = shuffle(@identifiers);
print "$_ and $pairs{$_} are partners\n" for keys %pairs;