2010-02-26 3 views
3

En perl, j'ai une chaîne qui ressemble à peu près commeComment séparer élégamment des paires de mots d'une chaîne en Perl?

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

Maintenant, je voudrais diviser cette chaîne en paires mot-nombre, mais ont sans succès.

Je pensais que je pouvais faire un

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

et je alors

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

Cependant, je reçois

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

Maintenant, je peux utiliser grep pour mon résultat souhaité:

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

Mais je me demandais s'il y avait une solution plus élégante à ce problème.

Répondre

6

Je ne sais pas si elle est une solution élégante, vous pouvez utiliser la correspondance avec le modificateur /g:

my @pairs = $str =~ /(\w+\s+\d+)/g; 
15

Pourquoi les séparer par paires? Juste obtenir une liste de mots puis les prendre par deux.

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

Si vous voulez un hachage, il est encore plus simple:

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

Je trouve que beaucoup plus facile à comprendre et à transmettre à un autre programmeur qu'un regex.

+1

+1 pour la solution de hachage, parlez de «hors des sentiers battus» ... – Zaid

+7

Les hachages ne sont pas du tout emballés. Presque chaque fois que quelqu'un dit «pair», vous devriez entendre «hash» :) –

+1

Peut-être est-il préférable d'utiliser 'split ', $ str' si vous ignorez les espaces de début et de fin. On dit aussi qu'il y a des optimisations spéciales. – codeholic

Questions connexes