#perl
#perl
Вопрос:
Мой код на perl
use warnings;
use strict;
my @a = <DATA>;
my %j = qw(aa AA bb BB cc CC dd DD ee EE ff FF gg GG hh HH ii II jj JJ kk KK ll LL);
my @vj = map split,@a;
my @mkh;
foreach(@vj){
my $k = $j{$_};
my @ab = split(' ',$k);
push(@mkh,@ab);
}
print "@mkh";
__DATA__
jj dd ee aa ii hh kk ll gg bb cc ff
Как напечатать выходные данные без пробелов вне цикла? Внутри условия цикла выведите выходные данные без пробелов, но я ожидаю, что вывод будет напечатан вне цикла, как я могу это сделать?
Комментарии:
1. Вы знаете, что
@a = <DATA>
выполняется чтение в одном элементе$a[0]
, и этот элемент имеетn
в конце? Почему бы не использовать$a = <DATA>
and thenchomp $a
. Если вы это сделаете, вам не нужноmap
.
Ответ №1:
Это просто
print @mkh;
без кавычек, если я правильно понял ваш вопрос.
Кстати, я все еще задаюсь вопросом о map split,@a
. Я бы написал map split, @a;
или map { split } @a;
. Почему знак плюс ничего не нарушает?
Кажется, что @foo
это тот же массив, что и @foo
, но -@foo
имеет отрицательный размер @foo
. Смешное.
Комментарии:
1. Спасибо, сэр, ‘map split,@a’ ведет себя как ‘map split,@a;’ знак, который я использовал для разграничения функции map и split. Я всего лишь новичок в perl.
2. Хорошая попытка для новичка 🙂
Ответ №2:
При интерполяции массива элементы разделяются $"
глобальной переменной.
Чтобы избежать такого поведения, просто print
используйте массив напрямую.
print @mkh;
Это задокументировано в perlvar
:
$LIST_SEPARATOR
$"
Когда массив или фрагмент массива интерполируется в строку, заключенную в двойные кавычки, или аналогичный контекст, такой как
/.../
, его элементы разделяются этим значением. По умолчанию используется пробел. Например, это:print "The array is: @arrayn";
эквивалентно этому:
print "The array is: " . join($", @array) . "n";
Мнемоника: работает в контексте с двойными кавычками.
Кстати, возможно, вы хотели бы ознакомиться с функциями uc
и lc
.
use warnings;
use strict;
while (<DATA>) {
s/s//g;
print uc, "n";
}
__DATA__
jj dd ee aa ii hh kk ll gg bb cc ff
Выводит:
JJDDEEAAIIHHKKLLGGBBCCFF
Комментарии:
1. Хотя не заключать в кавычки
@mkh
работает. Это не решает проблему отсутствияn
в концеprint @mkh . "n";
выводится12
. Вам нужно либо использоватьsay
, либоprint join( "", @mkh ) . "n";
2. Или просто использовать запятую
,
вместо конкатенации.
, которая создает скалярный контекст?