Как элегантно разделить пары слов из строки в Perl? - PullRequest
3 голосов
/ 26 февраля 2010

В Perl у меня есть строка, которая выглядит примерно как

my $str = "one  10 two   20   three    30";

Теперь я бы хотела разбить эту строку на пары слово-номер, но безуспешно.

Я думал, что смогу сделать

my @pairs = split /([a-z]+[^a-z]+)/, $str;

и тогда получу

$pairs[0] eq 'one  10 '
$pairs[1] eq 'two   20   '
$pairs[2] eq 'three    30'

Однако я получаю

$pairs[0] eq ' '
$pairs[1] eq 'one  10 '
$pairs[2] eq ' '
$pairs[3] eq 'two   20   '
$pairs[4] eq ' '
$pairs[5] eq 'three    30'

Теперь я могу использовать grep для желаемогорезультат:

my @pairs = grep {$_ =~ /\S/} split /([a-z]+[^a-z]+)/, $str;

Но мне было интересно, есть ли более элегантное решение этой проблемы.

Ответы [ 2 ]

15 голосов
/ 26 февраля 2010

Зачем разделять их на пары? Просто возьми список слов и возьми их по двое.

 my @words = split /\s+/, $str;
 while( @words ) {
     my( $first, $second ) = splice @words, 0, 2;
     ...;
     }

Если вам нужен хеш, он еще проще:

 my %pairs = split /\s+/, $str;

Я считаю, что это гораздо легче понять и передать другому программисту, чем регулярному выражению.

6 голосов
/ 26 февраля 2010

Не знаю, элегантное ли это решение, вы можете использовать совпадения с модификатором /g:

my @pairs = $str =~ /(\w+\s+\d+)/g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...