From philippe.delavalade at orange.fr Thu Nov 5 07:19:44 2020 From: philippe.delavalade at orange.fr (Philippe Delavalade) Date: Thu, 5 Nov 2020 07:19:44 +0100 Subject: [Perl] Question sur qx Message-ID: <20201105061944.GA8388@messier31.machin.org> Bonjour la liste. Avec bash, on peut récupérer un caractère frappé au clavier sans qu'il soit suivi de . Avec 'read -n 1 l'., le caractère frappé est dans la variable 'l'. Dans un script perl j'essaie de faire la même chose avec la ligne $c=qx{read -n 1 -p "un message " l} mais $c ne contient pas le caractère frappé au clavier. l'aide de perldoc sur qx ne m'a pas permis d'avancer. Je passe sûrement à côté d'un truc simple mais... Merci par avance de votre aide. -- Philippe From ponder.stibbons at orange.fr Thu Nov 5 07:39:59 2020 From: ponder.stibbons at orange.fr (Jean) Date: Thu, 5 Nov 2020 07:39:59 +0100 Subject: [Perl] Question sur qx In-Reply-To: <20201105061944.GA8388@messier31.machin.org> References: <20201105061944.GA8388@messier31.machin.org> Message-ID: Le 05/11/2020 à 07:19, Philippe Delavalade a écrit : > Bonjour la liste. > > Avec bash, on peut récupérer un caractère frappé au clavier sans qu'il soit > suivi de . > > Avec 'read -n 1 l'., le caractère frappé est dans la variable 'l'. > > Dans un script perl j'essaie de faire la même chose avec la ligne > $c=qx{read -n 1 -p "un message " l} > mais $c ne contient pas le caractère frappé au clavier. l'aide de perldoc > sur qx ne m'a pas permis d'avancer. > > Je passe sûrement à côté d'un truc simple mais... > > Merci par avance de votre aide. > Dans "De l'art de programmer en Perl" (ou dans "Perl Best Practices"), Damian Conway présente son module IO::Prompt avec, entre autres, l'exemple : my $reponse = prompt 'Quitter réellement (o/n) ? ', -one_char; exit if lc($reponse) eq 'o'; En regardant dans https://metacpan.org/pod/IO::Prompt, il est marqué qu'il faut utiliser IO::Prompter à la place. Je ne sais pas s'il y a un équivalent pour -one_char. Bonne chance pour chercher dans la documentation. Ou alors, utilise quand même l'ancien IO::Prompt. Jean From sebastien at feugere.net Thu Nov 5 08:27:22 2020 From: sebastien at feugere.net (=?ISO-8859-1?Q?S=E9bastien_Feug=E8re?=) Date: Thu, 05 Nov 2020 08:27:22 +0100 Subject: [Perl] Question sur qx In-Reply-To: <20201105061944.GA8388@messier31.machin.org> References: <20201105061944.GA8388@messier31.machin.org> Message-ID: <6216FB34-08B4-48D8-86AE-F4CCCADC61E5@feugere.net> Il faut utiliser l'option -single https://metacpan.org/pod/IO::Prompter#Single-character-input Le 5 novembre 2020 07:19:44 GMT+01:00, Philippe Delavalade a écrit : >Bonjour la liste. > >Avec bash, on peut récupérer un caractère frappé au clavier sans qu'il soit >suivi de . > >Avec 'read -n 1 l'., le caractère frappé est dans la variable 'l'. > >Dans un script perl j'essaie de faire la même chose avec la ligne >$c=qx{read -n 1 -p "un message " l} >mais $c ne contient pas le caractère frappé au clavier. l'aide de perldoc >sur qx ne m'a pas permis d'avancer. > >Je passe sûrement à côté d'un truc simple mais... > >Merci par avance de votre aide. > >-- >Philippe >_______________________________________________ >Perl mailing list >Perl at mongueurs.net >http://listes.mongueurs.net/mailman/listinfo/perl >Attention, les archives sont publiques -- Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté. -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From olivier.mengue at gmail.com Thu Nov 5 10:39:41 2020 From: olivier.mengue at gmail.com (=?UTF-8?Q?Olivier_Mengu=C3=A9?=) Date: Thu, 5 Nov 2020 10:39:41 +0100 Subject: [Perl] Question sur qx In-Reply-To: <20201105061944.GA8388@messier31.machin.org> References: <20201105061944.GA8388@messier31.machin.org> Message-ID: Bonjour Philippe, L'opérateur qx capture ce qui est envoyé par la commande sur la sortie standard. Voyons donc ce qui est envoyé sur la sortie standard. Pour cela il suffit de comparer les deux commandes suivantes depuis un shell : read -n 1 -p "un message " l read -n 1 -p "un message " l >/dev/null La première commande laisse passer ce qui est envoyé sur la sortie standard pour l'envoyer vers le terminal, tandis que la seconde l'envoie à la poubelle. Résultat : les affichages sur le terminal sont identiques. Pourquoi ? Parce que la commande n'écrit rien sur la sortie standard. Le caractère tapé (qui est affiché) n'est d'ailleurs pas envoyé par la commande. C'est juste le comportement normal du terminal où les caractères tapés sont répliqués à l'affichage (Notez qu'il existe un moyen de désactiver ce comportement, par exemple pour la saisie de mot de passe). Donc forcément, qx ne capture rien. Je t'invite à relire le manuel de la commande "read". C'est d'ailleurs une commande spéciale : c'est un "shell builtin", c'est à dire une commande interne. C'est donc dans la documentation de ton shell que tu trouveras ces informations : "man bash", puis chercher dans la section "SHELL BUILTIN COMMANDS". En ligne et en français ici : https://man.cx/bash(1)/fr#heading31 Que fait cette commande "read" : elle lit des caractères sur l'entrée standard (connectée par défaut au terminal) et stocke le résultat dans une variable d'environnement, en l'occurence "l" puisque c'est le nom donné sur la ligne de commande. Comme c'est une commande interne, la valeur lue reste dans l'environnement privé du shell. Il faut trouver un moyen de la communiquer à l'extérieur. Il suffit pour cela de demander l'affichage du contenu de cette variable. Avec la commande "printf" (pour qu'il n'y ait pas de \n ajouté comme avec "echo"). { read -n 1 -p "un message " l ; printf %s $l; } { read -n 1 -p "un message " l ; printf %s $l; } > /dev/null Cette fois il y a bien une différence entre les deux commandes : la première affiche bien le résultat. Note: les accolades autour des deux commandes permettent de les grouper afin de gérer la redirection pour les deux commandes (read, printf) ensembles. Il est donc maintenant possible d'utiliser qx (notez qu'il faut échapper les % et les $) : $c=qx{read -n 1 -p "un message " l; printf \%s \$l}; Exemple : perl -E '$c=qx{read -n 1 -p "un message " l; printf \%s \$l}; say "\nCaractère lu: [$c]"' J'ai écrit tout ceci pour expliquer ce qui se passe. Mais ce n'est absolument pas la bonne façon d'écrire du Perl. Voici pourquoi. La raison principale est que le script Perl lance un shell qui va exécuter deux commandes. - ces deux commandes sont des commandes internes du shell. Donc le programme perl dépend du shell utilisé dans l'environnement où le script est exécuté. Si le shell de l'utilisateur est fish au lieu de bash, ou si le script est exécuté sous Windows, le script ne marchera plus. - le fait de lancer un shell (c.à.d. un nouveau processus) pour faire l'opération est un gaspillage des ressources de l'ordinateur. If faut donc plutôt chercher une solution en pur Perl qui sera à la fois plus portable et plus efficace. La fonction sysread (perldoc -f sysread) permet directement de lire des octets. Essayons : perl -E 'print "un message "; sysread(STDIN, $c, 1); say "\nCaractère lu: [$c]"' Est-ce que ça marche ? Non. Deux problèmes : 1. le message "un message " n'est pas affiché avant la saisie. Problème avec STDOUT. 2. le programme lit bien un caractère, mais il est bloqué tant que l'on ne tape pas Entrée. Problème avec STIN. Ces deux problèmes sont liés aux mécanismes d'échange des programmes avec le terminal : le buffering. C'est un mécanisme qui date d'une époque où l'on voulait réduire optimiser les communications avec le terminal et pour cela réduire les échanges en envoyant et recevant des lignes complètes plutôt que caractère par caractère. Donc en sortie le contenu n'est envoyé au terminal que lorsqu'on envoye un saut de ligne, et en entrée le terminal n'envoie ce qui a été tapé que lorsque la touche Entrée est appuyée. Nous avons donc besoin de désactiver ces deux mécanismes pour que notre programme fonctionne correctement. Pour l'entrée, il faut activer l"autoflush" (voir perldoc IO::Handle). https://metacpan.org/pod/IO::Handle Pour la sortie, on peut utiliser Term::ReadKey qui permet de contrôler le terminal. https://metacpan.org/pod/Term::ReadKey ReadMode 'cbreak'; # pour désactiver le buffering ReadMode 'normal'; # pour le réactiver perl -MTerm::ReadKey -E 'STDOUT->autoflush(1); print "un message "; ReadMode 'cbreak'; sysread(STDIN, $c, 1); ReadMode 'normal'; say "\nCaractère lu: [$c]"' Mais tout ceci est géré par le module IO::Prompt, alors autant l'utiliser. https://metacpan.org/pod/IO::Prompt Olivier. Le jeu. 5 nov. 2020 à 07:19, Philippe Delavalade < philippe.delavalade at orange.fr> a écrit : > Bonjour la liste. > > Avec bash, on peut récupérer un caractère frappé au clavier sans qu'il soit > suivi de . > > Avec 'read -n 1 l'., le caractère frappé est dans la variable 'l'. > > Dans un script perl j'essaie de faire la même chose avec la ligne > $c=qx{read -n 1 -p "un message " l} > mais $c ne contient pas le caractère frappé au clavier. l'aide de perldoc > sur qx ne m'a pas permis d'avancer. > > Je passe sûrement à côté d'un truc simple mais... > > Merci par avance de votre aide. > > -- > Philippe > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl > Attention, les archives sont publiques > -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From philippe.delavalade at orange.fr Fri Nov 6 12:16:38 2020 From: philippe.delavalade at orange.fr (Philippe Delavalade) Date: Fri, 6 Nov 2020 12:16:38 +0100 Subject: [Perl] Question sur qx In-Reply-To: <6216FB34-08B4-48D8-86AE-F4CCCADC61E5@feugere.net> References: <20201105061944.GA8388@messier31.machin.org> <6216FB34-08B4-48D8-86AE-F4CCCADC61E5@feugere.net> Message-ID: <20201106111638.GA2795@messier31.machin.org> Merci pour les réponses. J'obtiens tout à fait ce que j'espérais (et même plus) avec IO::Prompter. Cela dit, pourquoi ça ne marchait pas avec qx{read...} ? Mes excuses à Sébastien pour le message à la mauvaise adresse (la sienne et non celle de la liste) Encore merci. -- Philippe From olivier.mengue at gmail.com Fri Nov 6 19:03:22 2020 From: olivier.mengue at gmail.com (=?UTF-8?Q?Olivier_Mengu=C3=A9?=) Date: Fri, 6 Nov 2020 19:03:22 +0100 Subject: [Perl] Question sur qx In-Reply-To: <20201106111638.GA2795@messier31.machin.org> References: <20201105061944.GA8388@messier31.machin.org> <6216FB34-08B4-48D8-86AE-F4CCCADC61E5@feugere.net> <20201106111638.GA2795@messier31.machin.org> Message-ID: Le ven. 6 nov. 2020 à 12:16, Philippe Delavalade < philippe.delavalade at orange.fr> a écrit : > Merci pour les réponses. > > J'obtiens tout à fait ce que j'espérais (et même plus) avec IO::Prompter. > > Cela dit, pourquoi ça ne marchait pas avec qx{read...} ? > Tu n'as manifestement pas lu ma réponse ultra-détaillée. Olivier. -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From philippe.delavalade at orange.fr Sat Nov 7 10:09:56 2020 From: philippe.delavalade at orange.fr (Philippe Delavalade) Date: Sat, 7 Nov 2020 10:09:56 +0100 Subject: [Perl] Question sur qx In-Reply-To: References: <20201105061944.GA8388@messier31.machin.org> <6216FB34-08B4-48D8-86AE-F4CCCADC61E5@feugere.net> <20201106111638.GA2795@messier31.machin.org> Message-ID: <20201107090956.GA9257@messier31.machin.org> Le vendredi 06 novembre à 19:03, Olivier Mengué a écrit : > Le ven. 6 nov. 2020 à 12:16, Philippe Delavalade < > philippe.delavalade at orange.fr> a écrit : > > > Merci pour les réponses. > > > > J'obtiens tout à fait ce que j'espérais (et même plus) avec IO::Prompter. > > > > Cela dit, pourquoi ça ne marchait pas avec qx{read...} ? > > > > Tu n'as manifestement pas lu ma réponse ultra-détaillée. Je ne l'ai pas reçue, ceci expliquant cela. Je suis désolé. Je vais essayer d'aller sur les archives. > > Olivier. -- Philippe From philippe.delavalade at orange.fr Sat Nov 7 12:18:08 2020 From: philippe.delavalade at orange.fr (Philippe Delavalade) Date: Sat, 7 Nov 2020 12:18:08 +0100 Subject: [Perl] Question sur qx In-Reply-To: References: <20201105061944.GA8388@messier31.machin.org> <6216FB34-08B4-48D8-86AE-F4CCCADC61E5@feugere.net> <20201106111638.GA2795@messier31.machin.org> Message-ID: <20201107111808.GA9818@messier31.machin.org> Rebonjour Olivier et tous. Dans les archives, je viens de lire ta réponse détaillée et fort instructive. J'avais essayé $c=qx{ read... && echo \$l} mais ça ne fonctionnait pas. Je voudrais récupérer le message sur les archives mais je ne sais pas comment faire. Quelle est la procédure (si c'est possible) ? Encore merci. -- Philippe From pdupre at gmx.com Fri Nov 13 11:47:57 2020 From: pdupre at gmx.com (Patrick Dupre) Date: Fri, 13 Nov 2020 11:47:57 +0100 Subject: [Perl] in in Makefile.PL Message-ID: Bonjour, Est-ce que je peux faire my $var = 'B' ; if ($var == 'A') { } in a Makefile.PL ? En fait le test est toujours positif ? de meme elsif n'est pas autorise =========================================================================== Patrick DUPRÉ | | email: pdupre at gmx.com Laboratoire interdisciplinaire Carnot de Bourgogne 9 Avenue Alain Savary, BP 47870, 21078 DIJON Cedex FRANCE Tel: +33 (0)380395988 =========================================================================== From laurent.rosenfeld at googlemail.com Fri Nov 13 11:55:40 2020 From: laurent.rosenfeld at googlemail.com (Laurent Rosenfeld) Date: Fri, 13 Nov 2020 11:55:40 +0100 Subject: [Perl] in in Makefile.PL In-Reply-To: References: Message-ID: Bonjour, essaie: if ($var eq 'A') { Le ven. 13 nov. 2020 à 11:48, Patrick Dupre a écrit : > Bonjour, > > Est-ce que je peux faire > my $var = 'B' ; > if ($var == 'A') { > } > > in a Makefile.PL ? > > En fait le test est toujours positif ? > > de meme > elsif > n'est pas autorise > > > =========================================================================== > Patrick DUPRÉ | | email: pdupre at gmx.com > Laboratoire interdisciplinaire Carnot de Bourgogne > 9 Avenue Alain Savary, BP 47870, 21078 DIJON Cedex FRANCE > Tel: +33 (0)380395988 > =========================================================================== > > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl > Attention, les archives sont publiques > -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: From olivier.thauvin at latmos.ipsl.fr Fri Nov 13 11:53:12 2020 From: olivier.thauvin at latmos.ipsl.fr (Olivier Thauvin) Date: Fri, 13 Nov 2020 11:53:12 +0100 Subject: [Perl] in in Makefile.PL In-Reply-To: References: Message-ID: <6b0df890-b473-2d87-49c2-c851c45e05da@latmos.ipsl.fr> Le 13/11/2020 à 11:47, Patrick Dupre a écrit : > Bonjour, > > Est-ce que je peux faire > my $var = 'B' ; > if ($var == 'A') { > } > > in a Makefile.PL ? > > En fait le test est toujours positif ? > > de meme > elsif > n'est pas autorise Bonjour, Un Makefile c'est avant un script perl, donc tu fais ce que tu veux dedans, pourquoi tu ne pourrait pas faire ça ? Cordialement. -- Olivier Thauvin CNRS - LATMOS ? ? ? ? ? ? ? ? -------------- section suivante -------------- Une pièce jointe autre que texte a été nettoyée... Nom: smime.p7s Type: application/pkcs7-signature Taille: 4301 octets Desc: Signature cryptographique S/MIME URL: