私は2つの配列を持っています:
@file_list
ディレクトリ内のファイルのリストを保持し、@name_list
いくつかの名前を保持しています。
たとえば、これらの配列には以下を含めることができます
@file_list = ('Bob_car', 'Bob_house', 'Bob_work', 'Fred_car', 'Fred_house', 'Fred_work', ...);
@name_list = ('Bob', 'Fred', ...);
(実際のデータはそれほど単純ではありません)。
私の目標は、各ファイルをすべての名前と比較して、それらが一致するかどうかを確認することです。ファイル文字列が名前で始まる場合、それらは一致します。
次に、これらの一致を使用して、対応する名前に基づいてファイルを新しいディレクトリに並べ替えることができます。
これが私のコードです:
for ( my $i = 0; $i < scalar @file_list ; $i++ )
{
for ( my $j = 0; $j < @name_list ; $j++ )
{
if ( $file_list[ $i ] =~ m/^$name_list[ $j ]/ )
{
print "$file_list[ $i ] goes with $name_list[ $j ]\n";
}
else
{
print "no match\n";
}
}
}
しかし、私は一致を取得しません。個々のループをテストしましたが、動作しています。そうでなければ、正規表現に何か問題がありますか?
配列の作成方法について:
の場合@name_list
、名前を含むファイルは一見ランダムな方法で編成されています。そのファイルの名前はいくつかの異なる行にあり、その間に多くの空白行があり、行内に多くの空白エントリがあります。名前は複数回表示できます。
次のコードを使用して作成しました@name_list
:
while (my $line = <$OriginalFILE>)
{
chomp $line;
my @current_line = split( "\t", $line );
for ( my $i = 0; $i < scalar @current_line ; $i ++ )
{
if ( $current_line[ $i ] =~ m/^\s*$/ )
{
# print "$current_line[$i] is blank\n";
}
else
{
push( @raw_name_list, $current_line[ $i ] );
}
} # end of for
} # while
# collect list without repeat instances of the same name
my %unique = ();
foreach my $name (@raw_name_list)
{
$unique{$name} ++;
}
my @name_list = keys %unique;
foreach my $name ( @name_list )
{
# print "$name\n";
chomp $name;
unless(mkdir $name, 0700)
{
die "Unable to create directory called $name\n";
}
}
配列@file_list
は以下を使用して作成されました。
opendir(DIR, $ARGV[1]);
my @file_list = grep ! /^\./, readdir DIR;
closedir(DIR);
# print @file_list;
@amon、ループと正規表現をテストするために私がしたことは次のとおりです。
FILE: for my $file (@transposed_files) {
print "$file\n";
for my $name (@transposedunique) {
print "i see this $name\n";
if ($file =~ /^\Q$name\E/) {
print "$file goes with $name\n";
next FILE;
}
}
#print "no match for $file\n";
}
ああ、配列を転置して、出力ファイルに別々の行に出力するようにしました。