webentwicklung-frage-antwort-db.com.de

Wie kann Perls Druck standardmäßig eine neue Zeile hinzufügen?

In Perl haben die meisten meiner print-Anweisungen die Form

print "hello." . "\n";

Gibt es einen schönen Weg, um zu vermeiden, dass alle lästigen "\ n" herumliegen?

Ich weiß, ich könnte eine neue Funktion wie myprint erstellen, die automatisch\n anhängt, aber es wäre schön, wenn ich die vorhandene print überschreiben könnte.

82
Mike

Perl 6 hat die say-Funktion, die automatisch \n anhängt.

Sie können auch say in Perl 5.10 oder 5.12 verwenden, wenn Sie hinzufügen

use feature qw(say);

an den Anfang Ihres Programms. Oder Sie können Modern :: Perl verwenden, um diese und andere Funktionen zu erhalten.

Siehe Perldoc-Funktion für weitere Details.

88
Josh Kelley

Sie können die -l-Option in der She-Bang-Kopfzeile verwenden: 

#!/usr/bin/Perl -l

$text = "hello";

print $text;
print $text;

Ausgabe:

hello
hello
29
jaypal singh

Wenn Perl 5.10+ keine Option ist, folgt hier eine schnelle und fehlerhafte Annäherung. Es ist nicht genau dasselbe, da say etwas magisches an sich hat, wenn sein erster arg ein Handle ist, aber zum Drucken an STDOUT:

sub say {print @_, "\n"}

say 'hello';
24
Eric Strom

Die Art und Weise, wie Sie Ihre Print-Anweisung schreiben, ist unnötig ausführlich. Es ist nicht erforderlich, den Zeilenvorschub in eine eigene Zeichenfolge zu unterteilen. Das reicht aus.

print "hello.\n";

Diese Erkenntnis wird die Codierung im Allgemeinen wahrscheinlich erleichtern.

Zusätzlich zur Verwendung von use feature "say" oder use 5.10.0 oder use Modern::Perl, um die integrierte say-Funktion zu erhalten, werde ich pimp Perl5i verwenden, was standardmäßig viele vernünftige fehlende Funktionen für Perl 5 aktiviert.

19
Schwern

Vielleicht möchten Sie das Ausgabedatentrennzeichen in Zeilenvorschub ändern mit:

local $\ = "\n";

$ Perl -e 'print q{hello};print q{goodbye}' | od -c
0000000    h   e   l   l   o   g   o   o   d   b   y   e                
0000014
$ Perl -e '$\ = qq{\n}; print q{hello};print q{goodbye}' | od -c
0000000    h   e   l   l   o  \n   g   o   o   d   b   y   e  \n        
0000016

Update: meine Antwort spricht eher für die Fähigkeit als für die Zweckmäßigkeit. Das Hinzufügen von "\ n" am Ende der Zeilen ist für mich keine "lästige" Aufgabe, aber wenn jemand sie wirklich vermeiden möchte, ist dies eine Möglichkeit. Wenn ich ein bisschen Code beibehalten müsste, der diese Technik verwendet, würde ich ihn wahrscheinlich pronto umgestalten.

9
David M

In Perl 6 gibt es die Funktion say

3
Michael Mrozek

Wenn Sie nicht mehr als 5.10 verwenden, replizieren die Lösungen oben die say-Funktion nicht vollständig. Zum Beispiel

sub say { print @_, "\n"; }

Funktioniert nicht mit Aufrufen wie

say for @arr;

oder 

for (@arr) {
    say;
}

... weil die obige Funktion nicht auf den impliziten globalen $_ wie print und die reelle say-Funktion wirkt.

Um die Perl 5.10+ say genauer zu replizieren, möchten Sie diese Funktion

sub say {
    if (@_) { print @_, "\n"; }
    else { print $_, "\n"; }
}

Das wirkt jetzt so

my @arr = qw( alpha beta gamma );
say @arr;
# OUTPUT
# alphabetagamma
#
say for @arr;
# OUTPUT
# alpha
# beta
# gamma
#

Die in Perl6 eingebaute say verhält sich etwas anders. Beim Aufruf mit say @arr oder @arr.say werden die Array-Elemente nicht nur verkettet, sondern sie werden mit dem Listentrennzeichen getrennt ausgegeben. Um dies in Perl5 zu replizieren, würden Sie dies tun

sub say {
    if (@_) { print join($", @_) . "\n"; }
    else { print $_ . "\n"; }
}

$" ist die globale Listentrennvariable, oder wenn Sie English.pm verwenden, ist dies $LIST_SEPARATOR

Es wird sich jetzt mehr wie Perl6 verhalten

say @arr;
# OUTPUT
# alpha beta gamma
#
1
Joshua

Folgendes habe ich unter https://perldoc.Perl.org/perlvar.html gefunden:

$\ Das Ausgabesatztrennzeichen für den Druckoperator. Wenn definiert, lautet dieser Wert nach den letzten Argumenten gedruckt. Standardeinstellung ist undef.

Sie können output_record_separator () nur als statische Methode für ein Handle aufrufen. Siehe IO :: Handle.

Mnemonic: Sie setzen $\anstelle von "\ n" am Ende des Ausdrucks. Es ist auch genau wie $ /, aber es ist das, was man von Perl "zurückbekommt".

beispiel: 

$\ = "\n";
print "a newline will be appended to the end of this line automatically";
0
gabrielhofer560