我有两个数组:
@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";
}
哦,我转置了数组,以便它们将打印到一个 outfile 到单独的行中。