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

5.26.0
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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow