2016-05-27 35 views
2

Ich bin ein Anfänger mit Perl. Ich benutze den Below Perl-Befehl, um "/ $" in meinem tcl-Skript zu suchen und zu ersetzen. Dies funktioniert gut, wenn es direkt auf der Linux-Befehlszeile verwendet wird.Perl-Befehl zum Suchen und Ersetzen funktioniert nicht, wenn von einem anderen Perl-Skript aus aufgerufen wird

Ich rufe an, den obigen Perl One Liner in einem anderen Perl Skript mit System Command und nur mit "` "Back Tick aufzurufen.

system(`perl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl`); 
`perl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl`; 

Ich bekomme die Below-Fehler. Bitte helfen Sie mit diesem Problem.

Bareword found where operator expected at -e line 1, near "$/g" 
(Missing operator before g?) 
Final $ should be \$ or $name at -e line 1, within string 
syntax error at -e line 1, near "s//$/" 
Execution of -e aborted due to compilation errors. 

Ich weiß nicht, ob ich noch jemand Trennung Operator wie% verwenden und # wie SED-Befehl aber, wenn ich ‚%‘ Operator für die Trennung verwendet, ich habe Fehler nicht aber Arbeit erledigt ist nicht.

`perl -p -i -e 's%\/\$%\/\\\$%g' sed_list.tcl`; 

Ich konnte keine ausreichenden Ergebnisse für diese spezielle Ausgabe von '$' Variable im Internet finden. Jede Hilfe wird geschätzt.

+0

http://stackoverflow.com/questions/619926/should-i-escape-shell-arguments-in-perl – xxfelixxx

+3

Warum werden Backtick mit Systembefehl verwendet? Sie sollten '' '' wie 'system (" ")' verwenden. – serenesat

+0

Danke für Ihre Antwort. System ("perl -p -i -e's/\/\ $/\/\\\ $/g 'sed_list.tcl"); Das habe ich schon ausprobiert aber nutzlos. Ich bekomme immer noch den gleichen Fehler. Bitte schlagen Sie eine Lösung vor. Ich werde versuchen, Sie zu aktualisieren – Sridhar

Antwort

0

Sie können einen externen Befehl ausführen, indem Sie den Befehl an eine Systemfunktion übergeben oder indem Sie den Operator backticks (``) verwenden. Bitte geben Sie den Befehl zum system() Funktion als String:

system(q{perl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl})

oder verwenden Sie Backticks als:

`perl -p -i -e 's/\/\$/\/\\\$/g' sed_list_gen.tcl` 

Edit: Wie von Paul in den Kommentaren vorgeschlagen.

+0

Vielen Dank für Ihre Antwort. Wenn ich Systemfunktion verwende, wie Sie angegeben haben, bekomme ich den folgenden Fehler "Syntaxfehler bei flat_rtl_gen.pl Zeile 175, in der Nähe von "System" Ausführung von flat_rtl_gen.pl abgebrochen wegen Kompilierungsfehler. " Wenn ich Back Ticks benutze, bekomme ich den unten angegebenen Fehler " Backticks gefunden, wo Betreiber erwartet bei flat_rtl_gen.pl Linie 177, in der Nähe "'" perl -p -i -e 's/\/\ $/\/\\\ $/g' sed_list_gen.tcl "'" (fehlt Semikolon auf vorherige Zeile?) Syntaxfehler bei flat_rtl_gen.pl Linie 177, nahe "' "perl -p -i -e 's/\/\ $/\/\\\ $/g' sed_list_gen.tcl" '" Bitte vorschlagen. . – Sridhar

+0

habe ich ausprobiert und keine Fehler gefunden. Kannst du bitte flat_rtl_gen.pl posten? Mach auch "perl -c flat_rtl_gen.pl" und poste das Ergebnis. Bitte bearbeiten Sie die Frage, um diese Details hinzuzufügen. – SilentMonk

+0

Hallo still Monk, der folgende Code arbeiteten 'perl -p -i -e 's/\\\/\\\ $/\\\/\\\\\\\ $ \ g' file'; Ich danke dir wirklich für deine Zeit. Ich werde Ihren Code ausprobieren und Sie aktualisieren. – Sridhar

0

Einige hier Vorgeschlagen, dass ich alle Back Schrägstriche entkommen sollte, während Sie System Command oder einen anderen Befehl mit BackTicks aus einem Perl-Skript aufrufen. Aber später haben sie ihre Antwort gelöscht. Es hat für mich funktioniert. Ich möchte jedem danken, der sich Mühe gegeben hat und mir bei der Lösung meiner Frage geholfen hat.

Hier ist der korrekte Arbeitscode.

`perl -p -i -e 's/\\\/\\\$/\\\/\\\\\\\$/g' sed_list_gen.tcl`; 

oder Verwenden Sie die Systemfunktion als

system("perl -p -i -e 's/\\\/\\\$/\\\/\\\\\\\$/g' sed_list_gen.tcl"); 

Vielen Dank noch einmal für die Gemeinschaft Below

gezeigt mir helfen. . .

+0

Meine Güte, das ist katastrophal unordentlich. Sie können zwei Schritte ausführen, um es zu bereinigen. 1) Verwenden Sie nicht-interpolierende Anführungszeichen für Ihren Befehl 'system()'. 2) Verwenden Sie ein anderes Trennzeichen als '/' zum Suchen und Ersetzen: 'system (q {perl -p -i -e's!/\ $!/\\ $! '});' –