Comment puis-je démarrer une console interactive pour Perl?

Réponses:

297

Vous pouvez utiliser le débogueur perl sur un programme trivial, comme ceci:

perl -de1

Sinon, il y a l' application Perl Console d' Alexis Sukrieh , mais je ne l'ai pas utilisée.

Daniel Papasian
la source
28
Si vous voulez quelque chose de minimalement utilisable, pensez à ajouter rlwrap $ rlwrap perl -d -e 1 Vous obtiendrez l'historique et une invite cohérente
albfan
control+ Lne fonctionne pas sous cette interface de commande, comment dois-je rafraîchir l'écran?
Zen
1
Avec le recul: la réponse de Ján Sáreník semble fournir la meilleure solution presque prête à l'emploi (vous devrez peut-être installer rlwrap). Toutes les solutions REPL / console tierces, y compris perlconsole, sont lourdes à installer et ont souvent plus de limitations.
mklement0
3
Malheureusement, perl -de1ne semble pas prendre en charge les myvariables, et les hachages ne fonctionnent pas non plus, pour une raison quelconque
Geremia
1
perlconsolene souffre pas de ces problèmes.
Geremia
60

Non seulement Matt Trout a écrit un article sur un REPL, mais il en a également écrit un - Devel :: REPL

Je l'ai un peu utilisé et cela fonctionne assez bien, et il est en cours de développement actif.

BTW, je n'ai aucune idée pourquoi quelqu'un a modifié la personne qui a mentionné l'utilisation de "perl -e" à partir de la console. Ce n'est pas vraiment un REPL, c'est vrai, mais c'est incroyablement utile, et je l'utilise tout le temps.

Dave Rolsky
la source
Je pense qu'il était supposé que je ne comprenais pas la question. Je suppose que je vais le modifier un peu. ;-)
Jon Ericson
À la mi-2015: la simple exécution [sudo] cpan Devel::REPLn'a pas fonctionné pour moi, ni sur OSX 10.10 (Perl 5.18.2) ni sur Ubuntu 14.04 (Perl 5.18.2): je reçois des erreurs d'exécution se plaignant des modules manquants; installé un, puis abandonné après qu'un autre module manquant a été signalé.
mklement0
@ mklement0 Il existe un paramètre cpan pour télécharger et créer automatiquement les modules prérequis. Vous devrez peut-être activer ce paramètre. Alternativement, l'application zero-config cpanminus peut être une meilleure option.
Starfish
@Starfish: Merci; pour faire gagner du temps aux futurs lecteurs (car il semble que la réponse soit courte): comment activer ce paramètre?
mklement0
1
Soit dit en passant, Matt Trout, l' re.plauteur, a écrit un article énumérant plusieurs alternatives, et il suggère lui-même d'utiliser à la replyplace de re.pl: shadow.cat/blog/matt-s-trout/mstpan-17
Denilson Sá Maia
36

J'ai écrit un script que j'appelle "psh":

#! /usr/bin/perl

while (<>) {
  chomp;
  my $result = eval;
  print "$_ = $result\n";
}

Quoi que vous tapiez, il évalue en Perl:

> gmtime(2**30)
gmtime(2**30) = Sat Jan 10 13:37:04 2004

> $x = 'foo'
$x = 'foo' = foo

> $x =~ s/o/a/g
$x =~ s/o/a/g = 2

> $x
$x = faa
raldi
la source
4
Cela fonctionne-t-il pour un seul liners ou peut-il gérer du code Perl multiligne comme une branche conditionnelle, des boucles, des instructions imbriquées?
David
23

Si vous voulez l'historique, utilisez rlwrap . Cela pourrait être votre ~/bin/ipsexemple:

#!/bin/sh
echo 'This is Interactive Perl shell'
rlwrap -A -pgreen -S"perl> " perl -wnE'say eval()//$@'

Et voici à quoi ça ressemble:

$ ips
This is Interactive Perl shell
perl> 2**128
3.40282366920938e+38
perl> 
Ján Sáreník
la source
4
Félicitations pour avoir bien résumé - le support de la ligne de lecture n'est pas seulement nécessaire pour l'historique, mais aussi pour éditer la ligne de commande. À l'exception de la prise en charge multi-lignes, cela fonctionne bien; voici une version d'alias comme alternative: alias iperl='rlwrap -A -S "perl> " perl -wnE '\''say eval()//$@'\'. Les utilisateurs d'OSX peuvent installer rlwrapvia Homebrew avec brew install rlwrap.
mklement0
Voici une version qui donne une belle sortie lorsque l'expression s'évalue à une liste ou une référence:rlwrap -A -pgreen -S'perl> ' perl -MData::Dumper -wnE'say Dumper[eval()]//$@'
michau
21

