파일 FILE1에는 _Pattern1 종료 패턴을 가진 수천 개의 행이 있습니다.perl : 패턴 일치를 기초로 한 문자열 추출
두 번째 파일에도 동일한 종료 패턴 _Pattern1을 가진 수천 개의 줄이 있습니다.
지금해야합니다
-
선이 문자열을 추출하고 변수에 저장할
_Pattern1
과 종료 문자열이있는 경우가 알아 라인으로
읽기 FILE1 라인
FILE2를 열고 라인별로 읽습니다.
단지 FILE2에서 읽은 라인이는 펄에서 수행되는 방법
위의 변수에 저장된 문자열을 포함하는 경우
는 알아?
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";
단계를 잘 설명했습니다. 펄에 익숙하지 않거나 언어에 관계없이 프로그래밍하고 있습니까? Perl을 처음 사용하는 사람이라면, 당신이 설명하는 거의 모든 것이 http://perldoc.perl.org/perlintro.html에 있습니다. 보여줄 코드가 있으면 우리는 까다로운 부분을 도울 수 있습니다. – DavidO
그 중 하나 이상의 방법이 있습니다. 여기에는'$ perl -ne'exec q; perl; "-ne", q $ print (/\Q$.$1.q;/? "$. YES. ": $. .q \; NO \;), m 인 경우"file2 ", (. *) _ pat1; ' file1' 몇 마디 빼기 트릭을해야합니다. 나는 이것이 컴파일되는지 모르지만, 나는 그것의 모양을 좋아한다. 'exec'를 루프 터미네이터로 사용하십시오. 그리고 나는 심지어 하나의 변수에 할당 할 필요가 없다 :-) 물론 더 쉬운 방법이있다 - [무엇을 시도 했습니까?] (http://whathaveyoutried.com) – amon
regexes를 사용할 때 우리는 * 캡처하려는 그룹을 괄호로 묶어 그룹 *을 캡처합니다. 그러면 정규식은'/ ($ MatchingPattern) /'처럼 보일 것입니다. 그룹의 내용은 다른 정규식 매치를 할 때까지 특별한 변수'$ 1'에있을 것입니다. [펄의 정규 표현식 튜토리얼] (http : //perldoc.perl.org/perlretut.html # 추출 - 일치)는 perl 정규식을 배울 때 유용 할 수 있습니다. – amon