ใน Perl ข้อความส่วนใหญ่ของฉันprintอยู่ในรูปแบบ
print "hello." . "\n";
มีวิธีที่ดีในการหลีกเลี่ยงการโกหก "\ n" ที่น่ารำคาญหรือไม่?
ฉันรู้ว่าฉันสามารถสร้างฟังก์ชันใหม่เช่นmyprintที่ต่อท้ายโดยอัตโนมัติ \ n แต่จะดีถ้าฉันสามารถแทนที่ไฟล์print.
ใน Perl ข้อความส่วนใหญ่ของฉันprintอยู่ในรูปแบบ
print "hello." . "\n";
มีวิธีที่ดีในการหลีกเลี่ยงการโกหก "\ n" ที่น่ารำคาญหรือไม่?
ฉันรู้ว่าฉันสามารถสร้างฟังก์ชันใหม่เช่นmyprintที่ต่อท้ายโดยอัตโนมัติ \ n แต่จะดีถ้าฉันสามารถแทนที่ไฟล์print.
perldoc perlvarอธิบายคำเตือนส่วนใหญ่ทำไมถึงเชื่อที่นี่?
คำตอบ:
Perl 6 มีฟังก์ชั่นที่จะผนวกsay\n
คุณยังสามารถใช้sayใน Perl 5.10 หรือ 5.12 ได้หากคุณเพิ่ม
use feature qw(say);
ไปยังจุดเริ่มต้นของโปรแกรมของคุณ หรือคุณสามารถใช้Modern :: Perlเพื่อรับสิ่งนี้และคุณสมบัติอื่น ๆ
ดูคุณสมบัติ perldocสำหรับรายละเอียดเพิ่มเติม
use 5.012;หรือuse 5.010;เพื่อให้ได้มาซึ่งถ้าคุณใช้งานperls ที่ใหม่กว่า
หาก Perl 5.10+ ไม่ใช่ตัวเลือกนี่เป็นวิธีการประมาณที่รวดเร็วและสกปรก มันไม่เหมือนกันทุกประการเนื่องจาก say มีเวทมนตร์เมื่อ arg แรกเป็นที่จับ แต่สำหรับการพิมพ์ไปยัง STDOUT:
sub say {print @_, "\n"}
say 'hello';
วิธีที่คุณเขียนใบแจ้งยอดการพิมพ์ของคุณเป็นแบบละเอียดโดยไม่จำเป็น ไม่จำเป็นต้องแยกขึ้นบรรทัดใหม่เป็นสตริงของตัวเอง เท่านี้ก็เพียงพอแล้ว
print "hello.\n";
การตระหนักรู้นี้อาจทำให้การเข้ารหัสของคุณง่ายขึ้นโดยทั่วไป
นอกเหนือจากการใช้use feature "say"หรือuse 5.10.0หรือuse Modern::Perlเพื่อรับsayคุณสมบัติในตัวฉันจะแมงดาperl5iซึ่งจะเปิดใช้คุณสมบัติ Perl 5 ที่หายไปอย่างสมเหตุสมผลตามค่าเริ่มต้น
บางทีคุณอาจต้องการเปลี่ยนตัวคั่นเร็กคอร์ดเอาต์พุตของคุณเป็น linefeed ด้วย:
local $\ = "\n";
$ perl -e 'print q{hello};print q{goodbye}' | od -c
0000000 h e l l o g o o d b y e
0000014
$ perl -e '$\ = qq{\n}; print q{hello};print q{goodbye}' | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
อัปเดต: คำตอบของฉันพูดถึงความสามารถมากกว่าความเหมาะสม ฉันไม่ถือว่าการเพิ่ม "\ n" ที่ท้ายบรรทัดจะเป็นงานที่ "น่ารำคาญ" แต่ถ้ามีคนต้องการหลีกเลี่ยงจริงๆนี่เป็นวิธีหนึ่ง ถ้าฉันต้องรักษาโค้ดที่ใช้เทคนิคนี้ฉันอาจจะ refactor มันทันที
"helo\r\n" "helo\r\n\n"
local $\ = "\n";
-lเหมาะสำหรับบรรทัดคำสั่ง one-liners (ดูperldoc.perl.org/perlrun.html#Command-Switches ) ฉันจะไม่แนะนำในโปรแกรมที่ใหญ่กว่านี้
นี่คือสิ่งที่ฉันพบที่https://perldoc.perl.org/perlvar.html :
$ \ ตัวคั่นเร็กคอร์ดเอาต์พุตสำหรับตัวดำเนินการพิมพ์ หากกำหนดค่านี้จะถูกพิมพ์หลังจากอาร์กิวเมนต์สุดท้ายของการพิมพ์ ค่าเริ่มต้นคือ undef
คุณไม่สามารถเรียก output_record_separator () บนแฮนเดิลได้ แต่เป็นวิธีการแบบคงที่เท่านั้น ดู IO :: Handle
ช่วยในการจำ: คุณตั้งค่า $ \ แทนการเพิ่ม "\ n" ที่ส่วนท้ายของการพิมพ์ นอกจากนี้มันก็เหมือนกับ $ / แต่เป็นสิ่งที่คุณ "กลับมา" จาก Perl
ตัวอย่าง:
$\ = "\n";
print "a newline will be appended to the end of this line automatically";
หากคุณติดอยู่กับพรี 5.10 โซลูชันที่ให้ไว้ข้างต้นจะไม่สามารถจำลองsayฟังก์ชันได้ทั้งหมด ตัวอย่างเช่น
sub say { print @_, "\n"; }
จะไม่ทำงานกับการเรียกใช้เช่น
say for @arr;
หรือ
for (@arr) {
say;
}
... เนื่องจากฟังก์ชันข้างต้นไม่ได้ทำหน้าที่เกี่ยวกับ global $_like printและsayฟังก์ชันจริงโดยนัย
หากต้องการจำลอง perl 5.10+ อย่างใกล้ชิดยิ่งขึ้นsayคุณต้องการฟังก์ชันนี้
sub say {
if (@_) { print @_, "\n"; }
else { print $_, "\n"; }
}
ซึ่งตอนนี้ทำหน้าที่แบบนี้
my @arr = qw( alpha beta gamma );
say @arr;
# OUTPUT
# alphabetagamma
#
say for @arr;
# OUTPUT
# alpha
# beta
# gamma
#
saybuiltin ใน Perl6 ทำงานเล็ก ๆ น้อย ๆ ที่แตกต่างกัน การเรียกใช้โดยมีsay @arrหรือ@arr.sayจะไม่เพียงแค่เชื่อมต่อรายการอาร์เรย์ แต่จะพิมพ์แยกออกจากกันด้วยตัวคั่นรายการ ในการจำลองสิ่งนี้ใน perl5 คุณต้องทำสิ่งนี้
sub say {
if (@_) { print join($", @_) . "\n"; }
else { print $_ . "\n"; }
}
$"คือตัวแปรตัวคั่นรายการส่วนกลางหรือถ้าคุณใช้English.pmอยู่ก็คือ$LIST_SEPARATOR
ตอนนี้มันจะทำหน้าที่เหมือน perl6 มากขึ้นเช่นนั้น
say @arr;
# OUTPUT
# alpha beta gamma
#