Je pense que vous posez des questions sur une interface REPL (lecture, évaluation, impression, boucle) pour Perl. Il y a quelques façons de le faire:

  • Matt Trout a un article qui décrit comment en écrire un
  • Adriano Ferreira a décrit quelques options
  • et enfin, vous pouvez sauter sur IRC sur irc.perl.org et essayer l'un des robots d'évaluation dans de nombreuses chaînes populaires. Ils évalueront les morceaux de perl que vous leur passerez.
amoore
la source
1
L'article de Matt Trout est en panne depuis quelques années, vous pouvez le trouver ici: web.archive.org/web/20100212100032/http://chainsawblues.vox.com/…
lepe
1
Matt Trout a maintenant une liste beaucoup plus à jour de REPL qu'il recommande: shadow.cat/blog/matt-s-trout/mstpan-17
Davor Cubranic
20

J'utilise la ligne de commande comme console:

$ perl -e 'print "JAPH\n"'

Ensuite, je peux utiliser mon historique bash pour récupérer les anciennes commandes. Cela ne préserve cependant pas l'état.

Ce formulaire est très utile lorsque vous souhaitez tester "une petite chose" (comme lorsque vous répondez à des questions Perl). Souvent, je trouve que ces commandes sont récupérées textuellement dans un script shell ou un makefile.

Jon Ericson
la source
1
Avec certains obus, fishvous n'avez même pas besoin de \n.
trysis
15

Il n'y a pas de console interactive pour Perl intégrée comme le fait Python. Vous pouvez cependant utiliser le débogueur Perl pour effectuer des tâches liées au débogage. Vous l'allumez avec l'option -d, mais vous voudrez peut-être consulter 'man perldebug' pour en savoir plus.

Après un peu de recherche sur Google, il existe un projet distinct qui implémente une console Perl que vous pouvez trouver sur http://www.sukria.net/perlconsole.html .

J'espère que cela t'aides!

Frank Wiles
la source
Étrange que cette réponse n'ait reçu aucun vote positif, même si elle était antérieure à la réponse acceptée et fournit également un peu plus d'informations. +1
Junuxx
14

Vous pouvez toujours simplement passer dans le débogueur intégré et exécuter des commandes à partir de là.

   perl -d -e 1
Clinton Pierce
la source
13

Il existe deux REPL Perl populaires.

  1. Devel :: REPL est super.
  2. Mais la réponse IMO est meilleure.
Eric Johnson
la source
7
+1 pour recommander une réponse. L'auteur de Devel :: REPL lui-même a recommandé Reply plutôt que sa propre solution lorsque je pose des questions sur une bonne Perl REPL (console) sur IRC. Reply est également livré avec l'auto-complétion qui est très pratique pour inspecter les méthodes et les attributs disponibles d'un objet. Je pourrais installer Répondre sur Ubuntu avec la commande suivante: sudo apt-get install libreply-perl. Ensuite, il peut être exécuté simplement en tapant replydans un terminal.
Apteryx
Comment installer amd run Reply? Ni le Metacpan ni la page Github ne fournissent d'instructions.
Philippe
12

J'ai créé perliun REPL Perl qui fonctionne sous Linux, macOS et Windows .

Son objectif est l'impression automatique des résultats, des recherches de documentation pratiques et une inspection facile des correspondances d'expressions régulières.
Vous pouvez voir des captures d'écran ici .

Il fonctionne de manière autonome (n'a pas de dépendances autres que Perl lui-même), mais l' installation de rlwrapest fortement recommandée afin de prendre en charge l'édition en ligne de commande, l'historique persistant des commandes et la complétion des tabulations - en savoir plus ici .

Installation

  • S'il vous arrive d'avoir Node.js installé:

    npm install -g perli
  • Autrement:

    • Plates-formes de type Unix : téléchargez ce script dans perliun dossier dans le chemin de votre système et rendez-le exécutable avec chmod +x.

    • Windows : téléchargez le script en tant que perli.pl(notez l' .plextension) dans un dossier dans le chemin de votre système.
      Si cela ne vous dérange pas d'invoquer Perli as perli.pl, vous êtes prêt.
      Sinon, créez un fichier de commandes nommé perli.cmddans le même dossier avec le contenu suivant: @%~dpn.pl %*; cela permet une invocation aussi juste perli.

mklement0
la source
1
J'aime qu'il puisse se lancer à perldocpartir de perliREPL comme 'someCommand ?'. Il semble que cela n'ait pas été mis à jour depuis un certain temps, maintenez-vous toujours perli?
sdkks
1
@sdkks: Si vous rencontrez un problème, signalez-le sur GitHub et je vais essayer de le résoudre. perlin'a pas été mis à jour depuis un certain temps, car dans mon utilisation personnelle, je n'ai rencontré aucun problème, et peu d'autres personnes semblent l'utiliser, mais, pour autant que je sache, cela fonctionne toujours comme annoncé.
mklement0
7

J'ai toujours fait:

rlwrap perl -wlne'eval;print$@if$@'

Avec 5.10, je suis passé à:

rlwrap perl -wnE'say eval()//$@'

(rlwrap est facultatif)

ysth
la source
6

perl -d est votre ami:

% perl -de 0
Brian Phillips
la source
5

Boucle lecture-évaluation-impression:

$ perl -e'while(<>){print eval,"\n"}'
KIM Taegyoon
la source
4

Perl n'a pas de console mais le débogueur peut être utilisé comme tel. À une invite de commandes, tapez perl -de 1. (La valeur "1" n'a pas d'importance, c'est juste une déclaration valide qui ne fait rien.)

Il existe également quelques options pour un shell Perl .

Pour plus d'informations, lisez perlfaq3 .

Michael Carman
la source
4

Vous pouvez consulter psh ici: http://gnp.github.io/psh/

C'est un shell complet (vous pouvez l'utiliser en remplacement de bash par exemple), mais utilise la syntaxe perl .. vous pouvez donc créer des méthodes à la volée, etc.

