-3

ファイル FILE1 には、終了パターン _Pattern1 を持つ数千の行があります。

2 番目のファイルにも、同じ終了パターン _Pattern1 を持つ数千行が含まれています。

私は今しなければなりません:

  • FILE1 を 1 行ずつ読み取る

  • 行に _Pattern1 で終わる文字列があるかどうかを調べる

  • 文字列を抽出して変数に格納する

  • FILE2 を開き、1 行ずつ読み取る

  • FILE2 から読み取ったばかりの行に、上記の変数に格納されている文字列が含まれているかどうかを調べます

これは perl でどのように行うのですか?

EDIT2:

わかりました、少しグーグルして、以下にリストされているリンクを参照して、問題を解決しました。これがコードスニペットです。

#!/usr/bin/perl
use strict;
use warnings;

my $OriginalHeader=$ARGV[0]; ## Source file
my $GeneratedHeader=$ARGV[1];## File to compare against
my $DeltaHeader=$ARGV[2];    ## File to store misses

my $MatchingPattern="_Pos";
my $FoundPattern;

open FILE1, $OriginalHeader or die $!;
open FILE2, $GeneratedHeader or die $!;
open (FILE3, ">$DeltaHeader") or die $!;

my $lineFromOriginalHeader;
my $lineFromGeneratedHeader;
my $TotalMacrosExamined = 0;
my $TotalMacrosMissed = 0;

while($lineFromOriginalHeader=<FILE1>)
{
 if($lineFromOriginalHeader =~ /$MatchingPattern/)
  {
    my $index = index($lineFromOriginalHeader,$MatchingPattern);

    my $BackIndex = $index;
    my $BackIndexStart = $index;

    $BackIndex = $BackIndex - 1;

    ## Use this while loop to extract the substring. 
    while (1)
    {
      my $ExtractedChar = substr($lineFromOriginalHeader,$BackIndex,1);
      if ($ExtractedChar =~ / /)
      {
        $FoundPattern = substr($lineFromOriginalHeader,$BackIndex + 1,$BackIndexStart + 3 - 
                                                                                $BackIndex); 
        print "Identified $FoundPattern \n";
        $TotalMacrosExamined = $TotalMacrosExamined + 1;
        ##Skip the next line
        $lineFromOriginalHeader = <FILE1>;
        last;       
      }
     else
     {
      $BackIndex = $BackIndex - 1;
     }

   } ##while(1)

 ## We now look for $FoundPattern in FILE2
 while ($lineFromGeneratedHeader = <FILE2>)
 {
  if (index($lineFromGeneratedHeader,$FoundPattern)!= -1)
   {
     ##Pattern found. Reset file pointer and break out of while loop
     seek FILE2,0,0;
     last;
   }
   else
   {
     if (eof(FILE2) == 1)
      {         
        print FILE3 "Generated header misses $FoundPattern\n";
        $TotalMacrosMissed = $TotalMacrosMissed + 1;
        seek FILE2,0,0; 
        last;       
      }
   }
} ##while(1)

}
else
{
  ##NOP
}
} ##while (linefromoriginalheader)

close FILE1;
close FILE2;
close FILE3;
print "Total number of bitfields examined = $TotalMacrosExamined\n";
print "Number of macros obsolete = $TotalMacrosMissed\n";
4

2 に答える 2

0

コードをより Perly にする最初のカットです。$some_var実際には、Perl で通常使用されているものと比べて、もっと多くのことができますが$SomeVar、そこまでは行きませんでした。

#!/usr/bin/perl
use strict;
use warnings;

my ($OriginalHeader, $GeneratedHeader, $DeltaHeader) = @ARGV;
my $MatchingPattern=qr/(\S*_Pos)/; # all non-whitespace terminated by _Pos

open my $file1, '<', $OriginalHeader  or die $!;
open my $file2, '<', $GeneratedHeader or die $!;
open my $file3, '>', $DeltaHeader     or die $!;

my $TotalMacrosExamined = 0;
my $TotalMacrosMissed = 0;

