Поиск…


замечания

Синтаксис версии не позволяет нам защищать версии, которые еще не существуют, поэтому это напоминание о том, что кто-то может вернуться и отредактировать их, когда он приземлится (RE: Perl 5.26). У охранников версии скорее должна быть «будущая» классификация для предварительных функций, которые могут быть доступны для людей, достаточно храбрых, чтобы выполнять проверку исходного кода.

Строковое литературное цитирование

Строковые литералы не подразумевают экранирования или интерполяции (за исключением цитирования строковых терминаторов)

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 \

Вы можете использовать альтернативные механизмы цитирования, чтобы избежать столкновений:

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

Некоторые выбранные символы кавычек являются «сбалансированными»,

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

Дважды процитировать

Строки с двойными кавычками используют интерполяцию и экранирование - в отличие от строк с одной кавычкой. Для того, чтобы двойные кавычки строка, либо использовать двойные кавычки " или 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)

qq полезен здесь, чтобы избежать необходимости избегать кавычек. Без этого нам пришлось бы писать ...

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

... который просто не так хорош.

Perl не ограничивает вас использованием косой черты / с qq ; вы можете использовать любой (видимый) символ.

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

Вы также можете интерполировать массивы в строки.

use feature 'say';

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

По умолчанию значения разделяются пробелами - поскольку специальная переменная $" умолчанию имеет одно пространство. Это, конечно, может быть изменено.

use feature 'say';

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

Если вы предпочитаете, вы можете use English и вместо этого изменить $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" }

Для чего-то более сложного, чем это, вы должны использовать цикл.

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

Интерполяция не работает с хешей.

use feature 'say';

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

Некоторый код злоупотребляет интерполяцией ссылок - избегайте этого .

use feature 'say';

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

Так называемый «оператор тележки» вызывает perl для разыменования @{ ... } ссылки на массив [ ... ] которая содержит выражение, которое вы хотите интерполировать, 2 + 2 . Когда вы используете этот трюк, Perl создает анонимный массив, затем разыгрывает его и отбрасывает.

Версия ${\( ... )} несколько менее расточительна, но по-прежнему требует выделения памяти, и ее еще труднее читать.

Вместо этого подумайте о написании:

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

Heredocs

Большие многострочные строки обременительны для записи.

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: Убедитесь, что вы игнорируете подсветку синтаксиса синтаксиса стека: это очень неправильно.

И Interpolated Heredocs работают одинаково.

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

Ожидается в 5.26.0 * - это синтаксис с отступом Heredoc, который выравнивает слева от вас

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

Удаление завершающих строк

Функция chomp удалит один символ новой строки, если присутствует, от каждого переданного к нему скаляра. chomp будет мутировать исходную строку и вернет количество удаленных символов

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    

Вы также можете chomp несколько строк за один раз:

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

Но, как правило, никто не беспокоится о том, сколько новых строк было удалено, поэтому chomp обычно рассматривается в контексте void и обычно из-за чтения строк из файла:

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow