ใน 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;
เพื่อให้ได้มาซึ่งถ้าคุณใช้งานperl
s ที่ใหม่กว่า
หาก 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
#
say
builtin ใน 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
#