2017-03-12 1 views
-2

Ich bin Zeichenfolge eine Zeichenfolge ersetzen mit "/" Perl, unter Codeeine Zeichenfolge ersetzen vorwärts enthalten Strich "/" in Perl

datei.txt enthält

/usr/open/xyz -getCh $svr 

Code

open(FILE, "</tmp/file.txt") || die "File not found"; 
my @lines = <FILE>; 
close(FILE); 
my $stringToReplace = "\/usr\/open\/xyz -getCh \$svr"; 
my $stringToReplaceWith = "echo \"y\" | \/usr\/open\/xyz -getCh \$svr"; 
my @newlines; 
foreach(@lines) { 
    $_ =~ s/$stringToReplace/$stringToReplaceWith/g; 
    push(@newlines,$_); 
} 

open(FILE, ">/tmp/file.txt") || die "File not found"; 
print FILE @newlines; 
close(FILE); 

Der obige Code funktioniert nicht für mich.

+0

Geck. Sie können ein beliebiges Zeichen verwenden, um die Umrandungen der Regexp zu markieren. Da Sie keine Informationen darüber geben, wie es "nicht funktioniert", nehme ich an, dass Sie Probleme haben, weil Sie "/" verwenden, um die Regexp zu markieren. verwenden Sie stattdessen diese Zeile zum Beispiel: $ _ = ~ s {$ stringToReplace} {$ stringToReplaceWith} g; –

+4

Das hat nichts mit Schrägstrichen zu tun. Das Problem ist (wahrscheinlich), dass '$' in einer Regex nach dem Ende der Zeichenkette sucht, nicht nach einem literalen Dollarzeichen. Aber "der Code funktioniert nicht" ist keine Problembeschreibung, und Sie haben anscheinend keine Mühe darauf verwendet, das Problem selbst aufzuspüren (Ihr Code ist bei weitem nicht minimal). – melpomene

+1

Starten Sie jede Perl-Datei mit 'use strict; Verwenden Sie Warnungen; '. – melpomene

Antwort

3

einige Noten auf dem Code

  • immeruse strict und use warnings 'all' an der Spitze jedes Perl-Programm Sie

  • Verwenden lexikalische Dateihandles und die Drei-Parameter Form von open

  • schreiben
  • Ein Aufruf open kann aus vielen Gründen fehlschlagen, außer dass die Datei nicht gefunden werden kann. Die Fehlermeldung ist in $! und Sie sollten es in Ihrem die String

  • Mit einfachen Anführungszeichen enthalten beseitigt die Notwendigkeit für die meisten Schrägstriche in Stringliterale. Schrägstriche müssen nicht innerhalb eithern einfache oder doppelte Anführungszeichen

  • Sie sollten use constant definieren konstante Werte maskiert werden, vor allem, wenn Sie mehr als einmal

  • nutzen die Tatsache, dass viele von Perl-Operatoren Standard wirkt auf $_

  • Es besteht keine Notwendigkeit für das Array @newlines. Sie ändern @lines sowieso so @newlines ist nur eine Kopie

  • Verwenden \Q...\E in regex Muster oder Strings in doppelten Anführungszeichen jedes nicht-alphanumerischen Zeichen

Der letzte Punkt zu entkommen wird Ihr Problem lösen. Ein Dollarzeichen $ in einem RegexMuster bedeutet das Ende 0f einer Linie und muss entkommen werden, wenn man es wörtlich genommen wollen

Diese Variante des Programms funktioniert ordnungsgemäß

use strict; 
use warnings 'all'; 

use constant FILE => '/tmp/file.txt'; 

my @input = do { 
    open my $fh, '<', FILE or die "Unable to open input file: $!"; 
    <$fh>; 
}; 

my $old = '/usr/open/xyz -getCh $svr'; 
my $new = 'echo "y" | ' . $old; 

open my $fh, '>', FILE or die "Unable to open output file: $!"; 

for (@input) { 
    s/\Q$old/$new/g; 
    print $fh $_; 
} 

print "Changes complete\n"; 
Verwandte Themen