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

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

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow