Наличие текстового файла, такого как следующий, который называется "input.txt"
some field1a | field1b | field1c
...another approx 1000 lines....
fielaNa | field Nb | field Nc
Я могу выбрать любой разделитель поля.
Нужна script, что при каждом дискретном прогоне будет получать одну уникальную (никогда повторяющуюся) случайную строку из этого файла, пока не будет использоваться все строки.
Мое решение: я добавил один столбец в файл, поэтому
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;
Это рабочее решение, но не очень приятное, потому что:
- порядок строк меняется при каждом запуске script
- не параллельный script -run safe.
Как написать это более эффективно и элегантно?