Szukaj…


Uwagi

Składnia wersji nie pozwala nam strzec wersji, które jeszcze nie istnieją, dlatego jest to przypomnienie, aby ktoś mógł wrócić i edytować je po wylądowaniu (RE: Perl 5.26). Strażnicy wersji muszą raczej mieć klasyfikację „przyszłości” dla niepewnych funkcji, które mogą być dostępne dla osób wystarczająco odważnych, aby dokonać sprawdzenia źródła.

Cytat dosłowny

Literały łańcuchowe nie oznaczają zmiany znaczenia ani interpolacji (z wyjątkiem cytowania terminatorów łańcuchowych)

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 \

Możesz użyć alternatywnych mechanizmów cytowania, aby uniknąć kolizji:

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

Niektóre wybrane znaki cytatu są „zrównoważone”

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

Podwójne cytowanie

Ciągi cudzysłowowe używają interpolacji i znaków ucieczki - w przeciwieństwie do ciągów cudzysłowowych. Aby podwójnie zacytować ciąg, użyj albo podwójnego cudzysłowu " albo operatora 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)

Funkcja qq jest tu przydatna, aby uniknąć konieczności ucieczki od cudzysłowów. Bez tego musielibyśmy napisać ...

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

... co po prostu nie jest tak miłe.

Perl nie ogranicza cię do używania ukośnika / z qq ; możesz użyć dowolnego (widocznego) znaku.

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

Możesz także interpolować tablice na ciągi.

use feature 'say';

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

Domyślnie wartości są rozdzielone spacjami - ponieważ zmienna specjalna $" domyślnie jest ustawiona na pojedynczą spację. Można to oczywiście zmienić.

use feature 'say';

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

Jeśli wolisz, możesz use English i zamiast tego zmienić $LIST_SEPARATOR :

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

W przypadku czegokolwiek bardziej złożonego niż to należy użyć pętli.

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

Interpolacja nie działa z hashami.

use feature 'say';

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

Niektóre kody nadużywają interpolacji odniesień - unikaj go .

use feature 'say';

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

Tak zwany „operator koszyka” powoduje, że perl wyrejestrowuje @{ ... } odwołanie do tablicy [ ... ] zawierające wyrażenie, które chcesz interpolować, 2 + 2 . Kiedy używasz tej sztuczki, Perl buduje anonimową tablicę, a następnie usuwa ją z niej i odrzuca.

Wersja ${\( ... )} jest nieco mniej marnotrawna, ale wciąż wymaga alokacji pamięci i jest jeszcze trudniejsza do odczytania.

Zamiast tego rozważ napisanie:

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

Heredocs

Duże ciągi wieloliniowe są uciążliwe do pisania.

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: Upewnij się, że zignorowałeś przepełnienie składni wyróżnienia składni: To bardzo źle.

I interpolowane Heredoki działają w ten sam sposób.

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

W oczekiwaniu na 5.26.0 * znajduje się składnia „Indented Heredoc”, która przycina lewe dopełnienie

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

Usuwanie końcowych znaków nowej linii

Funkcja chomp usunie jeden znak nowej linii, jeśli jest obecny, z każdego przekazanego mu skalara. chomp zmutuje oryginalny ciąg i zwróci liczbę usuniętych znaków

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    

Możesz także chomp więcej niż jeden ciąg naraz:

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

Ale zwykle nikt nie martwi się, ile nowych linii zostało usuniętych, więc chomp jest zwykle widziany w pustym kontekście i zwykle z powodu odczytu linii z pliku:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow