Perl Language
Tekenreeksen en citeermethoden
Zoeken…
Opmerkingen
De syntaxis van de versie staat ons niet toe om versies te beschermen die nog niet bestaan, dus dit is een herinnering voor iemand om terug te gaan en ze te bewerken zodra het landt (RE: Perl 5.26). De versiebewakers moeten eerder een "toekomstige" classificatie hebben voor voorlopige functies die mogelijk beschikbaar zijn voor mensen die dapper genoeg zijn om een bron af te rekenen.
String Letterlijke citaten
Stringliterals impliceren geen ontsnapping of interpolatie (met uitzondering van stringterminators)
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 \
U kunt alternatieve citatiemechanismen gebruiken om botsingen te voorkomen:
print q/This is is a literal \' <-- 2 characters /; # prints both \ and '
print q^This is is a literal \' <-- 2 characters ^; # also
Bepaalde gekozen aanhalingstekens zijn "evenwichtig"
print q{ This is a literal and I contain { parens! } }; # prints inner { }
Double-citeren
Tekenreeksen met dubbele aanhalingstekens gebruiken interpolatie en escaping - in tegenstelling tot tekenreeksen met enkele aanhalingstekens. Als u een string dubbel wilt citeren, gebruikt u dubbele aanhalingstekens "
of de operator qq
.
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)
De qq
is hier handig om te voorkomen dat u tussen de aanhalingstekens moet ontsnappen. Zonder dat zouden we moeten schrijven ...
print "As Bush once said: \"$bush\"\n";
... wat gewoon niet zo leuk is.
Perl beperkt je niet tot het gebruik van een slash /
met qq
; u kunt elk (zichtbaar) karakter gebruiken.
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. ;
U kunt arrays ook in tekenreeksen interpoleren.
use feature 'say';
my @letters = ('a', 'b', 'c');
say "I like these letters: @letters.";
# => I like these letters: a b c.
Standaard zijn de waarden gescheiden door spaties - omdat de speciale variabele $"
standaard een enkele spatie is. Dit kan natuurlijk worden gewijzigd.
use feature 'say';
my @letters = ('a', 'b', 'c');
{local $" = ", "; say "@letters"; } # a, b, c
Als u wilt, kunt use English
en in plaats daarvan $LIST_SEPARATOR
wijzigen:
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" }
Voor iets complexers dan dit, zou je in plaats daarvan een lus moeten gebruiken.
say "My favourite letters:";
say;
for my $letter (@letters) {
say " - $letter";
}
Interpolatie werkt niet met hashes.
use feature 'say';
my %hash = ('a', 'b', 'c', 'd');
say "This doesn't work: %hash" # This doesn't work: %hash
Sommige code maakt misbruik van interpolatie van referenties - vermijd het .
use feature 'say';
say "2 + 2 == @{[ 2 + 2 ]}"; # 2 + 2 = 4 (avoid this)
say "2 + 2 == ${\( 2 + 2 )}"; # 2 + 2 = 4 (avoid this)
De zogenaamde "kar-operator" zorgt ervoor dat perl de @{ ... }
de matrixreferentie [ ... ]
met de uitdrukking die u wilt interpoleren, 2 + 2
derefereert. Wanneer u deze truc gebruikt, bouwt Perl een anonieme array, verwijdert deze vervolgens en verwijdert deze.
De versie ${\( ... )}
is iets minder verspillend, maar vereist nog steeds toewijzing van geheugen en is nog moeilijker te lezen.
Overweeg in plaats daarvan te schrijven:
-
say "2 + 2 == " . 2 + 2;
-
my $result = 2 + 2; say "2 + 2 == $result"
Heredocs
Grote Multi-Line strings zijn lastig om te schrijven.
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
NB: zorg ervoor dat je syntax markeerstift van stack-overflows negeert: het is heel erg verkeerd.
En geïnterpoleerde Heredocs werken op dezelfde manier.
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 afwachting van 5.26.0 * is een "Indented Heredoc" -syntaxis die de linkse opvulling voor u afsnijdt
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
Achterblijvende nieuwe regels verwijderen
De functie chomp
zal één nieuweteken verwijderen, indien aanwezig, van elke scalar die eraan wordt doorgegeven. chomp
muteert de originele string en geeft het aantal verwijderde tekens terug
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
U kunt ook chomp
meer dan één snaar tegelijk:
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
Maar meestal maakt niemand zich zorgen over hoeveel nieuwe regels zijn verwijderd, dus chomp
wordt meestal gezien in een ongeldige context en meestal vanwege het lezen van regels uit een bestand:
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