Bir bareword (dize olarak ele alınır) kullanmak yerine sınıf adını açıkça belirtmek, sözdizimsel belirsizliği önlemenin üç yolundan biridir. Çağırma Sınıf Yöntemler bölümünde perlobj belgelerine açıklar.
Perl, paket isimleri ve altyordam isimleri için barewordları kullanmanıza izin verdiği için, bazen bir bareword'un anlamını yanlış yorumlar. Örneğin, yapı Class->new()
ya 'Class'->new()
da olarak yorumlanabilir Class()->new()
. İngilizce'de, bu ikinci yorum “adlı bir alt programı Class()
çağır, sonra new()
dönüş değerinde bir yöntem olarak çağır Class()
. Class()
Geçerli ad alanında bir alt yordam varsa , Perl her zaman Class->new()
ikinci alternatif olarak yorumlanır : çağrıyla
new()
döndürülen nesneye yapılan çağrı Class()
.
Aşağıdaki demoda bu garip durumu iş başında görün.
#! /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;
Çıkışı
Geri dönen sahte
Sahte :: Yeni
Tip :: Minik :: Yeni
Tip :: Minik :: Yeni
Tip :: Minik :: Yeni
Yukarıda belirtilen dokümantasyon bölümünün geri kalanı, şaşırtıcı davranışlara veya yanlışlıkla yapılan hatalara karşı nasıl korunacağını gösterir.
Perl'i ilk yorumu ( yani , adlandırılan sınıfta bir yöntem çağrısı olarak "Class"
) iki şekilde kullanmaya zorlayabilirsiniz . İlk olarak, ::
sınıf adına bir ekleyebilirsiniz :
Class::->new()
Perl bunu her zaman bir yöntem çağrısı olarak yorumlayacaktır.
Alternatif olarak, sınıf adını da verebilirsiniz:
'Class'->new()
Tabii ki, sınıf adı skalerdeyse Perl de doğru şeyi yapacaktır:
my $class = 'Class';
$class->new();
Sorunuza başvurduğunuzda, aşağıdaki aramaların tümü eşdeğerdir.
Type::Tiny::->new( … );
"Type::Tiny"->new( … );
my $class = "Type::Tiny";
$class->new( … );
Ekleme ::
ucuna yararlı bir uyarı üretme avantajına sahiptir. Yanlışlıkla yazdığınızı söyleyin
Type::Tinny::->new;
Üreten
Bareword "Type :: Tinny ::", ./try satır 15'teki mevcut olmayan paketi ifade eder.
"New" paketi üzerinden "Type :: Tinny" nesne yöntemini bulamıyor (belki "Type :: Tinny" dosyasını yüklemeyi unuttunuz?) ./Try line 15.
Foo::->new
ikegami'den öğrendiğim gibi.