比较两个不同数组

时间:2018-05-18 05:13:05

标签: perl

比较文件名的两个目录时,我需要通过每个名称中的子字符串比较名称。

有两个文件夹,我将这两个文件夹文件分成两个不同的数组。

这里的场景是文件名是相同的,除了时间戳,所以我必须从两个不同的文件夹/数组中的每个文件名中取出子字符串,并且只需要比较子字符串。我必须根据子字符串比较打印不匹配的文件名。

我尝试了以下代码,但显示了所有行。请帮我修改我的代码。谢谢。

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";
}

}

1 个答案:

答案 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;
}