ฉันจะเริ่มคอนโซลการโต้ตอบสำหรับ Perl ได้อย่างไร


คำตอบ:


297

คุณสามารถใช้โปรแกรมดีบักเกอร์ perl กับโปรแกรมเบ็ดเตล็ดได้ดังนี้:

perl -de1

นอกจากนี้ยังมีแอพพลิเคชั่นPerl ConsoleของAlexis Sukriehแต่ฉันไม่ได้ใช้


27
หากคุณต้องการบางสิ่งบางอย่างที่ใช้งานได้น้อยที่สุดให้พิจารณาเพิ่มrlwrap $ rlwrap perl -d -e 1คุณจะได้รับประวัติและพร้อมท์ที่สอดคล้องกัน
albfan

control+ Lไม่ทำงานภายใต้อินเตอร์เฟสคำสั่งนี้ฉันจะรีเฟรชหน้าจอได้อย่างไร
เซน

1
ด้วยประโยชน์ของการเข้าใจถึงปัญหาหลังเหตุการณ์: คำตอบของJánSáreníkดูเหมือนจะให้ทางออกที่ดีที่สุดในกล่องเกือบหมด (คุณอาจต้องติดตั้งrlwrap) โซลูชัน REPL / console ของ บริษัท อื่นทั้งหมดรวมถึงperlconsoleมีปัญหาในการติดตั้งและมักจะมีข้อ จำกัด มากกว่า
mklement0

3
โชคperl -de1ไม่ดีที่ดูเหมือนจะไม่สนับสนุนmyตัวแปรและแฮชก็ใช้งานไม่ได้ด้วยเหตุผลบางอย่าง ...
Geremia

1
perlconsoleไม่ต้องทนทุกข์ทรมานจากปัญหาเหล่านี้
Geremia

60

Matt Trout ไม่เพียง แต่เขียนบทความเกี่ยวกับ REPL เท่านั้นเขายังเขียนหนึ่ง - Devel :: REPL

ฉันใช้มันไปสักหน่อยและใช้งานได้ดีและอยู่ในระหว่างการพัฒนา

BTW ฉันไม่รู้ว่าทำไมมีคนดัดแปลงคนที่พูดถึงการใช้ "perl -e" จากคอนโซล นี่ไม่ใช่ REPL จริง ๆ แต่มีประโยชน์น่าอัศจรรย์และฉันใช้มันตลอดเวลา


ฉันคิดว่ามันถูกสันนิษฐานว่าฉันไม่เข้าใจคำถาม ฉันเดาว่าฉันจะแก้ไขมันเล็กน้อย ;-)
Jon Ericson

ตั้งแต่กลางปี ​​2558: การใช้งานเพียงอย่าง[sudo] cpan Devel::REPLเดียวไม่ได้ผลสำหรับฉันทั้งใน OSX 10.10 (Perl 5.18.2) และ Ubuntu 14.04 (Perl 5.18.2): ฉันได้รับข้อผิดพลาดรันไทม์ที่บ่นเกี่ยวกับโมดูลที่หายไป; ติดตั้งแล้วยกเลิกหลังจากที่โมดูลที่หายไปอีกรายงาน
mklement0

@ mklement0 มีการตั้งค่า cpan เพื่อดาวน์โหลดและสร้างโมดูลสิ่งที่จำเป็นต้องมีโดยอัตโนมัติ คุณอาจต้องเปิดการตั้งค่านั้น หรือมิฉะนั้นแอปพลิเคชั่นzero-config cpanminusอาจเป็นตัวเลือกที่ดีกว่า
ปลาดาว

@Starfish: ขอบคุณ; เพื่อประหยัดเวลาผู้อ่านในอนาคต (เนื่องจากดูเหมือนว่าคำตอบอาจสั้น): คุณเปิดการตั้งค่านี้ได้อย่างไร
mklement0

1
โดยวิธีการที่ Matt Trout re.plผู้เขียนเขียนบทความรายการหลายทางเลือกและเขาแนะนำให้ใช้replyแทนre.pl: shadow.cat/blog/matt-s-trout/mstpan-17
Denilson Sá Maia

36

ฉันเขียนสคริปต์ที่ฉันเรียกว่า "psh":

#! /usr/bin/perl

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

สิ่งที่คุณพิมพ์เข้าจะประเมินเป็น 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

4
มันใช้งานได้กับหนึ่ง liners เท่านั้นหรือสามารถจัดการโค้ด Perl หลายบรรทัดเช่นการแยกทางเงื่อนไขลูปคำสั่งซ้อน
David

23

หากคุณต้องการบันทึกประวัติการใช้rlwrap นี่อาจเป็น~/bin/ipsตัวอย่างของคุณ:

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