étagère
la source
3

Sous Debian / Ubuntu:

$ sudo apt-get install libdevel-repl-perl
$ re.pl

$ sudo apt-get install libapp-repl-perl
$ iperl
gavenkoa
la source
3

La vue d' ensemble de Matt Trout énumère cinq choix, à perl -de 0partir de maintenant, et il recommande Reply, si l'extensibilité via des plugins est importante, ou à tinyreplpartir de Eval::WithLexicals, pour une solution minimale, pure-perl qui inclut le support de la ligne de lecture et la persistance lexicale.

Davor Cubranic
la source
2

Mise à jour: j'ai depuis créé un REPL téléchargeable - voir mon autre réponse .

Avec le recul:

  • Les solutions tierces mentionnées parmi les réponses existantes sont soit lourdes à installer et / ou ne fonctionnent pas sans étapes supplémentaires non triviales et non évidentes - certaines solutions semblent au moins à moitié abandonnées.
  • Un REPL utilisable a besoin de la bibliothèque readline pour la prise en charge du clavier de modification de la ligne de commande et la prise en charge de l'historique - ce qui garantit qu'il s'agit d'un problème pour de nombreuses solutions tierces.
  • Si vous installez CLI rlwrap, qui fournit une prise en charge de la ligne de lecture à n'importe quelle commande, vous pouvez la combiner avec une simple commande Perl pour créer un REPL utilisable , et ainsi vous passer de solutions REPL tierces.
    • Sur OSX, vous pouvez installer rlwrapvia Homebrew avec brew install rlwrap.
    • Les distributions Linux devraient offrir rlwrapvia leurs gestionnaires de paquets respectifs; par exemple, sur Ubuntu, utilisez sudo apt-get install rlwrap.
    • Voir la réponse de Ján Sáreník pour cette combinaison de rlwrapet une commande Perl.

Ce que vous n'obtenez PAS avec la réponse de Ján:

  • auto-complétion
  • pouvoir saisir des relevés multilignes

La seule solution tierce qui les propose (avec une installation non triviale + étapes supplémentaires non évidentes), est psh , mais:

  • il n'a pas vu d'activité depuis environ 2,5 ans

  • son objectif est différent en ce qu'il vise à être un véritable remplacement de la coque , et fonctionne ainsi comme une coquille traditionnelle, ce qui signifie qu'il n'évalue pas automatiquement une commande en tant que Perl déclaration, et nécessite une commande de sortie explicite, comme printà imprimer le résultat d'une expression.


La réponse de Ján Sáreník peut être améliorée d'une manière:

  • Par défaut, il imprime les tableaux / listes / tables de hachage sous forme de scalaires , c'est-à-dire qu'il imprime uniquement leur nombre d'éléments , alors qu'il serait pratique d'énumérer leurs éléments à la place.

Si vous installez le Data::Printermodule avec [sudo] cpan Data::Printerune opération unique, vous pouvez le charger dans le REPL pour utiliser la p()fonction, à laquelle vous pouvez transmettre des listes / tableaux / tables de hachage pour l'énumération.

Voici un alias nommé iperlavec readline et Data::Printersupport , que vous pouvez mettre dans le fichier d'initialisation de votre shell de type POSIX (par exemple, ~/.bashrc):

alias iperl='rlwrap -A -S "iperl> " perl -MData::Printer -wnE '\''BEGIN { say "# Use `p @<arrayOrList>` or `p %<hashTable>` to print arrays/lists/hashtables; e.g.: `p %ENV`"; } say eval()//$@'\'

Par exemple, vous pouvez ensuite effectuer les opérations suivantes pour imprimer toutes les variables d'environnement via une table de hachage %ENV:

$ iperl        # start the REPL
iperl> p %ENV  # print key-value pairs in hashtable %ENV

Comme pour la réponse de Ján, le résultat scalaire d'une expression est automatiquement imprimé; par exemple:

iperl> 22 / 7  # automatically print scalar result of expression: 3.14285714285714
mklement0
la source
0

Sepia et PDE ont également leurs propres REPL (pour GNU Emacs).


la source