2009-09-11 5 views
10

J'ai une chaîne avec plusieurs parties séparées par des onglets:Comment séparer une chaîne en deux parties avec Perl?

Hello\t2009-08-08\t1\t2009-08-09\t5\t2009-08-11\t15 

Je veux le diviser uniquement sur le premier onglet, de sorte que « Bonjour » se retrouve dans $k et et le repos finit dans $v. Cela ne fonctionne pas tout à fait:

my ($k, $v) = split(/\t/, $string); 

Comment puis-je faire cela?

+3

En fait, je viens de lire le doc pour split(), était dérouté; googlé, et est venu ici. Où j'ai trouvé la réponse. – Chap

Répondre

36

Pour obtenir cela, vous devez utiliser le 3ème paramètre à split(), qui donne la fonction d'un nombre maximum de champs divisé en (si elle est positive):

my($first, $rest) = split(/\t/, $string, 2); 
+0

Que se passe-t-il si la longueur de la valeur est incertaine et que je veux tout saisir en $ v. Le format de $ v va ressembler à date_1 \ tvalue_1 \ tdate_2 \ tvalue_2 \ tdate_3 \ tvalue_3 ... – biznez

+2

Cela va capturer "date_1" dans $ k, et "valeur_1 \ tdate_2 \ tvalue_2 \ tdate_3 \ tvalue_3 ..." dans $ v. Pour plus d'informations, je suis lié à la page de référence de perldoc sur la fonction 'split()' - il va expliquer comment cela fonctionne dans tous les détails que vous pourriez jamais vouloir. Je vous suggère de le lire. Perldoc est très informatif. –

7

Non, il vous donnera les deux premiers éléments et jetez le reste. Essayez ceci:

my ($k, $v) = split(/\t/, $string, 2); 
+0

Que faire si la longueur de la valeur est incertaine, et je veux capturer tout cela dans $ v. Le format de $ v va ressembler à date_1 \ tvalue_1 \ tdate_2 \ tvalue_2 \ tdate_3 \ tvalue_3 ... – biznez

+0

Comme l'a dit Chris Lutz dans son commentaire, le nombre indique à Perl combien de parties se diviser. Donc, avec une valeur de 2, la première partie va dans $ v, le premier \ t est consommé dans le split, et le reste de la chaîne reste inchangé dans $ v. –

1

Une autre option serait d'utiliser une regex simple.

my($k,$v) = $str =~ /([^\t]+)\t(.+)/; 
Questions connexes