J'écris un module Perl appelé Perl5i . Son objectif est de corriger une bande de problèmes de Perl communs dans un module (à l'aide de nombreux autres modules).
Pour l'appeler sur la ligne de commande pour une doublure que vous écririez: J'ai pensé que tout je devais Fais était pousser "-Mperl5i" sur le devant de la liste des arguments et appelez Perl. Et c'est ce que j'ai essayé. P> Windows complique cette approche. Apparemment, les programmes sous Windows ne sont pas passés à une gamme d'arguments, ils sont passés à tous les arguments comme une seule chaîne et ensuite faire leur propre analyse! Ainsi, quelque chose comme Alors, comment puis-je gérer cela? Enroulez-vous tout dans des citations et échapper à Windows? Y a-t-il une bibliothèque pour gérer cela pour moi? Est-ce qu'il y a une meilleure approche? Pourrais-je simplement ne pas générer de programme C sous Windows et l'écrire en tant qu'alleur Perl car il ne supporte pas #! de toute façon? p> Mise à jour: Soyez plus clair, il s'agit de logiciels expédiés afin que des solutions nécessitant l'utilisation d'une coquille donnée ou modifiez la configuration de la coque (par exemple, Perl -Mperl5I -E ' "Bonjour" ' code> Je pense que c'est trop wordy, je voudrais donc fournir une wrapper perl5i afin que vous puissiez écrire
perl5i -e' dire "bonjour" code>. J'aimerais aussi que les gens puissent écrire des scripts avec
#! / Usr / bin / perl5i code> il doit donc être un programme C compilé. P>
perl5i -e "dire" bonjour "" code> devient
perl -mperl5i -e dire "bonjour" code> et Windows ne peut pas gérer le manque de citation. P>
alias perl5i = 'perl -mperl5i' code>) ne sont pas satisfaisants. p> p>
6 Réponses :
Si vous avez pu utiliser C ++, peut-être peut-être boost.program_options aiderait: P>
http://www.boost.org/doc /Libs/1_39_0/doc/html/program_option.html P>
Désolé, il suffit de marquer la norme ANSI C 89. Je ne sais pas quel compilateur ils auraient pu être disponibles (le cas échéant).
pour Windows, utilisez un fichier de commandes.
perl5i.bat p> sur des systèmes UNIXY, un script de shell similaire suffira. P> mise à jour: strong> p> i Pensez que cela fonctionnera, mais je ne suis pas un assistant de coquille et je n'ai pas de système * Nix pratique à tester. p> perl5i p> < Strong> Mise à jour à nouveau: strong> p> duh! Maintenant, j'ai compris votre ignorer la mise à jour précédente. P> Il semble que Windows complique tout.
Je pense que votre mieux il y a d'utiliser un fichier de commandes. P> vous pourriez Utilisez une association de fichiers , associé Vous voudrez peut-être examiner comment % * code> est toutes les paramètres de ligne de commande moins
% 0 code>. P>
#! Code> Commentaire correctement. Mon script shell fonctionnera à partir de la CLI mais pas dans un
#! Code> ligne, puisque
#! FOO code> REQUIES que
FOO code> est un fichier binaire. < / p>
.p5i code> avec
perl -mperl5i% * code>. Bien entendu, cela signifie que vous êtes au registre, ce qui est le mieux évité à imo. Mieux vaut inclure des instructions sur la manière d'ajouter manuellement l'association dans vos docs. P>
Merci, je pourrais simplement punter et utiliser un fichier de commandes pour Windows. Un script shell ne suffira pas pour UNIX parce que #! n'honorera que des programmes compilés.
Cependant, un inconvénient de fichiers par lots sous Windows - ^ c-ing hors d'un script de lot provoquera une invite "Terminate de traitement par lots". Et pour des scripts d'emballage simples comme celui-ci, cette invite est proche inutile, car même si vous choisissez "N", il termine toujours Perl.
Dans UNIX, votre shell devrait avoir une forme de fonction d'alias qui le rend même inutile de créer un script shell.
MIFF, autant que je sache, il n'ya aucun moyen de supprimer le message "Terminer".
Merci @jmucchiello mais le but n'est pas pour mon avantage, mais tout le monde qui utilise le logiciel. Et je ne me contestez pas d'avoir des gens qui mangent avec leurs configurations de shell.
Vous devriez joindre $ @ en guillemets doubles pour empêcher le paramètre Split. Perl -Mperl5i "$ @" Voir Bash Manual 'Paramètres spéciaux' pour plus de détails.
Utilisez perl5i.cmd code> pas
perl5i.bat code>, sauf si vous avez besoin de travailler sur les ordinateurs Win9X.
@Brad une raison particulière pourquoi?
Si vous préférez utiliser un script perl / shell de toute façon sur * Nix, vous pouvez utiliser / usr / bin / env en tant que trampoline binaire générique.
Je ne peux pas reproduire le comportement de votre décrire: c'est avec Visual Studio 2005. P> P>
Essayez des arguments dans des citations telles que '-E "Dites" Bonjour "" et notez comment ils se séparent.
Ouais, mais c'est normal pour la coque de Windows. Je ne vois pas comment cela rend votre emballage différent de Perl lui-même.
L'emballage reçoit "-E", "disons" bonjour "sur argv. Les citations autour de "disent" Bonjour "" ont été dépouillés par la coquille. Si vous venez de passer à ce sujet vers un autre programme, il sera "-Ed" Bonjour "" Quelles fenêtres ne savent pas comment traiter. Le wrapper (plus probable que la coquille) lanie les citations afin que le programme interne n'en a pas bénéficié d'eux. Vous le verriez si votre programme a essayé d'appeler un autre avec ARGV.
Windows est toujours le cas étrange. Personnellement, je n'essaierais pas de coder pour l'exception de l'environnement Windows. Certaines alternatives utilisent des "wrappers de batte" ou des hacks de registre FTYPE / ASTA pour une extension de fichier.
Windows ignore la ligne Shebang lors d'une coque de commande DOS, mais l'utilise ironiquement lorsque cgi-ing perl dans Apache pour Windows. J'en ai marre de coder #! C: /perl/bin/perl.exe directement dans mes programmes Web en raison de problèmes de portabilité lors de la déplacement d'un environnement * Nix. Au lieu de cela, j'ai créé un répertoire C: \ usr \ bin sur mon poste de travail et copié le binaire Perl.exe de son emplacement par défaut, typiquement C: \ Perl \ bin pour en tant que Perl et C: \ Strawberry \ Perl \ bin pour la fraise Perl. Donc, en mode de développement Web sur Windows, mes programmes ne se briseraient pas lors de la migration vers un hébergement Web Linux / Unix, et je pourrais utiliser une ligne standard Shebang Line "#! / USR / bin / perl -w" sans avoir à se rendre fou au déploiement. :) P>
Dans l'environnement de la commande de commande DOS, je viens de définir mon chemin explicitement ou créez un FTYPE pointant sur le binaire perl.exe avec interrupteur intégré -mperl5i. La ligne de shebang est ignorée. P> puis de la ligne de commande DOS, vous pouvez simplement appeler "programme.pl" par lui-même au lieu de "Perl -Mperl5i programme.pl" p> Donc, la déclaration "Dites" travaillée dans 5.10 sans cajolation supplémentaire uniquement en entrant le nom du programme PERL lui-même, et il accepterait également un nombre variable d'arguments de ligne de commande. P> P> P> P> P> >
Utilisez Commandlinetoargvw pour construire votre argv , ou simplement transmettre votre ligne de commande directement à CreateProcess a >. P>
de Couse, cela nécessite une solution séparée spécifique à Windows, mais vous avez dit que vous êtes d'accord avec cela, c'est relativement simple et codant souvent des pièces clés spécifiquement au système cible, ce qui aide à l'intégration (à partir des utilisateurs de POV) de manière significative. . Ymmv. P>
Si vous souhaitez exécuter le même programme avec et sans console, vous devriez lire Raymond Chen sur le sujet. P>
Sous Windows, au niveau du système, la ligne de commande est transmise au programme lancé en une seule chaîne UTF-16, de sorte que toutes les citations saisies dans la coquille sont passés comme il est. Ainsi, les guillemets doubles de votre exemple ne sont pas supprimés. Ceci est tout à fait différent du monde où la coquille Posix fait le travail d'analyse syntaxique et le programme lancé reçoit un tableau de chaînes. P>
Je viens de décrire le comportement au niveau du système. Cependant, entre votre C (ou votre Perl) programme, il est généralement la C bibliothèque standard analyse de la chaîne de ligne de commande du système pour donner à Pour en savoir plus sur la bizarreries analyse syntaxique ligne de commande Windows, lisez ce qui suit: p>
Vous pouvez également être intéressé par le code de l'emballage I écrit Padre sur Win32: il est un programme GUI (qui moyens qu'il ne sera pas ouvert une console si lancée à partir du menu Démarrer) appelé Notez qu'en raison du fait que le client est responsable de l'analyse syntaxique, chaque client client peut le faire la façon dont il veut. Beaucoup laisser les libc, mais pas tous. Ainsi les règles de génération de ligne de commande générique sous Windows ne peuvent pas exister: la règle dépendent du programme lancé.
Vous pouvez toujours être intéressé par "best effort" mise en œuvre tels que Win32 :: shellquote . < / p> principal () code> ou
wmain () code > comme
argv [] code>. Ceci se fait dans votre processus, mais vous pouvez toujours accéder à la chaîne de ligne de commande originale avec
GetCommandLineW () code>
si vous voulez vraiment contrôler la façon dont l'analyse est effectuée, ou obtenir la chaîne complète dans son encodage UTF-16. < / p>
padre.exe code> qui intègre perl pour lancer le
padre code> script Perl. Il fait aussi une petite astuce: il change
argv [0] code> pour pointer vers
perl.exe code> pour que
$ ^ X code> sera quelque chose utile pour lancer des scripts Perl externes. p>
execv code> que vous utilisez dans votre exemple de code est juste une émulation dans la bibliothèque C du comportement POSIX semblable. En particulier, il ne sera pas ajouter des guillemets autour de vos arguments pour que le lancement perl fonctionne comme prévu. Vous devez faire vous-même. P>