2010-04-15 11 views
15

Perl'de paket değişkenleri için değişken olarak değişken adı kullanmak mümkün olduğunu biliyorum. Bir değişkenin içeriğini modül adı olarak kullanmak isterim. Mesela: Ben mümkün istiyorumBir değişkeni Perl'de modül adı olarak nasıl kullanabilirim?

package Foo; 
our @names =("blah1", "blah2"); 
1; 

Ve başka dosyada bir sayısal alan için "foo" içeriğini ayarlamak ve sonra bu sayısal alan ile Foo isimleri dizi erişmek mümkün. Ben

my $names = eval '$'. $packageName . "::names" 

Ama yalnızca Foo::names

bir skaler olduğunu kullanabilirsiniz biliyoruz

@{$packageName}::names; #This obviously doesn't work. 

:

my $packageName = "Foo"; 

Esasen ben çizgisinde bir şey yapmak istiyorum. eval bildirimi olmadan bunu yapmanın başka bir yolu var mı? , Sen sembolik kullanabilirsiniz

my @values; 
{ 
    no strict 'refs'; 
    @values = @{"Mypackage"}::var; 
} 
+0

"Erişim Foo" ile ne demek istiyorsunuz? – Ether

+0

Sorguyu düzenledik. "@names" paket değişkenine foo – mjn12

cevap

14

pakette $package paket değişkenleri almak için:

+0

get_names'de no parens yok mu? –

+0

Açıkladığım alternatif metodu, Foo'nun temel sınıfında get_names'i tanımlayabildiğim sürece (bunu Bar olarak orijinal olarak adlandırırız) bu şekilde sadece @ isimlerini Bar'dan miras alınan her sınıfta tanımlayabildiğimi düşünüyorum. Eğer fark yaratan Moose nesneleri kullanıyorum. – mjn12

+1

@Paul, argüman yoksa, yöntem çağrılarında parens gerekmez. Bazı insanlar tutarlılık için her zaman boş bir '()' yi kullanmayı tercih ederler, ancak elimden geldiğince onları dışarıda bırakırım. – friedo

4

Strict checking bir adının bir parçası olarak bir değişken (veya edebi dize) kullanarak engelliyor, ancak bu yerel olarak devre dışı bırakılabilir referanslar: sembolik referanslar önler

no strict 'refs'; 
my $package = 'Foo'; 

# grab @Foo::names 
my @names = @{ $package . '::names' } 

daha iyi bir yol, bir dizi döndürür Foo içinde bir usul ortaya koymaktır. Bu, yöntem çağırma işleci (->), invocant olarak bir dize alabileceği için çalışır.

package Foo; 

our @names = (...); 
sub get_names { 
    return @names; 
} 

package main; 
use strict; 

my $package = 'Foo'; 
my @names = $package->get_names; 
+0

içinden erişebilmek istiyorum. Yaptığım şey, * .pm için bir dizin ve sonra her dosya için $ dosyaadı gerektirdiğim bir globbing. Bu modüller yüklendikten sonra her paketin içinde tanımlanmış @ isimleri değişkenine erişmem gerekiyor. Paketin adını çalışma zamanına kadar bilmiyorum, sahip olduğum tek şey paketin adını içerecek bir değişkendir. – mjn12

+0

Değişken adından paketleri yükleme konusunda sorun yaşıyorum - Bu kısmı indirdim. Bu paketlerdeki değişkenlere erişiyor. Bu cevap kesinlikle bir saat önce googling bir sürü tasarruf olurdu ama yine de :) – mjn12

+0

@mjn: oops üzgünüm, gerçek sorunu daha belirgin hale getirmek için şimdi cevabımı düzenliyorum :) – Ether