Thread String Ausgabe vs Ausführung
(6 answers)
Opened by PROXEN at 2019-11-07 19:01
Ich rate mal, dass Du mit "ausführen" meinst, dass Du den Skalar an qx oder zwischen Graviszeichen `$cmd` verfüttern willst. Aber was Du hier verlangst, das ist ein bisschen schummeln: ein \n in einer Zeichenkette hat entweder die Bedeutung "Neue Zeile" oder "Schrögstrich n". Eine einfache Lösung wäre somit, $cmd vor dem print schlicht so zu präparieren, dass die "\n" durch "\\n" ersetzt werden:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 $cmd = qq{cat <<-ENDOFMESSAGE \none \ntwo \nthree \nENDOFMESSAGE}; print ($cmd =~ s/\n/\\n/gr); print "\n"; # cat <<-ENDOFMESSAGE \none \ntwo \nthree \nENDOFMESSAGE print `$cmd`; # one # two # three Perl wäre allerdings nicht Perl, wenn man solche Sachen nicht schummeln könnte, also den gleichen Skalar an print und an die Kommandoausführung übergeben. Man kann zwar print nicht mit einer eigenen Routine überschreiben, aber man kann den Übersetzer zwischen print und STDOUT hineinklemmen: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #!/usr/bin/perl use 5.020; use warnings; package PerlIO::via::NoLF { sub PUSHED { my $self= ''; bless \$self, shift; } sub FILL { my ($self, $fh) = @_; return defined $fh ? nolf(<$fh>) : undef; } sub WRITE { my ( $self, $text, $fh ) = @_; return 0 unless defined $text; return print $fh nolf($text); } sub nolf { $_[0] =~ s/\n(?!$)/\\n/gr; } } binmode STDOUT,':via(NoLF)'; my $cmd = qq{cat <<-ENDOFMESSAGE \none \ntwo \nthree \nENDOFMESSAGE}; print "Ausgabe am Bildschirm soll so auschauen - alles in einer Zeile:\n"; print $cmd; print "\n"; # cat <<-ENDOFMESSAGE \none \ntwo \nthree \nENDOFMESSAGE print "Ausgeführt muss es aber dann so werden:\n"; print `$cmd`; # one # two # three Das gehört aber eher in die Abteilung Magie, und Magie sollte man nur anwenden, wenn man mit normalen Mitteln gar nicht mehr weiterkommt. Sonst kommen die Wesen aus den Kerkerdimensionen. |