Nie mogę uniknąć linii komentarza (linie zaczynające się od *) do analizowania podczas wymiany ciągu w pliku. Proszę, pomóż mi z moim kodem.
`perl -pi.bak -e "$_ =~/[#.*]*/; /s/PATTERN/REPLACEMENT STRING/g" Test.txt`;
Używam Perla w Eclipse, Windows XP.
Otrzymuję następujący komunikat o błędzie:
Number found where operator expected at -e line 6, near "* LAST UPDATED 09/15"
(Might be a runaway multi-line // string starting on line 1)
(Missing operator before 15?)
Bareword found where operator expected at -e line 6, near "1994 AT"
(Missing operator before AT?)
Z góry dziękuję, Początkujący w Perlu
Odpowiedzi:
0 dla odpowiedzi № 1posługiwać się next
aby pominąć następujący kod, jeśli pasujesz do komentarza:
perl -i.back -p -e"next if /^#/; s/PATTERN/REPLACEMENT STRING/" Test.txt
aktualizacja: teraz jak sugerowała choroba, zamiast odpalać osobną instancję Perla i mieć do czynienia z cudzysłowami, prawdopodobnie należy mieć całość w kodzie głównym:
my $file= "Test.txt";
my $bak= "$file.bak";
rename $file, $bak or die "cannot rename $file into $bak: $!";;
open( my $in, "<", $bak) or die "cannot open $bak: $!";
open( my $out, ">", $file) or die "cannot create $file: $!";
while( <$in>)
{ if( ! /^*/) # note the backslash here, * is a meta character
{ s/PERFORM Q$func[5]E[.]*/# PERFORM $func[5].n $hash{$func[5]}/g; }
print {$out} $_;
}
close $in;
close $out;
Zauważ, że $func[5]
może (potencjalnie) zawierać metaznaki, więc użyłem Q
i E
uciec przed nimi.
Nie jestem pewien co do [.]*
część, która zgodnie z zapisem pasuje do nawiasu kwadratowego, kropki i 0 lub więcej zamykających nawiasów kwadratowych: [.
, [.]
, lub [.]]
. Podejrzewam, że nie tego chcesz.
2 dla odpowiedzi nr 2
Powinieneś dokonać zamiany tylko wtedy, gdy ciąg nie pasuje:
perl -pi.bak -e "s/PATTERN/REPLACEMENT STRING/g unless /^#/" Test.txt
Wygląda na to, że próbujesz wywołać Perla z Perla. Jest to zwykle wolniejsze niż przetwarzanie pliku z poziomu oryginalnego programu.
1 dla odpowiedzi nr 3
Używam tego, aby pominąć wiersze pasujące do wyrażenia regularnego
perl -ne "print unless /^*/" filename
0 dla odpowiedzi nr 4
Spróbuj tego, jeśli próbujesz pominąć wiersze zaczynające się od „*” jako komentarze:
perl -pi.bak -e "s/PATTERN/REPLACEMENT STRING/g unless /^*/" Test.txt
Podczas przetwarzania takiego pliku:
* this is a comments: AAA => BBB
AAA
AAB
ABB
BBB
biegać
perl -pi.bak -e "s/AAA/BBB/g unless /^*/" Test.txt
dostaniesz
* this is a comments: AAA => BBB
BBB
AAB
ABB
BBB
Tylko AAA w normalnym kontekście zostanie zastąpiony.