比较文件名的两个目录时,我需要通过每个名称中的子字符串比较名称。
有两个文件夹,我将这两个文件夹文件分成两个不同的数组。
这里的场景是文件名是相同的,除了时间戳,所以我必须从两个不同的文件夹/数组中的每个文件名中取出子字符串,并且只需要比较子字符串。我必须根据子字符串比较打印不匹配的文件名。
我尝试了以下代码,但显示了所有行。请帮我修改我的代码。谢谢。
E.G。文件名:
ARRAY1:
Statement.Inc.2017.1.2018-05-10-0349.Full.txt
Statement.Inc.2018.1.2018-05-10-0349.Full.txt
数组2:
Statement.Inc.2017.1.2018-05-15-0351.Full.txt
Statement.Inc.2018.1.2018-05-15-0351.Full.txt
代码
my $sdipath="/home/ec2-user/TRF_DATA/FinancialStatement/FINALSDI";
my $sparkpath="/home/ec2-user/TRF_DATA/FinancialStatement/FINALSPARK";
my @a=`ls $sdipath`;
my @b=`ls $sparkpath`;
my $flag;
foreach (my $i = 0; $i < @a; $i++)
{
my $file_sub1=substr("$a[$i]",0,-25);
for(my $j=0; $j<=@b;$j++)
{
$flag=0;
my $file_sub2=substr("$b[$j]",0,-25);
if ($file_sub1 eq $file_sub2)
{
#print"Hello";
#print"$file_sub1 $file_sub2\n";
$flag=1;
}
}
if($flag==0)
{
print "$a[$i]\n";
}
}
foreach (my $i = 0; $i < @b; $i++)
{
my $file_sub2=substr("$b[$i]",0,-25);
for(my $j=0; $j<=@a;$j++)
{
$flag=0;
my $file_sub1=substr("$a[$j]",0,-25);
if ($file_sub2 eq $file_sub1)
{
#print"Hello";
#print"$file_sub1 $file_sub2\n";
$flag=1;
}
}
if($flag==0)
{
print "$b[$i] is missing in SDI file\n";
}
}
答案 0 :(得分:1)
你让我感到困惑的是foreach
写的for
可能会打破它,但我们假设它现在像for
一样工作:
所以E.G.你期望你不会输出所有东西,但是你的样本输入似乎应该输出如下内容:
"Statement.Inc.2017.1" eq "Statement.Inc.2017.1"
时{p> $i=0 and $j=0
所以$flag=1
"Statement.Inc.2017.1" ne "Statement.Inc.2018.1"
时的$i=0 and $j=1
所以$flag=0
$flag==0
退出内循环将打印$a[$i]
"Statement.Inc.2018.1" ne "Statement.Inc.2017.1"
时的$i=1 and $j=0
所以$flag=0
"Statement.Inc.2018.1" eq "Statement.Inc.2018.1"
时的$i=1 and $j=1
所以$flag=1
$flag==1
退出内循环将不会打印
给出输出:
Statement.Inc.2017.1.2018-05-10-0349.Full.txt
然后你交换foreach循环相同的条件适用但输出更改为:
Statement.Inc.2017.1.2018-05-15-0351.Full.txt is missing in SDI file
因为你似乎没有完全解释所有比较所需要的东西......我不知道如何“修复”。但你应该。
就像你在substr
函数中引用的内容没有意义一样,以及你可能想要在外循环而不是内循环中将$flag
设置为0
。然后你可能还使用了if(!$flag)
。
my @a=`ls /home/ec2-user/TRF_DATA/FinancialStatement/FINALSDI`;
my @b=`ls /home/ec2-user/TRF_DATA/FinancialStatement/FINALSPARK`;
# Either you wanted:
my @pairs = map{ my $x = $_; map { [$x, $_] } @b } @a;
foreach (@pairs) {
my ($f1, $f2) = @$_;
chomp $f1;
chomp $f2;
if (substr($f1, 0, -25) eq substr($f2, 0, -25)) {
print "$f1 is like $f2\n";
} else {
print "$f1 is not like $f2\n";
}
}
# Or maybe you wanted:
foreach my $f1 (@a) {
chomp $f1;
my $f=1;
foreach my $f2 (@b) {
chomp $f2;
if (substr($f1, 0, -25) eq substr($f2, 0, -25)) {
$f=0;
break;
}
}
print "$f1\n" if $f;
}
foreach my $f2 (@b) {
chomp $f2;
my $f=1;
foreach my $f1 (@a) {
chomp $f1;
if (substr($f1, 0, -25) eq substr($f2, 0, -25)) {
$f=0;
break;
}
}
print "$f2 is missing in SDI file\n" if $f;
}