Получение уникальной случайной строки (при каждом запуске скрипта )из текстового файла с perl

Наличие текстового файла, похожего на следующий, с именем «input.txt»

some field1a | field1b | field1c
...another approx 1000 lines....
fielaNa | field Nb | field Nc

Я могу выбрать любой разделитель полей.

Нужен скрипт, который при каждом дискретном запуске будет получать одну уникальную (никогда не повторяющуюся )случайную строку из этого файла, пока не будут использованы все строки.

Мое решение :Я добавил один столбец в файл, так что

0|some field1a | field1b | field1c
...another approx 1000 lines....
0|fielaNa | field Nb | field Nc

и обработав его следующим кодом:

use 5.014;
use warnings;
use utf8;
use List::Util;
use open qw(:std :utf8);
my $file = "./input.txt";

#read all lines into array and shuffle them
open(my $fh, "<:utf8", $file);
my @lines = List::Util::shuffle map { chomp $_; $_ } <$fh>;
close $fh;

#search for the 1st line what has 0 at the start
#change the 0 to 1
#and rewrite the whole file

my $random_line;
for(my $i=0; $i<=$#lines; $i++) {
    if( $lines[$i] =~ /^0/ ) {
        $random_line = $lines[$i];
        $lines[$i] =~ s/^0/1/;
        open($fh, ">:utf8", $file);
        print $fh join("\n", @lines);
        close $fh;
        last;
    }
}
$random_line = "1|NO|more|lines" unless( $random_line =~ /\w/ );

do_something_with_the_fields(split /\|/, $random_line))
exit;

Это рабочее решение, но не очень хорошее, потому что:

  • порядок строк меняется при каждом запуске скрипта
  • не параллельный скрипт -работает безопасно.

Как написать это эффектнее и элегантнее?

12
задан novacik 23 July 2012 в 12:11
поделиться