2010-07-07 2 views
7

У меня есть массив, содержащий строку, которая может содержать пробелы, добавленные до конца. Мне нужно удалить эти пробелы, используя perl-скрипт. мой массив будет выглядеть следующим образомКак удалить ведущие и завершающие пробелы из элементов массива?

@array = ("shayam "," Ram  "," 24.0  "); 

Мне нужен выход, как

@array = ("shayam","Ram","24.0"); 

Я попытался с chomp (@array). Он не работает со строками.

+1

Дубликат: http://stackoverflow.com/questions/184590/is-there-a-perl-compatible-regular-expression-to-trim-whitespace- from-both-sides, http://stackoverflow.com/questions/2025658/how-do-remove-white-space-in-a-perl-string – Zaid

+0

В данном массиве каждый индекс, содержащий только одну строку или несколько строки тоже вроде @array = («shayam nice», «Ram», «24.0»); ? –

+0

@ Zaid: это не точные дубликаты этого. Речь идет о том, чтобы сделать это для списка значений. – 2010-07-07 08:23:13

ответ

1
 
#!/usr/local/bin/perl -w 

use strict; 
use Data::Dumper; 

my @array=('a ', 'b', ' c'); 

my @newarray = grep(s/\s*$//g, @array); 

print Dumper \@newarray; 

Ключевая функция здесь - это grep(), все остальное - просто демо-соус.

+5

Не подходит ли «карта»? –

+0

Карта более сложная, чем нужно здесь. Поскольку вы знаете, что регулярное выражение всегда будет возвращать true, в то же время изменяя $ _, grep - лучший выбор. Все эти люди, которые происходят с этими глупыми петлями foreach, явно не прочитали первую пару глав любой основной книги perl. grep - это хлеб и масло для perl :) –

+2

(ответ Алану Хорну) IMO 'grep' предлагает найти что-то в списке, 'map' предполагает, что весь список будет использоваться, поэтому используя 'grep', где 'map' более подходит для кода, который становится менее читаемым. – plusplus

-1
my @res =(); 
my $el; 

foreach $el (@array) { 
    $el =~ /^\s*(.*?)\s*$/; 
    push @res, $1; 
} 

После этого @res будет содержать нужные элементы.

+4

Это унииоматический Perl. – daxim

+2

@ daxim: Вы имеете в виду, потому что можете его прочитать? Я думал, что Перл был свободен выбора. – Borealid

+2

Смешно. Это всего лишь одна строка с 'map' или [' foreach' (как показывает Zaid)] (http://stackoverflow.com/questions/3192649#3192716) и, следовательно, более читабельна. 'my $ el; foreach $ el ... '- стиль невооруженного новичка, все остальные записывают' foreach my $ el ... '. Кроме того, [bicarbonate] (http://en.wikipedia.org/wiki/There's_more_than_one_way_to_do_it). Извините, я не думаю, что ваш ответ так хорош и заслуживает его недостатка. – daxim

32

Основной вопрос вращается вокруг удаления начальные и конечные пробелы из строк, и был дан ответ в нескольких нитей в той или иной форме со следующим регулярное выражение замены (или его эквивалент):

s{^\s+|\s+$}{}g foreach @array; 

chomp в массиве удаляются только трейлинг-сепараторы входных записей (по умолчанию "\n"). Он не предназначен для удаления конечных пробелов.

От perldoc -f chomp:

Это часто используется для удаления символа новой строки с конца входной записи, когда вы беспокоитесь, что окончательный отчет может отсутствовать его новая строку. Когда в режиме абзаца ($/ = ""), он удаляет все завершающие символы новой строки из строки.

...

Если вы грызть список, каждый элемент chomped, а общее количество символов, удаленных возвращается.

+1

Это правильный ответ. ОП запрашивает, чтобы элементы массива были изменены на месте, а не создавали новый массив. Кроме того, решения с захватом, хотя и не являются неправильными, должны быть медленнее. См. Также perlfaq: http://perldoc.perl.org/perlfaq4.html#How-do-I-strip-blank-space-from-the-beginning%2fend-of-a-string%3f –

+0

Использование '{}' как разделитель близок к снобизму :-) Но, честно говоря, я не знал, что это было принято .. сделав [этот ответ] (http://stackoverflow.com/questions/5770590/which-characters-can -be-used-as-regular-expression-delimiters) неполное .. –

+0

Можете ли вы или кто-нибудь, пожалуйста, сказать, где этот синтаксис с «блоком» (или тем, что он есть) перед ключевым словом 'foreach' документирован. На странице perlsyn этот синтаксис не упоминается, но он работает. – user907860

-2

Я думаю, что пример Borealid должен быть:

my @array = ("shayam "," Ram "," 24.0 "); 
foreach my $el (@array) { 
    $el =~ s/^\s*(.*?)\s*$/\1/; 
} 
+0

«это может вызвать некоторые сюрпризы, если в каждой строке есть пробелы». Что это за сюрпризы? – bohica

+1

Избегайте использования '\ 1' на RHS замены. Кроме того, здесь нет необходимости захватывать. См. Perlfaq: http://perldoc.perl.org/perlfaq4.html#How-do-I-strip-blank-space-from-the-beginning%2fend-of-a-string%3f и perlre: http://perldoc.perl.org/perlre.html#Warning-on-%5c1-Instead-of-%241 –

1

Как насчет: @array = map {join(' ', split(' '))} @array;

+0

Не спрашивая об этом, он также сжимает несколько внутренних пространств, а также обрезает ведущие и конечные пробелы и является наиболее эффективным способом сделайте это, согласно рецепту 1.19, Perl Cookbook, 2nd Edition – lkench

1

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

#!/usr/bin/perl 

use strict; 
use warnings; 

my @array = ("shayam "," Ram  "," 24.0  ", " foo bar garply "); 

map { s/^\s+|\s+$//g; } @array; 

for my $element (@array) { 
    print ">$element<\n"; 
} 

Выход:

>shayam< 
>Ram< 
>24.0< 
>foo bar garply< 
Смежные вопросы