while(my $lineFromOriginalHeader=<$file1>) {
  next unless $lineFromOriginalHeader =~ $MatchingPattern;
  my $FoundPattern = $1; # matched string

  print "Identified $FoundPattern \n";
  $TotalMacrosExamined++;

  ##Skip the next line
  <$file1>;

  ## We now look for $FoundPattern in FILE2
  my $match_found = 0;
  while (my $lineFromGeneratedHeader = <$file2>) {
    if (index($lineFromGeneratedHeader,$FoundPattern)!= -1) {
      ##Pattern found. Close the file and break out of while loop
      $match_found++;
      last;
    } 
  }

  unless ($match_found) {
    print $file3 "Generated header misses $FoundPattern\n";
    $TotalMacrosMissed++;
  }

  seek $file2,0,0;

}

print "Total number of bitfields examined = $TotalMacrosExamined\n";
print "Number of macros obsolete = $TotalMacrosMissed\n";
于 2012-08-17T20:45:14.743 に答える
0

私は一生 C でプログラミングしてきたので、以下の perl コンストラクトの使用法をググって、C のようなプログラムを書きました。これは私にとって完璧に機能します。:-)

編集:これは、以下のアルゴで行をスキップする必要がある理由を明確にするためです。取得され、後で 2 番目のファイルで検索されるパターンは、2 つの連続する行で発生します。したがって、その最初の発生が確実に検出されれば十分です。また、ちょっとしたことですが、パターンを含む部分文字列が常に行の 2 番目の部分文字列であることが常に保証されます。

例 #define Something_Pos (ある値)

#!/usr/bin/perl
use strict;
use warnings;

my $OriginalHeader=$ARGV[0];
my $GeneratedHeader=$ARGV[1];
my $DeltaHeader=$ARGV[2];

my $MatchingPattern="_Pos";
my $FoundPattern;

open FILE1, $OriginalHeader or die $!;
open FILE2, $GeneratedHeader or die $!;
open (FILE3, ">$DeltaHeader") or die $!;

my $lineFromOriginalHeader;
my $lineFromGeneratedHeader;
my $TotalMacrosExamined = 0;
my $TotalMacrosMissed = 0;

while($lineFromOriginalHeader=<FILE1>)
{
 if($lineFromOriginalHeader =~ /$MatchingPattern/)
 {
  my $index = index($lineFromOriginalHeader,$MatchingPattern);

  my $BackIndex = $index;
  my $BackIndexStart = $index;

  $BackIndex = $BackIndex - 1;

  ## Use this while loop to extract the substring. 
  while (1)
  {
   my $ExtractedChar = substr($lineFromOriginalHeader,$BackIndex,1);
   if ($ExtractedChar =~ / /)
    {
     $FoundPattern = substr($lineFromOriginalHeader,$BackIndex + 1,$BackIndexStart + 3 - 
                                                                                $BackIndex); 
     print "Identified $FoundPattern \n";
     $TotalMacrosExamined = $TotalMacrosExamined + 1;
     ##Skip the next line
     $lineFromOriginalHeader = <FILE1>;
     last;       
    }
   else
    {
     $BackIndex = $BackIndex - 1;
    }

} ##while(1)

 ## We now look for $FoundPattern in FILE2
while ($lineFromGeneratedHeader = <FILE2>)
{
 ##print "Read the following line from FILE2: $lineFromGeneratedHeader\n";

  if (index($lineFromGeneratedHeader,$FoundPattern)!= -1)
   {
     ##Pattern found. Close the file and break out of while loop
     seek FILE2,0,0;
     last;
   }
   else
   {
     if (eof(FILE2) == 1)
      {         
        print FILE3 "Generated header misses $FoundPattern\n";
        $TotalMacrosMissed = $TotalMacrosMissed + 1;
        seek FILE2,0,0; 
        last;       
      }
   }
 } ##while(1)

}
else
{

}
} ##while (linefromoriginalheader)

close FILE1;
close FILE2;
close FILE3;
print "Total number of bitfields examined = $TotalMacrosExamined\n";
print "Number of macros obsolete = $TotalMacrosMissed\n";
于 2012-08-17T20:03:48.483 に答える