如何随机配对列表中的项目

时间:2015-04-02 13:06:50

标签: perl random shuffle

我有一个入藏号码列表,我希望使用下面的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

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;