2009-07-14 9 views
0

J'ai été inspiré par une autre question pour écrire un script (ou plutôt un one-liner) pour récupérer des pages de Wikipédia au hasard.Pourquoi la sortie de la console revient-elle au début de la ligne? OU Pourquoi ma concaténation n'est pas concaténante?

Voici ce que j'ai jusqu'à présent:

# Grab the HTTP header response from Wikipedia's random page link 
curl 'http://en.wikipedia.org/wiki/Special:Random' -sI 

# Search STDIN for the Location header and grab its content 
perl -wnl -e '/Location: (.*)/ and print $1;' 

Et cela fonctionne. Il génère une URL Wikipedia au hasard à la console. Mais je dois ajouter "? Printable = yes" à cette URL pour obtenir la page Wikipedia sans tout le contenu non-article.

Cependant, en cours d'exécution:

curl 'http://en.wikipedia.org/wiki/Special:Random' -sI | perl -wnl -e '/Location: (.*)/ and print $1 . "?printable=yes";' 

Sorties: imprimable = yespedia.org/wiki/James_Keene_ (footballeur)

Pourquoi mon concaténation pas concaténer?

MISE À JOUR:

Pour les curieux, voici le one-liner dans sa réalisation:

curl `curl 'http://en.wikipedia.org/wiki/Special:Random' -sI | perl -wnl -e '/Location: ([^\r]*)/ and print $1 . "?printable=yes";'` 
+0

Veuillez paraphraser le titre pour quelque chose de plus significatif. –

+0

Je suis ouvert aux suggestions. –

Répondre

2
curl 'http://en.wikipedia.org/wiki/Special:Random' -sI | perl -wnl -e '/Location: (.*)/ and chomp($1) and print $1 . "?printable=yes";' 

Untested, mais cela devrait fonctionner. Le retour au début de la ligne est provoqué par un caractère "\ r" non autorisé à la fin de la ligne d'emplacement. Le script imprime l'URL Wikipedia, complète avec '\ r' qui retourne au début de la ligne, où il continue d'imprimer ?printable=yes. Chomp va supprimer ce caractère '\ r'.

+0

D'une manière ou d'une autre tout ce qui a réussi à faire est de préfixer un 0 à la sortie. Cependant, vous aviez raison sur la raison et en changeant la regex à/Location: ([^ \ r] *)/fait l'affaire. Merci. –

+0

Eh bien que 0 serait parce que je n'ai pas pris la peine de lire comment chomp est utilisé en Perl; J'ai utilisé Ruby ces derniers temps, alors j'ai supposé que c'était la même chose. Ce qu'il faisait était d'imprimer $ 1, ne rien écraser (ce qui retourne 0 parce qu'il a supprimé 0 caractères) et concaténant et donc imprimant cela, puis imprimant le reste. J'ai mis à jour ma réponse pour avoir l'utilisation correcte de chomp, bien que ce que vous avez fait fonctionne tout aussi bien. :) –

+0

Merde je déteste l'approche CRLF dans Windows. J'ai passé presque une demi-heure à déboguer une regex multi-ligne à cause d'hier. –

Questions connexes