Bagaimana saya bisa memulai konsol interaktif untuk Perl?

Jawaban:

297

Anda dapat menggunakan perl debugger pada program sepele, seperti:

perl -de1

Atau ada aplikasi Perl Console Alexis Sukrieh , tapi saya belum menggunakannya.

Daniel Papasian
sumber
27
Jika Anda menginginkan sesuatu yang minimal dapat digunakan, pertimbangkan untuk menambahkan rlwrap. $ rlwrap perl -d -e 1 Anda akan mendapatkan riwayat dan prompt yang konsisten
albfan
control+ Ltidak berfungsi di bawah antarmuka perintah ini, bagaimana cara menyegarkan layar?
Zen
1
Dengan manfaat dari tinjau balik: jawaban Ján Sáreník tampaknya memberikan solusi hampir-out-of-the-box terbaik (Anda mungkin harus menginstal rlwrap). Semua solusi REPL / konsol pihak ketiga, termasuk perlconsole, rumit untuk dipasang dan seringkali memiliki lebih banyak keterbatasan.
mklement0
3
Sayangnya, perl -de1tampaknya tidak mendukung myvariabel, dan hash juga tidak berfungsi, untuk beberapa alasan ...
Geremia
1
perlconsoletidak menderita masalah ini.
Geremia
60

Matt Trout tidak hanya menulis artikel tentang REPL, ia juga menulis satu - Devel :: REPL

Saya sudah menggunakannya sedikit dan bekerja dengan cukup baik, dan sedang dalam pengembangan aktif.

BTW, saya tidak tahu mengapa seseorang mengubah orang yang disebutkan menggunakan "perl -e" dari konsol. Ini sebenarnya bukan REPL, benar, tetapi ini sangat berguna, dan saya menggunakannya setiap saat.

Dave Rolsky
sumber
Saya pikir itu diasumsikan saya tidak mengerti pertanyaan itu. Saya kira saya akan mengeditnya sedikit. ;-)
Jon Ericson
Pada pertengahan 2015: Cukup menjalankan [sudo] cpan Devel::REPLtidak bekerja untuk saya, baik pada OSX 10.10 (Perl 5.18.2) maupun di Ubuntu 14.04 (Perl 5.18.2): Saya mendapatkan kesalahan runtime mengeluh tentang modul yang hilang; menginstal satu, lalu menyerah setelah modul lain yang hilang dilaporkan.
mklement0
@ mklement0 Ada pengaturan cpan untuk mengunduh dan membangun modul prasyarat secara otomatis. Anda mungkin perlu mengaktifkan pengaturan itu. Atau, aplikasi cpanminus zero-config mungkin merupakan opsi yang lebih baik.
Starfish
@ Starfish: Terima kasih; untuk menghemat waktu pembaca di masa mendatang (karena sepertinya jawabannya singkat): bagaimana Anda mengaktifkan pengaturan ini?
mklement0
1
By the way, Matt Trout, yang re.plpenulis, menulis sebuah artikel daftar beberapa alternatif, dan ia sendiri menyarankan menggunakan replybukan re.pl: shadow.cat/blog/matt-s-trout/mstpan-17
Denilson Sá Maia
36

Saya menulis skrip yang saya sebut "psh":

#! /usr/bin/perl

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

Apa pun yang Anda ketikkan, ia mengevaluasi dalam 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
sumber
4
Apakah ini hanya berfungsi untuk satu liner atau dapat menangani kode Perl multiline seperti percabangan bersyarat, loop, pernyataan bersarang?
David
23

Jika Anda ingin riwayat, gunakan rlwrap . Ini bisa menjadi milik Anda ~/bin/ipsmisalnya:

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

Dan seperti inilah tampilannya:

$ ips
This is Interactive Perl shell
perl> 2**128
3.40282366920938e+38
perl> 
Ján Sáreník
sumber
4
Kudos untuk membungkusnya dengan baik - dukungan readline tidak hanya diperlukan untuk histori, tetapi juga untuk mengedit baris perintah. Dengan pengecualian dukungan multi-line, ini berfungsi dengan baik; inilah versi alias sebagai alternatif: alias iperl='rlwrap -A -S "perl> " perl -wnE '\''say eval()//$@'\'. Pengguna OSX dapat menginstal rlwrapmelalui Homebrew with brew install rlwrap.
mklement0
Berikut adalah versi yang memberikan output yang bagus ketika ekspresi mengevaluasi ke daftar atau referensi:rlwrap -A -pgreen -S'perl> ' perl -MData::Dumper -wnE'say Dumper[eval()]//$@'
michau
21

Saya pikir Anda bertanya tentang antarmuka REPL (Read, Evaluate, Print, Loop) ke perl. Ada beberapa cara untuk melakukan ini:

  • Matt Trout memiliki artikel yang menjelaskan cara menulisnya
  • Adriano Ferreira telah menjelaskan beberapa opsi
  • dan akhirnya, Anda dapat naik IRC di irc.perl.org dan mencoba salah satu bot eval di banyak saluran populer. Mereka akan mengevaluasi potongan perl yang Anda berikan kepada mereka.
