2009-10-11 12 views
5

Perl ve kapsam belirleme ile ilgili bir sorum var. Çok çeşitli değişkenlerle ortak bir dosyam var. Ana dosyamda ortak dosyaya ihtiyacım var, ancak değişkenlere erişemiyorum; kendi kapsamı dışında görünüyorlar. our bildiriminin bu sorunun üstesinden geleceğini düşündüm, ancak işe yaramıyor gibi görünüyor.Perl kodum neden başka bir dosyada tanımladığımız() değişkenlerimizi göremiyor?

Senaryo 1: common.pl

#!/usr/bin/perl 

our $var1 = "something"; 
our $var2 = "somethingelse"; 

Senaryo 2: ftp.pl

#!/usr/bin/perl 

use strict; 
use warnings; 

require('common.pl'); 

print $var1; 

hata alıyorum:

Global symbol "$var1" requires explicit package name

+3

küresel sembol, $ var1
yapılan bir senaryo üzerinde çalışmaya got nasıl açık bir paket adı gerektirir. – jrockway

+1

http://perl.plover.com/FAQs/Namespaces.html –

+0

Öğe 1 Etkili Perl Programlamada (ISBN: 0201419750, Joseph Hall ve Randal Schwartz) şu adresten yararlanabilirsiniz: Ad alanlarınızı bilin. Bunun için harika bir referans ve harika bir kitap. –

cevap

8

hiçbir require yargısı var ki senin İkinci örnek, ama yine de işe yaramaz. Ne our, sözcüksel kapsamlı bir paket değişkenini bildirir. package ifadeniz olmadığı için, main varsayılan paketini kullanır. Yani ilk komut dosyanız $main::var1 değişkenini ayarlıyor, ancak bu yalnızca bu dosyanın kapsamı içinde mevcut olacak.

Diğer betikler için ortak değişkenler sağlamanın daha iyi bir yolu Exporter kullanmaktır. Paket sembollerini tek bir yerde tanımlayabilirsiniz ve İhracatçı, gerektiğinde bunları istenen komut dosyasına veya sınıfın ad alanına kopyalamaya özen gösterir.

6

Burada uygun bir yapılandırma dosyasına ihtiyacınız var gibi görünüyor. Bir şeyler kurmanız gerektiğinde okuyabileceğiniz kod olmayan bir yapılandırma dosyası için giderdim. Tahmin edebileceğiniz herhangi bir yapılandırma formatını ele almak için CPAN'da modüller vardır.

Eğer sahip olduğunuz gibi yapmak istiyorsanız, our'dan kurtulun ve use vars ile bildirin. PBP polisinin seni bundan korkutmasına izin verme. :) Bir paket değişkeninin kapsamını sınırlamak için sadece gerçekten our'a ihtiyacınız var ve bu tam olarak yapmaya çalıştığınız şeyin tam tersi.

+0

İyi kullanmak, bizim veya benim gibi değişken bir tanım kullanmama izin vermiyor. – Lee

+0

Değiştirilemeyen perl sürümlerinde çalışıyorum bir sorun var .. ör. yeni modül yok. – Lee

+0

Perl dosyalarını ekleyebiliyorsanız, tüm saf perl modüllerini kullanabilirsiniz, çünkü bağımlılıkların kendinizle ilgilenmeniz gerektiğinden sadece birazcık zorlayıcıdır. Sadece istediğiniz modülün kaynağını indirin ve "sizin" perlscript'in okuyabileceği yere koyun. – Nifle

7

Yapıyı bunun yerine bir modül içine koyardım.

Dosya: MyConfig.pm

package MyConfig; 
require Exporter; 
use strict; 

our @ISA    = qw(Exporter); 
our @EXPORT    = qw(getconfig); 

my %confighash = ( 
      thisone => 'one', 
      thatone => 2, 
      somthingelse => 'froboz', 
        ); 



sub getconfig { 
return %confighash; 
} 

1; 

Örnek kullanım:

#!/usr/bin/perl 
use strict; 
use warnings; 

use MyConfig; 

my %config = getconfig(); 

print $config{ somthingelse }; 

Bu yazdırmalısınız froboz

2

eden() düşündüğünüzden daha biraz farklı bir şey yok. Tek amacı, kullanacağınız paket değişkenlerini (tam nitelikli veya ithal olmadıkları sürece) beyan etmenizi gerektiren sıkı bir şekilde çalışmaktır. Sıkı olduğu gibi, etkisi sözcüksel olarak kapsamlıdır. Her bir dosyada $main:var1 numarasına birden çok dosyadan (ayrı kapsamlar olan) yalnızca $var1 olarak erişmeye izin vermek için kullanmak için our $var1 demeniz gerekir.

Alternatif olarak, gerekli dosyayı, değişkenleri kullanan herhangi bir pakete dışa aktaran kendi paketi olan bir modül olarak değiştirirsiniz.

1

Bunu deneyin.Ben Perl yeni duyuyorum ama bu, ben

#!/usr/bin/perl 

$var1 = "something"; 
$var2 = "somethingelse"; 
Script 2: ftp.pl 

#!/usr/bin/perl 

use strict; 
use warnings; 

our $var1; 
our $var2; 

require('common.pl'); 

print $var1; 
İlgili konular