Perl Language
Strings und Zitiermethoden
Suche…
Bemerkungen
Die Versionssyntax erlaubt es uns nicht, Versionen abzuwehren, die es noch nicht gibt. Es ist also eine Erinnerung, dass jemand zurückgehen und sie bearbeiten kann, sobald er gelandet ist (RE: Perl 5.26). Die Versionswächter müssen vielmehr eine "zukünftige" Klassifizierung für vorläufige Funktionen haben, die möglicherweise Personen zur Verfügung stehen, die mutig genug sind, um eine Quellenüberprüfung durchzuführen.
String-Zitat
String-Literale implizieren kein Escaping oder Interpolation (mit Ausnahme von Anführungszeichen für String-Abschlusszeichen)
print 'This is a string literal\n'; # emits a literal \ and n to terminal
print 'This literal contains a \'postraphe '; # emits the ' but not its preceding \
Sie können alternative Angebotsmechanismen verwenden, um Kollisionen zu vermeiden:
print q/This is is a literal \' <-- 2 characters /; # prints both \ and '
print q^This is is a literal \' <-- 2 characters ^; # also
Bestimmte ausgewählte Anführungszeichen sind "ausgeglichen"
print q{ This is a literal and I contain { parens! } }; # prints inner { }
Doppelte Anführungszeichen
Strings in Anführungszeichen verwenden Interpolation und Escaping - im Gegensatz zu Strings in Anführungszeichen. Um doppelte Anführungszeichen eine Zeichenfolge, verwenden entweder doppelte Anführungszeichen "
oder qq
Operator.
my $greeting = "Hello!\n";
print $greeting;
# => Hello! (followed by a linefeed)
my $bush = "They misunderestimated me."
print qq/As Bush once said: "$bush"\n/;
# => As Bush once said: "They misunderestimated me." (with linefeed)
Das qq
ist hier hilfreich, um die Anführungszeichen nicht zu umgehen. Ohne das müssten wir schreiben ...
print "As Bush once said: \"$bush\"\n";
... was einfach nicht so schön ist.
Perl beschränkt Sie nicht auf die Verwendung eines Schrägstrichs /
mit qq
. Sie können ein beliebiges (sichtbares) Zeichen verwenden.
use feature 'say';
say qq/You can use slashes.../;
say qq{...or braces...};
say qq^...or hats...^;
say qq|...or pipes...|;
# say qq ...but not whitespace. ;
Sie können auch Arrays in Strings interpolieren.
use feature 'say';
my @letters = ('a', 'b', 'c');
say "I like these letters: @letters.";
# => I like these letters: a b c.
Standardmäßig sind die Werte durch Leerzeichen getrennt, da die spezielle Variable $"
standardmäßig nur ein Leerzeichen enthält. Dies kann natürlich geändert werden.
use feature 'say';
my @letters = ('a', 'b', 'c');
{local $" = ", "; say "@letters"; } # a, b, c
Wenn Sie möchten, können Sie use English
und stattdessen $LIST_SEPARATOR
ändern:
use v5.18; # English should be avoided on older Perls
use English;
my @letters = ('a', 'b', 'c');
{ local $LIST_SEPARATOR = "\n"; say "My favourite letters:\n\n@letters" }
Für alles, was komplexer ist, sollten Sie stattdessen eine Schleife verwenden.
say "My favourite letters:";
say;
for my $letter (@letters) {
say " - $letter";
}
Interpolation funktioniert nicht mit Hashes.
use feature 'say';
my %hash = ('a', 'b', 'c', 'd');
say "This doesn't work: %hash" # This doesn't work: %hash
Einige Codes missbrauchen die Interpolation von Referenzen - vermeiden Sie es .
use feature 'say';
say "2 + 2 == @{[ 2 + 2 ]}"; # 2 + 2 = 4 (avoid this)
say "2 + 2 == ${\( 2 + 2 )}"; # 2 + 2 = 4 (avoid this)
Der so genannte "cart-Operator" bewirkt, dass Perl @{ ... }
die Array-Referenz [ ... ]
dereference, die den Ausdruck enthält, den Sie interpolieren möchten, 2 + 2
. Wenn Sie diesen Trick verwenden, erstellt Perl ein anonymes Array, dereferenziert es und verwirft es.
Die ${\( ... )}
-Version ist etwas weniger verschwenderisch, erfordert jedoch noch Speicherzuordnung und ist noch schwieriger zu lesen.
Erwägen Sie stattdessen zu schreiben:
-
say "2 + 2 == " . 2 + 2;
-
my $result = 2 + 2; say "2 + 2 == $result"
Heredocs
Große Multi-Line-Strings sind schwer zu schreiben.
my $variable = <<'EOF';
this block of text is interpreted literally,
no \'quotes matter, they're just text
only the trailing left-aligned EOF matters.
EOF
Hinweis: Stellen Sie sicher, dass Sie den Syntax-Highlighter für Stack-Overflows ignorieren: Dies ist sehr falsch.
Und Interpolierte Heredocs arbeiten auf dieselbe Weise.
my $variable = <<"I Want it to End";
this block of text is interpreted.
quotes\nare interpreted, and $interpolations
get interpolated...
but still, left-aligned "I Want it to End" matters.
I Want it to End
In 5.26.0 * steht eine "Indented Heredoc" -Syntax an, die Linksauffüllung für Sie abschneidet
my $variable = <<~"MuchNicer";
this block of text is interpreted.
quotes\nare interpreted, and $interpolations
get interpolated...
but still, left-aligned "I Want it to End" matters.
MuchNicer
Nachlaufende Zeilenumbrüche entfernen
Die Funktion chomp
entfernt, sofern vorhanden, ein Zeilenvorschubzeichen von jedem an sie übergebenen Skalar. chomp
mutiert die ursprüngliche Zeichenfolge und gibt die Anzahl der entfernten Zeichen zurück
my $str = "Hello World\n\n";
my $removed = chomp($str);
print $str; # "Hello World\n"
print $removed; # 1
# chomp again, removing another newline
$removed = chomp $str;
print $str; # "Hello World"
print $removed; # 1
# chomp again, but no newline to remove
$removed = chomp $str;
print $str; # "Hello World"
print $removed; # 0
Sie können auch mehrere Zeichenfolgen gleichzeitig chomp
:
my @strs = ("Hello\n", "World!\n\n"); # one newline in first string, two in second
my $removed = chomp(@strs); # @strs is now ("Hello", "World!\n")
print $removed; # 2
$removed = chomp(@strs); # @strs is now ("Hello", "World!")
print $removed; # 1
$removed = chomp(@strs); # @strs is still ("Hello", "World!")
print $removed; # 0
Normalerweise macht sich jedoch niemand Sorgen darüber, wie viele Zeilenumbrüche entfernt wurden. chomp
wird chomp
normalerweise in einem leeren Kontext gesehen, und in der Regel, weil Zeilen aus einer Datei gelesen wurden:
while (my $line = readline $fh)
{
chomp $line;
# now do something with $line
}
my @lines = readline $fh2;
chomp (@lines); # remove newline from end of each line