2009-09-19 10 views
4

je la chaîne suivanteClojure Parse Chaîne

 
layout: default 
title: Envy Labs 

Ce que je suis en train de faire est de créer la carte de celui-ci

 
layout->default 
title->"envy labs" 

Est-ce possible de faire en utilisant des fonctions de séquence ou dois boucle i à travers chaque ligne?

Essayez d'obtenir une expression régulière à utiliser et à ne pas utiliser.


(apply hash-map (re-split #": " meta-info)) 

Répondre

4
user> (let [x "layout: default\ntitle: Envy Labs"] 
     (reduce (fn [h [_ k v]] (assoc h k v)) 
       {} 
       (re-seq #"([^:]+): (.+)(\n|$)" x))) 
{"title" "Envy Labs", "layout" "default"} 
+1

thx qui a fonctionné, mais j'ai une question, (fn [h [_ kv]] qu'est-ce que _ voulez-vous sauter tout sauf les deux derniers params? Ou est-ce juste un nom de var inutilisé? –

+2

'_' un nom de variable normal C'est juste une convention de dire aux lecteurs humains qu'il s'agit d'un espace réservé et que vous n'avez pas l'intention d'utiliser cette variable. –

3

Le _ est un nom de variable utilisé pour indiquer que vous ne se soucient pas de la valeur de la variable (dans ce cas, toute la chaîne adaptée).

1

Je vous recommande d'utiliser clojure-contrib/duck-streams/read-lines pour traiter les lignes, puis diviser les champs à partir de là. Je trouve cette méthode est généralement plus robuste aux erreurs dans le fichier.