Как вывести «И» между элементами массива? - PullRequest
4 голосов
/ 17 августа 2011

Если у меня есть массив с именем, как показано ниже.

Как напечатать «Привет, Джо, Джек и Джон»?

Алгоритм также должен работать, когда есть только одно имяв массиве.

#!/usr/bin/perl

use warnings;
use strict;

my @a = qw /joe jack john/;

my $mesg = "Hi ";

foreach my $name (@a) {

    if ($#a == 0) {
    $mesg .= $name;
    } else {
    $mesg .= " and " . $name;
    }
}

print $mesg;

Ответы [ 4 ]

8 голосов
/ 17 августа 2011

Обычно для этого мы используем метод соединения с массивом.Вот псевдокод:

@array = qw[name1 name2 name2];
print "Hey ", join(" and ", @array), ".";
2 голосов
/ 17 августа 2011

Чтобы получить ответы perldoc perlvar, вы можете сделать одну (как минимум) две вещи.

1) Set $" (разделитель списка):

Когда массив или срез массива интерполируются в двойные кавычки строка или аналогичный контекст, такой как /.../, ее элементы разделены по этому значению. По умолчанию это пробел. Например, это:

print "The array is: @array\n";

эквивалентно этому:

print "The array is: " . join($", @array) . "\n";

=> $" влияет на поведение интерполяции массива в строку

2) Установить $, (разделитель выходного поля):

Разделитель полей вывода для оператора печати. Если определено, это значение печатается между каждым из аргументов печати. По умолчанию это undef. Мнемоника: что печатается, когда в вашем операторе печати есть ",".

=> $, влияет на поведение оператора print.

Любой из них будет работать, и любой из них может использоваться с local для установки значения специальной переменной только в пределах области видимости. Я думаю, разница в том, что с $" вы не ограничены командой печати:

my @z = qw/ a b c /;
local $" = " and ";
my $line = "@z";
print $line;

здесь "магия" происходит в 3-й строке, а не в команде печати. ​​

По правде говоря, использование join является наиболее читабельным, и если вы не используете небольшой вмещающий блок, будущий читатель может не заметить установки магической переменной (скажем, ближе к вершине) и никогда не увидит, что поведение не то, что ожидается против нормальной производительности. Я хотел бы сохранить эти уловки для небольших разовых и однострочников и использовать читаемый join для производственного кода.

2 голосов
/ 17 августа 2011

Просто используйте специальную переменную $".

$"="and"; #" (this last double quote is to help the syntax coloring)
$mesg="Hi @a";
2 голосов
/ 17 августа 2011

Не проверено:

{ local $, = " and "; print "Hi "; print  @a; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...