2009-12-08 9 views
2

J'ai une ligne:Comment extraire des mots d'une chaîne délimitée par des virgules en Perl?

$myline = 'ca,cb,cc,cd,ce'; 

je dois correspondre ca dans $, cb dans $, etc ..

Malheureusement

$myline =~ /(?:(\w+),?)+/; 

doesn ne fonctionne pas. Avec pcretest, il ne correspond qu'à 'ce' dans $ 1. Comment le faire correctement? Ai-je besoin de le mettre dans la boucle while?

Merci!

+0

si les mots peuvent contenir des virgules, vous pouvez utiliser un module CSV, comme http://search.cpan.org/~makamaka/Text-CSV-1.16/lib/Text/CSV.pm –

Répondre

10

Pourquoi ne pas utiliser le split function:

@parts = split(/,/,$myline); 

split divise une chaîne en une liste de chaînes en utilisant l'expression régulière que vous fournissez comme séparateur.

9

N'est-il pas plus facile d'utiliser my @parts = split(/,/, $myline)?

+0

C'est vrai! Le plus simple est d'utiliser split! –

1

Si le nombre d'éléments est variable, alors vous n'allez pas le faire comme vous le souhaitez. Boucle à travers la chaîne en utilisant l'indicateur global:

while($myline =~ /(\w+)\b/g) { 
    # do something with $1 
}

Je vais deviner que vos données réelles est plus complexe que « ca, cb, cc, cd, CE », si ce n'est pas alors l'utilisation des expressions régulières n'est probablement pas justifiée. Vous seriez mieux diviser la chaîne sur le caractère de délimitation:

my @things = split ',', $myline;
+0

Vous avez raison. Il est préférable d'utiliser split dans mon cas. Pourquoi n'y ai-je pas pensé? –

+0

Parce que c'est Perl, et il y a tellement de façons de le faire. –

3

Bien que split est une bonne façon de résoudre votre problème, un dans le contexte de la liste regex de capture fonctionne aussi bien. Il est utile de connaître les deux approches.

my $line = 'ca,cb,cc,cd,ce'; 
my @words = $line =~ /(\w+)/g; 
+1

Une différence notable est que la division conservera les entrées vides, donnant 'undef' dans les endroits où les virgules sont adjacentes. La méthode regex ignore ces endroits car ils ne contiennent pas un ou plusieurs caractères de mot. –

3

Regardez dans les années PM CSV, vous pouvez télécharger à partir de CPAN, à savoir Text::CSV ou Text::CSV_XS.

Vous obtiendrez ce dont vous avez besoin et tenez compte de toutes les valeurs séparées par des virgules qui ont été cotées.

L'utilisation de ces modules, il est facile de diviser les données en dehors et à travers elle ... parse

Par exemple:

my @field = $csv->fields;