Как удалить пробелы во внешнем из условия цикла?

#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 then chomp $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 . К сожалению, добавление print @mkh . "n"; выводится 12 . Вам нужно либо использовать say , либо print join( "", @mkh ) . "n";

2. Или просто использовать запятую , вместо конкатенации . , которая создает скалярный контекст?