และนี่คือลักษณะที่ปรากฏ:

$ ips
This is Interactive Perl shell
perl> 2**128
3.40282366920938e+38
perl> 

4
ความรุ่งโรจน์ของการห่อหุ้มอย่างดี - การสนับสนุน readline ไม่เพียง แต่จำเป็นสำหรับประวัติ แต่ยังสำหรับการแก้ไขบรรทัดคำสั่ง ด้วยข้อยกเว้นของการรองรับหลายบรรทัดสิ่งนี้ใช้ได้ดี alias iperl='rlwrap -A -S "perl> " perl -wnE '\''say eval()//$@'\'นี่เป็นรุ่นนามแฝงเป็นทางเลือก: ผู้ใช้สามารถติดตั้ง OSX rlwrapผ่านHomebrewbrew install rlwrapกับ
mklement0

นี่คือรุ่นที่ให้ผลลัพธ์ที่ดีเมื่อนิพจน์ประเมินค่าเป็นรายการหรือข้อมูลอ้างอิง:rlwrap -A -pgreen -S'perl> ' perl -MData::Dumper -wnE'say Dumper[eval()]//$@'
24425

21

ฉันคิดว่าคุณกำลังถามเกี่ยวกับอินเตอร์เฟซ REPL (อ่าน, ประเมิน, พิมพ์, วน) ไปยัง Perl มีสองสามวิธีในการทำสิ่งนี้:

  • Matt Trout มีบทความที่อธิบายวิธีการเขียน
  • Adriano Ferreira ได้อธิบายตัวเลือกบางอย่าง
  • และในที่สุดคุณสามารถกระโดดไปที่ IRC ที่ irc.perl.org และลองหนึ่งในบอท eval ในหลายช่องทางยอดนิยม พวกเขาจะประเมินชิ้นส่วนของ perl ที่คุณส่งให้พวกเขา

1
บทความของ Matt Trout หยุดทำงานมาหลายปีแล้วคุณสามารถหาอ่านได้ที่นี่: web.archive.org/web/20100212100032/http://chainsawblues.vox.com/…
lepe

1
ตอนนี้ Matt Trout มีรายชื่อ REPLs ที่ทันสมัยมากขึ้นซึ่งเขาแนะนำ: shadow.cat/blog/matt-s-trout/mstpan-17
Davor Cubranic

20

ฉันใช้บรรทัดคำสั่งเป็นคอนโซล:

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

จากนั้นฉันสามารถใช้ประวัติทุบตีของฉันเพื่อเรียกคืนคำสั่งเก่า อย่างไรก็ตามสิ่งนี้ไม่ได้รักษาสถานะไว้

แบบฟอร์มนี้มีประโยชน์มากที่สุดเมื่อคุณต้องการทดสอบ "สิ่งเล็กน้อย" (เช่นเมื่อตอบคำถาม Perl) บ่อยครั้งที่ฉันพบว่าคำสั่งเหล่านี้ทำให้คำต่อคำถูกคัดลอกลงในเชลล์สคริปต์หรือ makefile


1
ด้วยเปลือกหอยบางอย่างเช่นคุณไม่จำเป็นที่จะต้องfish \n
trysis

15

ไม่มีคอนโซลแบบโต้ตอบสำหรับ Perl ในตัวเหมือน Python อย่างไรก็ตามคุณสามารถใช้ Perl Debugger เพื่อทำการดีบั๊กที่เกี่ยวข้อง คุณเปิดใช้งานด้วยตัวเลือก -d แต่คุณอาจต้องการตรวจสอบ 'man perldebug' เพื่อเรียนรู้เกี่ยวกับมัน

หลังจาก googling นิดหน่อยมีโครงการแยกต่างหากที่ใช้คอนโซล Perl ซึ่งคุณสามารถหาได้ http://www.sukria.net/perlconsole.html

หวังว่านี่จะช่วยได้!


แปลกที่คำตอบนี้ยังไม่ได้รับ upvotes ใด ๆ แม้ว่าจะเป็นคำตอบที่ยอมรับก่อนหน้านี้แล้ว +1
Junuxx


13

Perl REPLs ยอดนิยมสองรายการ

  1. Devel :: REPLเยี่ยมมาก
  2. แต่การตอบกลับของ IMO นั้นดีกว่า

7
+1 สำหรับคำแนะนำการตอบกลับ Devel :: ผู้เขียนของ REPL แนะนำให้ใช้วิธีการแก้ปัญหาของตัวเองเมื่อฉันถามเกี่ยวกับ Perl REPL (คอนโซล) ที่ดีใน IRC การตอบกลับยังมาพร้อมกับการทำให้สมบูรณ์อัตโนมัติซึ่งมีประโยชน์มากสำหรับการตรวจสอบวิธีการและคุณสมบัติที่มีอยู่ของวัตถุ ฉันสามารถติดตั้งบน Ubuntu sudo apt-get install libreply-perlตอบกลับด้วยคำสั่งต่อไปนี้: จากนั้นมันสามารถเรียกใช้เพียงพิมพ์replyในเทอร์มินัล
Apteryx

คุณจะติดตั้งและเรียกใช้ตอบได้อย่างไร Metacpan และหน้า Github ไม่ได้ให้คำแนะนำ
ฟิลิปป์

12

ฉันได้สร้างperliเป็นPerl REPLที่ทำงานบนลินุกซ์, MacOS และ Windows

โฟกัสคือการพิมพ์ผลลัพธ์อัตโนมัติค้นหาเอกสารที่สะดวกและตรวจสอบการจับคู่นิพจน์ทั่วไปได้ง่าย
คุณสามารถดูภาพหน้าจอที่นี่

มันทำงานแบบสแตนด์อะโลน (ไม่มีการอ้างอิงอื่น ๆ กว่า Perl ตัวเอง) แต่การติดตั้งrlwrapขอแนะนำเพื่อให้การสนับสนุนการแก้ไขบรรทัดคำสั่งประวัติคำสั่งถาวรและแท็บเสร็จ - อ่านรายละเอียดเพิ่มเติมที่นี่

การติดตั้ง

  • หากคุณติดตั้ง Node.js:

    npm install -g perli
  • มิฉะนั้น:

    • Unixเหมือนแพลตฟอร์ม: ดาวน์โหลดสคริปต์นี้เป็นไปยังโฟลเดอร์ในเส้นทางของระบบของคุณและทำให้มันปฏิบัติการด้วยperlichmod +x

    • Windows : ดาวน์โหลดสคริปต์นี้เป็นperli.pl(จดบันทึก.plส่วนขยาย) ไปยังโฟลเดอร์ในเส้นทางของระบบของคุณ
      หากคุณไม่สนใจการเรียกใช้ Perli perli.plคุณก็พร้อมแล้ว
      มิฉะนั้นให้สร้างแบตช์ไฟล์ชื่อperli.cmdในโฟลเดอร์เดียวกันที่มีเนื้อหาดังต่อไปนี้: @%~dpn.pl %*; perliนี้จะช่วยให้การภาวนาเป็นเพียงแค่


1
ผมชอบมันสามารถเปิดperldocจากperliREPL 'someCommand ?'เช่น ดูเหมือนว่ายังไม่ได้รับการปรับปรุงในขณะที่คุณยังคงรักษามาตรฐาน?
sdkks

1
@sdkks: หากคุณพบปัญหาให้รายงานบน GitHubและฉันจะพยายามแก้ไข perliยังไม่ได้รับการอัปเดตในขณะที่เนื่องจากการใช้งานส่วนตัวของฉันฉันไม่ได้เจอปัญหาใด ๆ และดูเหมือนว่ามีคนไม่กี่คนที่ใช้มัน แต่เท่าที่ฉันรู้มันก็ยังทำงานได้ตามที่โฆษณาไว้
mklement0

7

ฉันมักจะทำ:

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

ด้วย 5.10 ฉันได้เปลี่ยนเป็น:

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

(rlwrap เป็นตัวเลือก)



6

re.pl จาก Devel :: REPL



4

Perl ไม่มีคอนโซล แต่ตัวดีบั๊กสามารถใช้เป็นหนึ่งได้ perl -de 1ที่พร้อมรับคำสั่งพิมพ์ (ค่า "1" ไม่สำคัญมันเป็นเพียงคำสั่งที่ถูกต้องที่ไม่ทำอะไรเลย)

นอกจากนี้ยังมีคู่ของตัวเลือกสำหรับการเป็นเปลือก Perl

สำหรับข้อมูลเพิ่มเติมอ่านperlfaq3


4

คุณสามารถดู psh ได้ที่นี่: http://gnp.github.io/psh/

มันเป็นแบบเต็มบนเชลล์ (คุณสามารถใช้มันแทนการทุบตี) แต่ใช้ไวยากรณ์ Perl .. เพื่อให้คุณสามารถสร้างวิธีการได้ทันที



3

ภาพรวมของ Matt Trout แสดงรายการตัวเลือกห้าตัวเลือกจากนั้นperl -de 0เป็นต้นไปและเขาแนะนำReplyว่าถ้าการขยายผ่านทางปลั๊กอินเป็นสิ่งสำคัญหรือtinyreplจากEval::WithLexicalsวิธีการแก้ปัญหา perl บริสุทธิ์ที่น้อยที่สุดซึ่งรวมถึงการสนับสนุน readline และการคงอยู่ของคำศัพท์


2

ปรับปรุง: ฉันได้ตั้งแต่สร้าง REPL ดาวน์โหลด - ดูคำตอบอื่น ๆ ของฉัน

ด้วยประโยชน์ของการเข้าใจถึงปัญหาหลังเหตุการณ์:

  • การแก้ปัญหาของบุคคลที่สามที่กล่าวถึงในหมู่คำตอบที่มีอยู่มีทั้งยุ่งยากในการติดตั้งและ / หรือจะไม่ได้ทำงานโดยไม่ต้องไม่เล็กน้อยขั้นตอนเพิ่มเติมที่ไม่ชัดเจน - แก้ปัญหาบางอย่างดูเหมือนจะเป็นอย่างน้อยครึ่งหนึ่งของที่ถูกทิ้งร้าง
  • REPL ใช้งานต้องการห้องสมุด ReadLine สำหรับบรรทัดคำสั่งแก้ไขสนับสนุนแป้นพิมพ์และการสนับสนุนประวัติศาสตร์ - สร้างความมั่นใจนี้เป็นจุดปัญหาสำหรับการแก้ปัญหาของบุคคลที่สามจำนวนมาก
  • หากคุณติดตั้ง CLI rlwrapซึ่งให้การสนับสนุน readline กับคำสั่งใด ๆ คุณสามารถรวมกับคำสั่ง Perl ง่าย ๆ เพื่อสร้าง REPL ที่ใช้งานได้และทำให้ทำโดยไม่ต้องใช้โซลูชั่น REPL ของ บริษัท อื่น
    • ใน OSX คุณสามารถติดตั้งrlwrapผ่านHomebrewbrew install rlwrapกับ
    • Linux distros ควรเสนอrlwrapผ่านทางผู้จัดการแพ็คเกจของตน เช่นบน Ubuntu sudo apt-get install rlwrapใช้
    • ดูคำตอบของJánSáreníkสำหรับชุดค่าผสมที่กล่าวถึงrlwrapและคำสั่ง Perl

สิ่งที่คุณไม่ได้จากคำตอบของJán:

  • อัตโนมัติเสร็จ
  • ความสามารถในการป้อนคำสั่งหลายบรรทัด

โซลูชันบุคคลที่สามเท่านั้นที่นำเสนอสิ่งเหล่านี้ (ด้วยการติดตั้งแบบไม่สำคัญ + ขั้นตอนเพิ่มเติมที่ไม่ชัดเจน) คือpshแต่:

  • มันไม่ได้เห็นกิจกรรมในรอบ 2.5 ปี

  • มุ่งเน้นที่จะแตกต่างกันในการที่จะมีวัตถุประสงค์เพื่อเป็นที่เต็มเปี่ยมทดแทนเปลือกและทำให้การทำงานเช่นเปลือกแบบดั้งเดิมซึ่งหมายถึงว่ามันไม่ได้ประเมินคำสั่งเป็นโดยอัตโนมัติPerlคำสั่งและต้องใช้คำสั่งการส่งออกอย่างชัดเจนเช่นprintการ พิมพ์ผลลัพธ์ของนิพจน์


คำตอบของJánSáreníkสามารถปรับปรุงได้ในทางเดียว:

  • โดยค่าเริ่มต้นมันพิมพ์อาร์เรย์ / รายการ / hashtables เป็นscalarsคือพิมพ์เฉพาะองค์ประกอบของพวกเขาในขณะที่มันจะเป็นประโยชน์ในการระบุองค์ประกอบของพวกเขาแทน

หากคุณติดตั้งData::Printerโมดูลด้วย[sudo] cpan Data::Printerการดำเนินการเพียงครั้งเดียวคุณสามารถโหลดลงใน REPL สำหรับการใช้งานp()ฟังก์ชั่นซึ่งคุณสามารถส่งรายการ / อาร์เรย์ / แฮชเทเบิลสำหรับการแจงนับ

นี่คือชื่อแทนที่iperlมีชื่อว่าreadline และData::Printerการสนับสนุนซึ่งคุณสามารถใส่ในไฟล์เริ่มต้นของเชลล์คล้าย POSIX (เช่น~/.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()//$@'\'

ตัวอย่างเช่นคุณสามารถทำสิ่งต่อไปนี้เพื่อพิมพ์ตัวแปรสภาพแวดล้อมทั้งหมดผ่าน hashtable %ENV:

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

เช่นเดียวกับคำตอบของJANผลลัพธ์สเกลาร์ของนิพจน์จะถูกพิมพ์โดยอัตโนมัติ เช่น:

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


0

Sepia และ PDE มี REPLs ของตนเอง (สำหรับ GNU Emacs)



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.