lebih baik
sumber
1
Artikel Matt Trout telah diturunkan sejak beberapa tahun yang lalu, Anda dapat menemukannya di sini: web.archive.org/web/20100212100032/http://chainsawblues.vox.com/…
lepe
1
Matt Trout sekarang memiliki daftar REPL yang jauh lebih mutakhir yang dia rekomendasikan: shadow.cat/blog/matt-s-trout/mstpan-17
Davor Cubranic
20

Saya menggunakan baris perintah sebagai konsol:

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

Lalu saya bisa menggunakan riwayat bash saya untuk mendapatkan kembali perintah lama. Namun, ini tidak melindungi negara.

Formulir ini paling berguna ketika Anda ingin menguji "satu hal kecil" (seperti saat menjawab pertanyaan Perl). Seringkali, saya menemukan perintah-perintah ini dikikis kata demi kata menjadi script shell atau makefile.

Jon Ericson
sumber
1
Dengan beberapa kerang, fishAnda bahkan tidak perlu \n.
trysis
15

Tidak ada konsol interaktif untuk Perl yang dibangun seperti halnya Python. Namun Anda dapat menggunakan Perl Debugger untuk melakukan debugging hal-hal terkait. Anda menyalakannya dengan opsi -d, tetapi Anda mungkin ingin memeriksa 'man perldebug' untuk mempelajarinya.

Setelah sedikit googling, ada proyek terpisah yang mengimplementasikan konsol Perl yang dapat Anda temukan di http://www.sukria.net/perlconsole.html .

Semoga ini membantu!

Frank Wiles
sumber
Aneh bahwa jawaban ini belum menerima upvotes apa pun, meskipun itu lebih awal dari jawaban yang diterima dan memberikan sedikit info lebih banyak juga. +1
Junuxx
14

Anda selalu bisa masuk ke debugger bawaan dan menjalankan perintah dari sana.

   perl -d -e 1
Clinton Pierce
sumber
13

Ada dua REPL Perl yang populer.

  1. Devel :: REPL hebat.
  2. Tapi Balas IMO lebih baik.
Eric Johnson
sumber
7
+1 untuk merekomendasikan Balas. Devel :: penulis REPL sendiri merekomendasikan Balas atas solusinya sendiri ketika saya bertanya tentang REPL (konsol) yang bagus di IRC. Balas juga dilengkapi dengan pelengkapan otomatis yang sangat berguna untuk memeriksa metode dan atribut objek yang tersedia. Saya bisa menginstal Balas di Ubuntu dengan perintah berikut: sudo apt-get install libreply-perl. Maka bisa dijalankan cukup mengetik replydi terminal.
Apteryx
Bagaimana Anda menginstal amd menjalankan Balas? Baik Metacpan, maupun halaman Github tidak memberikan instruksi.
Philippe
12

Saya telah membuat perli, REPL Perl yang berjalan di Linux, macOS, dan Windows .

Fokusnya adalah pencetakan hasil otomatis, pencarian dokumentasi yang mudah, dan pemeriksaan mudah terhadap kecocokan ekspresi reguler.
Anda dapat melihat tangkapan layar di sini .

Ia bekerja sendiri (tidak memiliki dependensi selain Perl sendiri), tetapi instalasi rlwrapsangat disarankan untuk mendukung pengeditan baris perintah, riwayat perintah persisten, dan penyelesaian tab - baca lebih lanjut di sini .

Instalasi

  • Jika Node.js Anda terinstal:

    npm install -g perli
  • Jika tidak:

    • Unix -seperti platform Download script ini sebagai perlisebuah folder dalam path sistem anda dan membuatnya dieksekusi dengan chmod +x.

    • Windows : Unduh skrip ini sebagai perli.pl(perhatikan .plekstensi) ke folder di jalur sistem Anda.
      Jika Anda tidak keberatan memanggil Perli sebagai perli.pl, Anda sudah siap.
      Jika tidak, membuat batch file bernama perli.cmddalam folder yang sama dengan konten berikut: @%~dpn.pl %*; ini memungkinkan doa sebagai adil perli.

mklement0
sumber
1
Saya suka itu bisa diluncurkan perldocdari perliREPL suka 'someCommand ?'. Sepertinya itu belum diperbarui untuk sementara waktu, apakah Anda masih mempertahankan perli?
SDK
1
@ skdkks: Jika Anda menemukan masalah, laporkan di GitHub dan saya akan mencoba memperbaikinya. perlibelum diperbarui dalam beberapa saat, karena dalam penggunaan pribadi saya, saya belum menemukan masalah, dan beberapa orang lain tampaknya menggunakannya, tetapi, sejauh yang saya tahu, masih berfungsi seperti yang diiklankan.
mklement0
7

