Thread String Ausgabe vs Ausführung (6 answers)
Opened by PROXEN at 2019-11-07 19:01

haj
 2019-11-07 23:46
#190852 #190852
User since
2015-01-07
558 Artikel
BenutzerIn

user image
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.

View full thread String Ausgabe vs Ausführung