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

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

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow