ทางเลือกของ Perl ใน <> ใน Raku?


11

ที่นี่เรียนรู้วิธีของฉันไปรอบ ๆ Raku (neé Perl 6) ดีมาก ๆ แต่ฉันคิดถึงเวทมนตร์<>จาก Perl 5 อย่างมากซึ่งคุณสามารถทำได้เพียง:

my $x = <>;
print $x;
while(<>) {
  print join(':', split);
}

(อ่านบรรทัดอินพุตถัดไปเข้าไป$xวนรอบส่วนที่เหลืออินพุตมาจากไฟล์ที่มีชื่อเป็นอินพุตหรืออินพุตมาตรฐานหากไม่มีไฟล์ที่กำหนด) บทแนะนำ / บทแนะนำในการย้ายข้อมูล "Perl 5 ถึง 6" / ... เพียงแค่พูดคุยเกี่ยวกับslurpไฟล์ทั้งหมดหรือส่งopenแต่ละไฟล์ตามชื่อ ไม่มีเวทมนต์ "รับอินพุตจากไฟล์ที่มีชื่อตามลำดับ" ฉันหาได้

ฉันต้องการเวทย์มนตร์คืน!

คำตอบ:


17

มีฟังก์ชั่นการใช้งานที่คุณค้นหาเป็นส่วนใหญ่ สคริปต์นี้:

my $x = get();
say "First: $x";
for lines() {
    .say
}

รับไฟล์อินพุตเหล่านี้:

$ cat foo
foo line 1
foo line 2
$ cat bar
bar line 1
bar line 2

จะเมื่อถูกเรียกว่า:

raku script.p6 foo bar

ผลิตผลลัพธ์:

First: foo line 1
foo line 2
bar line 1
bar line 2

มันจะเอาท์พุทจาก$*INถ้าไม่มีไฟล์ สิ่งเดียวที่ไม่มีอยู่คือการแทนที่เพียงครั้งเดียว<>เนื่องจากมันจะขึ้นอยู่กับwantarrayฟังก์ชั่นที่เหมือนกันซึ่งเข้ากันไม่ได้กับการส่งหลายครั้ง (และ Raku ถือว่าการส่งหลายครั้งนั้นมีประโยชน์มากกว่า)

ตัวเลือก zero-arg สำหรับgetและlinesถูกนำมาใช้ในแง่ของ$*ARGFILESการจัดการไฟล์ที่ให้ฟังก์ชั่นการใช้ไฟล์จากรายการอาร์กิวเมนต์หรือจาก$*IN- หมายถึงหนึ่งสามารถส่งไปยังรหัสใด ๆ ที่คาดว่าจะจัดการไฟล์


1
หรืออวดรู้: raku script.raku foo bar ;-)
p6steve

0

เวทมนต์เพียงพอสำหรับคุณ

sub MAIN( Str $file where *.IO.f  )
{
    .say for $file.IO.lines.map: *.comb.join(':');
}

2
มันยอดเยี่ยมและ OP ควรลองใช้ แต่ก็ไม่เหมือนกันในสองสามวิธี ดูคำตอบของ jnthn สำหรับการเลียนแบบ<>พฤติกรรมและทราบว่า raku .combไม่มีการโต้แย้งแยกสตริงออกเป็นอักขระแต่ละตัวในขณะที่ Perl ของที่splitไม่มีการโต้แย้งคือ afaik .split(/\s+/)ใน raku
raiph

ทางเลือกที่.splitจะเป็น.words- docs.perl6.org/type/Str#routine_words
donaldh

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