Как напечатать выбранные элементы массива в двойных кавычках - PullRequest
0 голосов
/ 12 мая 2018

Здесь я пытаюсь напечатать 2-й, 3-й и 4-й элементы массива в двойных кавычках, и я смог сделать это только в одинарных кавычках.

my @fruits = ("apples", "oranges", "guavas", "passionfruits", "grapes");
my $a = 1;
while ($a<4){
    print " '$fruits[$a]' \n";
    $a += 1;
}

Но я могуне делайте этого в одинарных кавычках.Когда я заменяю одинарные кавычки на двойные и наоборот, вместо этого печатается "$fruits[$a]"\n три раза.И когда я изменяю все кавычки на двойные, это выдает ошибку, которую я понимаю почему.Пожалуйста, мне действительно нужна помощь.

И если бы я мог получить способ напечатать все три элемента в двойных кавычках без использования цикла.Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 мая 2018
  1. Всегда используйте

    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
    

    распечатывается.


Чтобы получить желаемый результат, есть несколько способов сделать это:

  1. Самый простой способ - но не самый простой для чтения для сложных строк - это использовать двойные кавычки и экранировать включенные кавычки:

    print " \"$fruits[$a]\" \n";
    
  2. Вы можете использовать общее обозначение для "...",qq{...} где {} - это либо пара скобок (любая из (), [], {} или <>), либо тот же другой непробельный символ, не состоящий из слов, например:

    print qq{ "$fruits[$a]" \n};
    

    или

    print qq! "$fruits[$a]" \n!;
    
  3. Вы можете объединить строку из частей, которые вы указали отдельно:

    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 и в разделе , озаглавленном «Операторы цитирования и операторы цитирования» .

0 голосов
/ 12 мая 2018

Чтобы использовать " в строке, разделенной ", избегайте ее.

"foo: \"$bar\"\n"

Вы также можете переключить разделитель (имея в виду, что "..." - это сокращение от qq"...").

qq{foo: "$bar"\n}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...