Saya selalu melakukannya:

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

Dengan 5.10, saya telah beralih ke:

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

(rlwrap adalah opsional)

ysth
sumber
6

perl -d adalah temanmu:

% perl -de 0
Brian Phillips
sumber
6

re.pl dari Devel :: REPL


sumber
5

Baca-eval-print loop:

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

Perl tidak memiliki konsol tetapi debugger dapat digunakan sebagai satu. Pada prompt perintah, ketik perl -de 1. (Nilai "1" tidak masalah, itu hanya pernyataan valid yang tidak melakukan apa-apa.)

Ada juga beberapa opsi untuk shell Perl .

Untuk informasi lebih lanjut baca perlfaq3 .

Michael Carman
sumber
4

Anda dapat melihat psh di sini: http://gnp.github.io/psh/

Ini penuh pada shell (Anda dapat menggunakannya sebagai pengganti bash misalnya), tetapi menggunakan sintaks perl .. sehingga Anda dapat membuat metode dengan cepat dll.

raku
sumber
3

Di bawah Debian / Ubuntu:

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

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

Gambaran umum Matt Trout mencantumkan lima pilihan, mulai dari perl -de 0dan seterusnya, dan ia merekomendasikan Reply, jika ekstensibilitas melalui plugin itu penting, atau tinyrepldari Eval::WithLexicals, untuk solusi minimal, murni-perl yang mencakup dukungan readline dan kegigihan leksikal.

Davor Cubranic
sumber
2

Pembaruan: Sejak itu saya telah membuat REPL yang dapat diunduh - lihat jawaban saya yang lain .

Dengan manfaat tinjau balik:

  • The solusi pihak ketiga disebutkan di antara jawaban yang ada baik rumit untuk menginstal dan / atau tidak bekerja tanpa non-sepele, langkah-langkah tambahan non-jelas - beberapa solusi tampak setidaknya setengah-ditinggalkan.
  • REPL yang dapat digunakan membutuhkan pustaka bacaline untuk dukungan keyboard pengeditan baris perintah dan dukungan riwayat - memastikan ini adalah tempat yang bermasalah untuk banyak solusi pihak ketiga.
  • Jika Anda menginstal CLI rlwrap, yang menyediakan dukungan readline untuk perintah apa pun, Anda dapat menggabungkannya dengan perintah Perl sederhana untuk membuat REPL yang dapat digunakan , dan melakukannya tanpa solusi REPL pihak ketiga.
    • Di OSX, Anda dapat menginstal rlwrapmelalui Homebrew with brew install rlwrap.
    • Distro Linux harus menawarkan rlwrapmelalui manajer paket masing-masing; misalnya, di Ubuntu, gunakan sudo apt-get install rlwrap.
    • Lihat jawaban Ján Sáreník untuk kombinasi kata rlwrapdan perintah Perl.

Apa yang TIDAK Anda dapatkan dengan jawaban Ján:

  • pelengkapan otomatis
  • kemampuan untuk memasukkan pernyataan multi-baris

Satu-satunya solusi pihak ketiga yang menawarkan ini (dengan instalasi non-sepele + tambahan, langkah-langkah tidak jelas), adalah psh , tetapi:

  • belum terlihat aktivitas dalam sekitar 2,5 tahun

  • fokusnya berbeda dalam hal ini bertujuan untuk menjadi pengganti shell penuh , dan dengan demikian bekerja seperti shell tradisional, yang berarti bahwa ia tidak secara otomatis mengevaluasi perintah sebagai pernyataan Perl , dan memerlukan perintah output eksplisit seperti printuntuk cetak hasil ekspresi.


Jawaban Ján Sáreník dapat ditingkatkan dengan satu cara:

  • Secara default, ia mencetak array / daftar / hashtable sebagai skalar , yaitu, hanya mencetak jumlah elemen mereka , sedangkan akan lebih mudah untuk menghitung elemen mereka sebagai gantinya.

Jika Anda memasang Data::Printermodul dengan [sudo] cpan Data::Printersebagai operasi satu kali, Anda dapat memuatnya ke dalam REPL untuk penggunaanp() fungsi, yang Anda dapat lewati daftar / array / hashtables untuk enumerasi.

Berikut ini adalah alias bernama iperldengan readline dan Data::Printerdukungan , yang dapat Anda masukkan ke file inisialisasi shell mirip POSIX Anda (mis., ~/.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()//$@'\'

Misalnya, Anda dapat melakukan hal berikut untuk mencetak semua variabel lingkungan melalui hashtable %ENV:

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

Seperti halnya jawaban Ján, hasil skalar dari ekspresi dicetak secara otomatis ; misalnya:

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

Sepia dan PDE juga memiliki REPL sendiri (untuk GNU Emacs).


sumber