2009-09-09 11 views
0

Je travaille sur un script Perl que j'espérais capturer une chaîne entrée sur la ligne de commande sans avoir à entrer les guillemets (similaire à la capacité "$ @" de bash). Je vais utiliser cette commande un peu alors j'espérais que c'était possible. Si j'ai:

if ($ARGV) { 

Je dois placer la chaîne de ligne de commande entre guillemets. Je préfère faire la commande quelque chose comme ceci:

htmlencode some & HTML <> entities 

Sans les guillemets. Y a-t-il un moyen de faire ça en Perl?

+2

le && < and > ne sera-t-il pas interprété par votre shell avant même qu'il ne soit perl? – dlamblin

+1

Je pense que vous voulez dire $ ARGV [0]; $ ARGV est quelque chose de différent. – ysth

+0

Mettre [Invalid] dans le titre de votre question ne fait que mettre à jour le flux RSS. Si vous pensez que votre question n'est pas valide, cliquez sur le lien de fermeture en regard des liens de modification et d'indicateur en bas à gauche de votre question. –

Répondre

4

Le tableau @ARGV contient les arguments du script Perl, sans guillemets.

Cela dit, la question porte sur:

Je dois mettre la chaîne de ligne de commande entre guillemets. Je préfère faire la commande quelque chose comme ceci:

htmlencode some & HTML <> entities 

Sans les guillemets. Y a-t-il un moyen de le faire en perl?

Eh bien, si la commande affichée est écrit à la ligne de commande shell, vous devez obéir à des conventions de coquille - ce qui signifie Echapper à la « & » et « <> » pour empêcher le shell de les interpréter. De même, dans un script Perl, cette séquence devrait être protégée de Perl. Peut-être vous écririez:

system "htmlencode", "some", "&", "HTML", "<>", "entities"; 

C'est, tout aurait être entre guillemets - mais que la notation éviteriez l'exécution de la coquille et la coquille ayant interpréter les commandes.

Alternativement encore, si vous mettez les arguments dans un tableau (avec des guillemets au moment où le tableau est chargé), alors vous pouvez passer ce tableau à system et ne pas utiliser les guillemets:

my @args = ("htmlencode", "some", "&", "HTML", "<>", "entities"); 
system @args; 

Mais je pense que la question est confuse.

3

Vous mettez des guillemets autour de [email protected] dans bash afin qu'il se développe pour que chaque élément du tableau soit cité. La raison pour cela est que chaque élément du tableau continue à être traité comme un seul argument lorsque vous les passez tous à la commande suivante. L'équivalent de Perl est que vous voulez passer ces paramètres à une autre commande externe. Si vous exécutez le programme externe avec les opérateurs backtick, vous devez citer chaque paramètre, mais si vous utilisez system, Perl prendra soin de garder tous les paramètres séparés pour vous.

En fait, les paramètres séparés sont la façon dont les programmes sont exécutés sous Unix. Le format de ligne de commande à une seule chaîne est présent car nous devons être en mesure de saisir des éléments à l'invite de commande. Comme tous les shells, bash has special rules sur la façon de diviser cette seule chaîne en plusieurs arguments. Mais si vous les avez déjà séparés dans un tableau Perl, ne les remettez pas dans une seule chaîne. Gardez-les séparés.

+0

Merci pour les commentaires les gars. Pensait que le script s'exécuterait en premier, puis pourrait saisir le tableau "some & HTML <> entités" et ne pas traiter chaque comme des arguments simples avant de courir, ce qui est évidemment ce qu'il fait. Je supprimerais ceci mais il y a quelques bons commentaires. Appréciez l'aide. – user148813

Questions connexes