การอ้างชื่อคลาสอย่างชัดเจนแทนที่จะใช้ bareword (ซึ่งถือว่าเป็นสตริง) เป็นหนึ่งในสามวิธีในการหลีกเลี่ยงความคลุมเครือทางไวยากรณ์ อัญเชิญวิธีการเรียนส่วนหนึ่งของเอกสาร perlobjอธิบาย
เนื่องจาก Perl อนุญาตให้คุณใช้ barewords สำหรับชื่อแพ็กเกจและชื่อรูทีนย่อยบางครั้งก็ตีความความหมายของ bareword อย่างไม่ถูกต้อง ตัวอย่างเช่นการสร้างClass->new()สามารถตีความได้ว่าเป็นอย่างใดอย่างหนึ่ง'Class'->new()หรือClass()->new(). ในภาษาอังกฤษการตีความที่สองอ่านว่า "เรียกรูทีนย่อยชื่อClass()แล้วเรียกnew()ว่าเป็นวิธีการเกี่ยวกับค่าตอบแทนของClass()." หากมีการย่อยชื่อClass()ใน namespace ปัจจุบัน Perl มักจะตีความClass->new()เป็นทางเลือกที่สอง: การเรียกร้องให้
บนวัตถุที่ส่งกลับโดยการเรียกไปยังnew()Class()
ดูกรณีแปลก ๆ นี้พร้อมตัวอย่างด้านล่าง
#! /usr/bin/env perl
use strict;
use warnings;
sub Type::Tiny { print "Returning Bogus\n" ; return "Bogus" }
sub Type::Tiny::new { print "Type::Tiny::new\n" }
sub Bogus::new { print "Bogus::new\n" }
my $class = "Type::Tiny";
Type::Tiny->new;
Type::Tiny::->new;
"Type::Tiny"->new;
$class->new;
เอาท์พุทมันคือ
เป็นการหลอกลวง
ปลอม :: ใหม่
ประเภท :: จิ๋ว :: ใหม่
ประเภท :: จิ๋ว :: ใหม่
ประเภท :: จิ๋ว :: ใหม่
ส่วนที่เหลือของส่วนเอกสารดังกล่าวแสดงวิธีการป้องกันพฤติกรรมที่น่าแปลกใจหรือข้อผิดพลาดโดยไม่ตั้งใจ
คุณสามารถบังคับให้ Perl ใช้การตีความแรก ( เช่นการเรียกเมธอดบนคลาสที่มีชื่อ"Class") ได้สองวิธี ก่อนอื่นคุณสามารถต่อท้าย::ชื่อคลาสได้:
Class::->new()
Perl จะตีความสิ่งนี้เป็นการเรียกเมธอดเสมอ
หรือคุณสามารถอ้างอิงชื่อคลาสได้:
'Class'->new()
แน่นอนถ้าชื่อคลาสอยู่ในสเกลาร์ Perl จะทำสิ่งที่ถูกต้องเช่นกัน:
my $class = 'Class';
$class->new();
นำไปใช้กับคำถามของคุณการโทรทั้งหมดด้านล่างนี้เทียบเท่ากัน
Type::Tiny::->new( … );
"Type::Tiny"->new( … );
my $class = "Type::Tiny";
$class->new( … );
การผนวก::ไปยังจุดสิ้นสุดมีประโยชน์ในการสร้างคำเตือนที่มีประโยชน์ สมมติว่าคุณพิมพ์โดยไม่ตั้งใจ
Type::Tinny::->new;
ที่ผลิต
Bareword "Type :: Tinny ::" หมายถึงแพ็คเกจที่ไม่มีอยู่ที่. / ลองบรรทัดที่ 15
ไม่สามารถหาวิธีวัตถุ "ใหม่" ผ่านแพคเกจ "ประเภท :: Tinny" (บางทีคุณลืมโหลด "Type :: Tinny"?) ที่. / ลองบรรทัดที่ 15
Foo::->newอย่างที่ฉันเรียนรู้จาก ikegami