Aktuelle SeiteWähle Forum / Perl / Allgemeines zu Perl / Variableninhalt maskieren
Variableninhalt maskieren

Hallo Community,
ich schreibe derzeit mein erstes Perl Skipt und komm an einer Stelle einfach nicht weiter:
Ich lese ein array aus, dessen Inhalt unbekannt ist und alle Sonderzeichen enthalten kann. Diese machen allerdings Probleme beim bash Befehl, weswegen ich sie irgendwie maskieren muss.
foreach $zeile2 (@array2) {
chomp $zeile2;
my $befehl11 = 'echo -e '.$zeile2.' >> temp3dat';
my $befehl12 = `$befehl11`;
print $befehl12;}
Habe es mit URI:Escape, doppelten Hochkomata bereits versucht.. Ist sicher ganz einfach, aber ich komm nicht drauf. Gibt es einen Befehl alle kritischen Zeichen (welche sind das in der bash überhaupt?) in einer Variable zu maskieren oder muss das manuell bewerkstelligt werden?
Oder sollte man das besser mit file open etc, ohne bash Kommando machen?
Bitte um Hilfe!
Trackback URL für diesen Beitrag:
- Anmelden oder Registrieren um Kommentare zu schreiben
- 583 Aufrufe
-

Hallo Xylakant,
ich habe gerade erst eine Art Telnet Konsole für mich geschrieben und hatte da keine Probleme mit dieser Art:
my @result = qx ($befehl);
Maskiert werden muss da m.E. nichts.
Und bei der Auswertung/Anzeige von @result muss man dann auf die Zeichenkodierung achten. Wenn meine Konsole auf Windows läuft, mache ich vorher ein
my $result = join ('',@result);
use Text::Iconv;
my $converter = Text::Iconv -> new ('CP850','ISO-8859-1');
$result = $converter -> convert ($result);
ansonsten sehen die meisten Sonderzeichen nicht richtig aus.
Und aus ISO machst Du bei Dir UTF, wenn das Script als UTF gespeichert wird.
Hallo Bianca,
funktioniert so leider auch nicht. Bitte um Hilfe, ich komm von selber echt nicht drauf.
Habe jetzt aus obigem Code erst das gemacht:
foreach $zeile2 (@array2) {
my $befehl11 = qx(echo -e $zeile2 >> temp3dat);
print $befehl11;}
und auch das:
use Text::Iconv;
my $converter = Text::Iconv -> new ('ISO-8859-1','CP850');
.
.
foreach $zeile2 (@array2) {
my $zeile3 = $converter -> convert ($zeile2);
my $befehl11 = qx(echo -e $zeile3 >> temp3dat);
print $befehl11;}
Meine Testvariable (also ein Eintrag in @array2) beinhaltet alle Sonderzeichen, die mir eingefallen sind. Dieser Eintrag soll über den echo Befehl in die Datei temp3dat hinzu gefügt werden, allerdings bringt er immer die Fehlermeldung:
sh: -c: Zeile 0: unexpected EOF while looking for matching ``'
sh: -c: Zeile 1: Syntax Fehler: Unerwartetes Dateiende.
sh: -c: Zeile 0: Syntaxfehler beim unerwarteten Wort `<'
sh: -c: Zeile 0: `echo -e 9876�³�{[]}\~��|><;,:._-'#*+`��?��=)(/&%$��"!��^6789 >> temp3dat'
kommt also irgendwie mit den Sonderzeichen durcheinander..
Bei zweiter Methode mit ISO -> UTF8 Konvertierung hab ich wohl grundsätzlich einen Syntaxbug drin, Fehlermeldung:
Use of uninitialized value $zeile3 in concatenation (.) or string at ./integrate.pl line 129.
(Unabhängig davon, ob ich $zeile3 innerhalb der foreacch Schleife initialisiere, was wahrscheinlich falsch ist, oder bereits vor der Schleife. In der Schleife steht dann statt my $zeile3.. nur $zeile3..)
Die ganze Problematik müsste ich doch ganz einfach umgehen können, in dem ich nicht per echo in die Datei schreibe, sondern direkt mit einem perl Befehl oder?
Könnte mir vielleicht jemand ein kleines Beispiel dazu geben?
Vielen Dank!
P.S.: Die Testvariable lautet:
9876^°!"§$%&/()=ß?´`+*#'-_.:,;<>|µ~\}][{³²6789
Da das anscheinend wirklich für Windows ist, hier ein funktionierendes Beispiel.
Man maskiert in DOS mit ^:
#!/usr/bin/perl -w
use strict;
use warnings;
my $test = 'hallo/()!§$=ß?,;.:-_[]{}#+*'; # ungefährliche Zeichen
$test .= '\\'; # Backslash muss maskiert werden, damit es von Perl nicht selbst als Maskierung interpretiert wird
$test .= '\''; # Hochkomma muss maskiert werden, solange Hochkomma als Begrenzer verwendet wird
$test .= '^|'; # More | für DOS mittels ^ maskieren
$test .= '^"'; # Anführungszeichen " für DOS mittels ^ maskieren
$test .= '^<^>'; # eckige Klammern <> für DOS mittels ^ maskieren
my $befehl = 'echo ' . $test . ' > test.txt';
my $result = qx ($befehl);
print "Resultat: >$result<\n";
print "\n\nInhalt der Datei:\n*****************\n" . qx ("type test.txt");
So, ich habe mein Problem halbwegs gelöst. Ich schreibe direkt über Perl in die Datei und gehe nicht mehr den Umweg über den echo Befehl (bash)
open FILE, '>>', $datei2;
foreach $zeile2 (@array2) {
chomp $zeile2;
print FILE $zeile2."\n";}
close FILE;
Einzig liegt die resultierende Textdatei als ISO und nicht mehr als UFT8 Format vor. Der code, den Bianca diesbezüglich gepostet hat funktioniert irgendwie nicht (siehe oben), es kommt eine Fehlermeldung über eine nichtinitialisierte Variable, obwohl ich sie eigentlich zuvor initialisiert habe!?
Noch jemand eine Idee hierzu?
Mein Code funktioniert bei mir ohne Fehlermeldung.
Kann nur ein Copy & Paste Fehler sein.
Zeig mal Deinen aktuellen Code.