「input.txt」と呼ばれる次のようなテキスト ファイルを持つ
some field1a | field1b | field1c
...another approx 1000 lines....
fielaNa | field Nb | field Nc
任意のフィールド区切り文字を選択できます。
スクリプトが必要です。すべての行が使用されるまで、個別の実行ごとに、このファイルから一意の (繰り返されない) ランダムな行が 1 つ取得されます。
私の解決策:ファイルに1列追加したので、
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;
これは実用的なソリューションですが、次の理由から、あまり良いものではありません。
- スクリプトを実行するたびに行の順序が変わる
- 同時スクリプト実行セーフではありません。
より効果的かつエレガントに書く方法は?