Ricerca…


Osservazioni

La sintassi della versione non ci permette di evitare versioni che non esistono ancora, quindi questo è un promemoria per qualcuno di tornare indietro e modificarle una volta che atterra (RE: Perl 5.26). Le guardie della versione hanno piuttosto bisogno di avere una classificazione "futura" per le caratteristiche sperimentali che potrebbero essere disponibili per le persone abbastanza coraggiose da fare un checkout alla fonte.

Stringa letterale Quoting

I valori letterali delle stringhe non implicano l'escaping o l'interpolazione (ad eccezione della citazione dei terminatori di stringhe)

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 \

Puoi utilizzare meccanismi di quotazione alternativi per evitare gli scontri:

print q/This is is a literal \' <-- 2 characters /;  # prints both \ and '
print q^This is is a literal \' <-- 2 characters ^;  # also

Alcuni caratteri di citazione scelti sono "bilanciati"

print q{ This is a literal and I contain { parens! } }; # prints inner { }

Doppi apici

Le stringhe con doppia citazione utilizzano l' interpolazione e l' escaping , a differenza delle stringhe con quotatura singola. Per duplicare una stringa, utilizzare virgolette doppie " o l'operatore 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)

Il qq è utile qui, per evitare di dover sfuggire alle virgolette. Senza di esso, dovremmo scrivere ...

print "As Bush once said: \"$bush\"\n";

... che non è così bello.

Perl non ti limita a usare una barra / con qq ; puoi usare qualsiasi personaggio (visibile).

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. ;

Puoi anche interpolare gli array in stringhe.

use feature 'say';

my @letters = ('a', 'b', 'c');
say "I like these letters: @letters.";
# => I like these letters: a b c.

Per impostazione predefinita, i valori sono separati dallo spazio, poiché la variabile speciale $" imposta automaticamente su un singolo spazio, che ovviamente può essere modificato.

use feature 'say';

my @letters = ('a', 'b', 'c');
{local $" = ", "; say "@letters"; }    # a, b, c

Se preferisci, hai la possibilità di use English e modificare $LIST_SEPARATOR invece:

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" }

Per qualcosa di più complesso di questo, dovresti usare invece un ciclo.

say "My favourite letters:";
say;
for my $letter (@letters) {
  say " - $letter";
}

L'interpolazione non funziona con gli hash.

use feature 'say';

my %hash = ('a', 'b', 'c', 'd');
say "This doesn't work: %hash"         # This doesn't work: %hash

Alcuni codici violano l'interpolazione dei riferimenti - evitali .

use feature 'say';

say "2 + 2 == @{[ 2 + 2 ]}";           # 2 + 2 = 4 (avoid this)
say "2 + 2 == ${\( 2 + 2 )}";          # 2 + 2 = 4 (avoid this)

Il cosiddetto "operatore del carrello" provoca perl a dereference @{ ... } il riferimento dell'array [ ... ] che contiene l'espressione che si desidera interpolare, 2 + 2 . Quando usi questo trucco, Perl costruisce un array anonimo, quindi lo dereferisce e lo scarta.

La versione ${\( ... )} è un po 'meno dispendiosa, ma richiede ancora l'allocazione della memoria ed è ancora più difficile da leggere.

Invece, considera la scrittura:

  • say "2 + 2 == " . 2 + 2;
  • my $result = 2 + 2; say "2 + 2 == $result"

Heredocs

Le stringhe Multi-Line di grandi dimensioni sono gravose da scrivere.

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: assicurati di ignorare la evidenziazione della sintassi dello stack overflow: è molto sbagliato.

E gli Heredoc interpolati funzionano allo stesso modo.

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 attesa di 5.26.0 * è presente una sintassi "Indented Heredoc" che elimina il riempimento sinistro

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

Rimozione dei newline finali

La funzione chomp rimuoverà un carattere di nuova riga, se presente, da ogni scalare passato ad esso. chomp muterà la stringa originale e restituirà il numero di caratteri rimossi

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    

Puoi anche chomp più di una stringa alla volta:

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

Ma di solito, nessuno si preoccupa di quante newline sono state rimosse, quindi il chomp è solitamente visto nel contesto vuoto, e di solito a causa della lettura delle righe da un file:

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow