Как удалить элементы массива, такие как пробелы и другие символы, используя perl - PullRequest
0 голосов
/ 05 февраля 2020

Как удалить элементы массива, такие как пробелы и некоторые символы, другие цифры и алфавиты? Я попробовал приведенный ниже код. Он по-прежнему печатает все пробелы и некоторые символы, кроме цифр и алфавитов.

my $j=0;
while (my $line = <$file>) {
my $string = substr($line, 0, 10);
@array[$j] = $string;
$j++;
}
s/^\s+|\s+\z//g for @array;
foreach my $element (@array) {
print "$element\n";
}

1 Ответ

3 голосов
/ 05 февраля 2020

РЕДАКТИРОВАТЬ 2 (после более подробных комментариев ОП ниже):

(Цитировать слегка перефразированное сообщение ОП + комментарии):

Оставьте только те элементы массива, которые имеют одну или несколько букв или di git. Удалите все остальные начальные и конечные символы.

Полное решение, которое короче, надежнее и более perl -i sh, равно grep и map с несколькими операциями. все упаковано внутри.

@array = grep { $_ ne q{} } 
         map {
                $_ = substr $_, 0, 10;
                s{\A[^A-Za-z0-9]+|[^A-Za-z0-9]+\z}{}g;
                $_
         } <$file>;

Подробности:

<$file> возвращает все содержимое файла в виде массива.
map работает с каждым элементом, по умолчанию с псевдонимом $_. Он возвращает $_ после изменений - поэтому $_ явно добавляется в конце, так как последнее, что map оценивает.
\A - начало строки.
\z - это строка конец строки.
[^A-Za-z0-9]+ - любой не {символ или буква}, повторенный 1 или более раз.
grep { $_ ne q{} } удаляет пустые строки.

Почему s/^\s+|\s+\z//g for @array; не работает?

Удаляет только начальные и конечные только пробелы . Он не удаляет другие не {di git или буквенные символы}, такие как '.' или '_'. Он также не удаляет пустые строки из массива, например, те, которые являются результатом элементов массива всех пробелов (например, "\t \t"), которые были заменены пустой строкой: "". Например, эта подстановка регулярных выражений изменит этот массив из 2 элементов: (" . a. ", "\t \t") в этот массив из 2 элементов: (". a.", "") - не то, что вы хотите.

СМОТРИТЕ ТАКЖЕ:

Документы для Perl регулярных выражений , map и grep содержат более подробную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...