2009-10-11 11 views
5

Mam pytanie dotyczące Perla i zakresu. Mam wspólny plik z dużą ilością różnych zmiennych. Wymagam wspólnego pliku w moim głównym skrypcie, ale nie mam dostępu do zmiennych; wydają się być poza jej zakresem. Zakładałem, że deklaracja our rozwiąże ten problem, ale wydaje się, że nie działa.Dlaczego mój skrypt Perla nie może zobaczyć zmiennych my(), które zdefiniowałem w innym pliku?

Scenariusz 1: common.pl

#!/usr/bin/perl 

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

Scenariusz 2: ftp.pl

#!/usr/bin/perl 

use strict; 
use warnings; 

require('common.pl'); 

print $var1; 

pojawia się błąd:

Global symbol "$var1" requires explicit package name

+3

Globalny symbol $ zm1 wymaga wyraźnej nazwę pakietu. – jrockway

+1

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

+0

Pozycja 1 w efektywnym programowaniu perlowym (ISBN: 0201419750, Joseph Hall i Randal Schwartz) jest zatytułowana: Know Your Namespaces. Jest to doskonałe odniesienie do tego, a także świetna książka. –

Odpowiedz

8

nie ma require oświadczenie w swojej drugi przykład, ale i tak by nie zadziałało. To, co robi our, deklaruje zmienną pakietową o zasięgu leksykalnym. Ponieważ nie masz instrukcji package, używa ona domyślnego pakietu main. Twój pierwszy skrypt ustawia zmienną $main::var1, ale będzie dostępna tylko w zakresie tego pliku.

Lepszym sposobem na zapewnienie wspólnych zmiennych dla innych skryptów jest użycie Exporter. Możesz zdefiniować symbole pakietów w jednym miejscu, a Exporter zajmie się kopiowaniem ich do skryptu żądania lub przestrzeni nazw klasy, gdy zajdzie taka potrzeba.

6

Wygląda na to, że potrzebujesz odpowiedniego pliku konfiguracyjnego. Wybrałbym plik konfiguracyjny bez kodu, który można odczytać, gdy trzeba skonfigurować rzeczy. W CPAN są moduły do ​​obsługi niemal dowolnego formatu konfiguracji, jaki możesz sobie wyobrazić.

Jeśli chcesz to zrobić tak, jak to masz, pozbądź się our i zadeklaruj je pod numerem use vars. Nie pozwól policji PBP odstraszyć cię od tego. :) Naprawdę potrzebujesz tylko our, aby ograniczyć zakres zmiennej pakietowej, a to jest dokładnie przeciwieństwem tego, co próbujesz zrobić.

+0

Używanie ścisłej nie pozwoli mi nie używać definicji zmiennej, takiej jak nasza lub moja. – Lee

+0

Występuje problem, że pracuję nad wersjami perla, których nie można zmodyfikować .. np. brak nowych modułów. – Lee

+0

Jeśli możesz dodawać pliki perla, możesz użyć wszystkich czystych modułów perl, jest to po prostu trochę kłopotliwe, ponieważ sam musisz zadbać o zależności. Po prostu pobierz źródło modułu i umieść go tam, gdzie "twój" perlscript może go przeczytać. – Nifle

7

Zamiast tego wstawiłabym konfigurację do modułu.

Plik: 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; 

Przykład użycia:

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

use MyConfig; 

my %config = getconfig(); 

print $config{ somthingelse }; 

ten powinien wydrukować froboz

2

nasz() robi coś innego niż myślisz. Jego jedynym celem jest ścisła praca wymagająca zadeklarowania zmiennych pakietu, których będziesz używać (chyba że są w pełni kwalifikowane lub importowane). Podobnie jak w przypadku stricte, jego efekt jest leksykalny. Aby użyć go do umożliwienia dostępu do globalnego $main:var1 z wielu plików (które są osobnymi zakresami) jako tylko $var1, musisz powiedzieć our $var1 w każdym pliku.

Alternatywnie można zmienić wymagany plik na moduł z własnym pakietem, który eksportuje zmienne do dowolnego pakietu, który z niego korzysta.

1

Spróbuj tego.Jestem nowy w Perlu, ale to jak mam go do pracy nad scenariuszem zrobiłem

#!/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; 
Powiązane problemy