Всегда используйте
use strict;
use warnings;
даже в самых коротких скриптах Perl.
В случае опечаток в коде Perl обычно выдает ошибки, если вы их включаете,Без этого Perl с радостью будет совершать странные, неправильные и бессмысленные вещи в молчании.
Ваш пример не распечатает весь массив.Вместо этого вы получите:
'oranges'
'guavas'
'passionfruits'
Первый индекс массива - 0
, и поэтому 'apples'
пропускается, поскольку $a
инициализируется с 1
.Цикл также завершается из-за достижения значения 4
перед выводом на печать 'grapes'
.
Чтобы распечатать весь массив, вы должны сделать:
, есливам нужно использовать значение индекса $i
где-то:
for my $i (0 .. $#fruits) {
print " $i: '$fruits[$i]' \n";
}
($#fruits
- последний индекс, если @fruits
, равен размеру массива минус 1. Поскольку этот массив имеет 5элементы, значения индекса варьируются от 0 до 4)
в противном случае:
foreach my $current_fruit (@fruits) {
print " '$current_fruit' \n";
}
, где $current_fruit
устанавливается для каждого элемента в массиве @fruits
inего очередь.
Цитаты в Perl действуют как операторы, и в зависимости от того, какие из них вы используете, они могут или не могут делать разные вещи с включенной строкой.
В ваших примерах,двойные кавычки будут выполнять интерполяцию строки, подставляя значение $fruits[$a]
и заменяя escape-последовательность \n
.Следовательно:
print " '$fruits[$a]' \n";
(для $a == 1
) становится:
'oranges'
Одинарные кавычки, напротив, не делают интерполяцию.
Только одиночные кавычки (и обратные косые черты, предшествующие одинарным кавычкам) необходимо экранировать с помощью обратной косой черты.(Другие обратные слэши можно при желании экранировать.) Все другие последовательности символов будут отображаться как есть, поэтому аргумент print
в:
print ' "$fruits[$a]" \n';
считается полностью литеральной строкой и, таким образом,
"$fruits[$a]" \n "$fruits[$a]" \n "$fruits[$a]" \n
распечатывается.
Чтобы получить желаемый результат, есть несколько способов сделать это:
Самый простой способ - но не самый простой для чтения для сложных строк - это использовать двойные кавычки и экранировать включенные кавычки:
print " \"$fruits[$a]\" \n";
Вы можете использовать общее обозначение для "..."
,qq{...}
где {}
- это либо пара скобок (любая из ()
, []
, {}
или <>
), либо тот же другой непробельный символ, не состоящий из слов, например:
print qq{ "$fruits[$a]" \n};
или
print qq! "$fruits[$a]" \n!;
Вы можете объединить строку из частей, которые вы указали отдельно:
print ' "' . $fruits[$a] . '"' . " \n";
Что легче всего читать в коде, зависит от сложности строки и содержащихся в ней переменных: для действительно длинных строкСложные разыменования, индексы и хеш-ключи вы можете использовать вариант 3, тогда как для коротких лучше всего подойдет 2.
Весь мой отредактированный код:
use strict;
use warnings;
my @fruits = ("apples", "oranges", "guavas", "passionfruits", "grapes");
for my $i (0 .. $#fruits) {
print " $i: \"$fruits[$i]\" \n";
print qq< $i: "$fruits[$i]" \n>;
print ' ' . $i . ': "' . $fruits[$i] . '"' . " \n";
}
foreach my $current_fruit (@fruits) {
print " \"$current_fruit\" \n";
print qq¤ "$current_fruit" \n¤;
print ' "' . $current_fruit . '"' . " \n";
}
ВыПодробнее о различных кавычках в Perl можно узнать на странице perldoc (или man в UNIX-подобных системах) perlop
и в разделе , озаглавленном «Операторы цитирования и операторы цитирования» .