Perl Language
Strängar och citatmetoder
Sök…
Anmärkningar
Versatsyntaxen tillåter oss inte att skydda versioner som inte finns ännu, så detta är en påminnelse för någon att gå tillbaka och redigera dem när den landar (RE: Perl 5.26). Versionsvakterna behöver snarare ha en "framtida" klassificering för tentativa funktioner som kan vara tillgängliga för människor som är modiga nog att göra en källkassa.
Strängbokstavligt citat
Strängbokstäver innebär ingen rymning eller interpolering (med undantag för att citera strängterminatorer)
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 \
Du kan använda alternativa citatmekanismer för att undvika kollisioner:
print q/This is is a literal \' <-- 2 characters /; # prints both \ and '
print q^This is is a literal \' <-- 2 characters ^; # also
Vissa valda citattecken är "balanserade"
print q{ This is a literal and I contain { parens! } }; # prints inner { }
Dubbel citerar
Dubbelciterade strängar använder interpolering och rymmer - till skillnad från enkelciterade strängar. För att dubbelcitera en sträng använder du antingen dubbla citat "
eller qq
operatören.
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)
qq
är användbar här för att undvika att behöva undkomma citattecken. Utan det skulle vi behöva skriva ...
print "As Bush once said: \"$bush\"\n";
... vilket bara inte är lika trevligt.
Perl begränsar dig inte till att använda en snedstreck /
med qq
; Du kan använda valfritt (synligt) tecken.
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. ;
Du kan också interpolera matriser i strängar.
use feature 'say';
my @letters = ('a', 'b', 'c');
say "I like these letters: @letters.";
# => I like these letters: a b c.
Som standard är värdena rymdseparerade - eftersom den specialvariabeln $"
standard till ett enda utrymme. Detta kan naturligtvis ändras.
use feature 'say';
my @letters = ('a', 'b', 'c');
{local $" = ", "; say "@letters"; } # a, b, c
Om du föredrar har du alternativet att use English
och ändra $LIST_SEPARATOR
istället:
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 något mer komplicerat än detta bör du använda en slinga istället.
say "My favourite letters:";
say;
for my $letter (@letters) {
say " - $letter";
}
Interpolering fungerar inte med hascher.
use feature 'say';
my %hash = ('a', 'b', 'c', 'd');
say "This doesn't work: %hash" # This doesn't work: %hash
Vissa koder missbrukar interpolering av referenser - undvik det .
use feature 'say';
say "2 + 2 == @{[ 2 + 2 ]}"; # 2 + 2 = 4 (avoid this)
say "2 + 2 == ${\( 2 + 2 )}"; # 2 + 2 = 4 (avoid this)
Den så kallade "vagnoperatören" orsakar perl till dereference @{ ... }
matrisreferensen [ ... ]
som innehåller uttrycket som du vill interpolera, 2 + 2
. När du använder detta trick bygger Perl ett anonymt array, sedan avlägsnar det och kastar det.
${\( ... )}
-versionen är något mindre slöseri, men den kräver fortfarande allokering av minne och det är ännu svårare att läsa.
Överväg istället att skriva:
-
say "2 + 2 == " . 2 + 2;
-
my $result = 2 + 2; say "2 + 2 == $result"
Heredocs
Stora flersträngssträngar är tyngre att skriva.
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
OBS: Se till att ignorera syntaxmarkören för stack-overflows: Det är mycket fel.
Och interpolerade heredokser fungerar på samma sätt.
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
Väntar på 5.26.0 * är en "Indented Heredoc" -syntax som trimmar vänsterstoppning åt dig
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
Tar bort släpnyheter
Funktionschompet chomp
bort ett nylinjetecken, om det finns, från varje skalar som skickas till den. chomp
kommer att mutera den ursprungliga strängen och returnerar antalet tagna bort
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
Du kan också chomp
mer än en sträng samtidigt:
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
Men vanligtvis är det ingen som oroar sig för hur många nya linjer som togs bort, så chomp
ses vanligtvis i ogiltigt sammanhang, och vanligtvis på grund av att ha läst rader från en fil:
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