2012-10-24 19 views
9

Próbuję zrozumieć zakres zmienny i poprawnie zadeklarować zmienne w Perlu, i mam trudny czas.Jak poprawnie zadeklarować zmienne globalne w Perlu?

Poniższy kod zasadniczo czyta plik excel, analizuje go i wypycha go do nowego pliku programu Excel.

Jednak próbuję odczytać jeden z nagłówków, a jeśli nagłówek pasuje do mojego ciągu, chcę zapisać ten numer kolumny i użyć go później w kodzie.

Otrzymuję "Użyj niezainicjowanej wartości $ nazwa_strony_col w druku na linii ./parser.pl 38."

Linia 38 to "print $ nazwa_strony_col;"

Zdaję sobie sprawę, że to polecenie print znajduje się poza {}, gdzie początkowo zainicjowano zmienną, ale zostało zadeklarowane jako zmienna globalna na początku kodu, więc co daje?

#!/usr/bin/perl -w 

use strict; 
use warnings; 
use vars qw($site_name_col); 
use Spreadsheet::WriteExcel; 
use Spreadsheet::ParseExcel; 

my ($fname1) = @ARGV; 

my $parser = Spreadsheet::ParseExcel->new(); 
my $workbook = $parser->parse($fname1); 

my $new_workbook = Spreadsheet::WriteExcel->new('formated_list.xls', $fname1); 

if (!defined $workbook) { 

    die $parser->error(), ".\n"; 
} 

for my $worksheet ($workbook->worksheets()) { 

    my ($wsheet_name) = $worksheet->get_name(); 
    my $new_worksheet = $new_workbook->add_worksheet($wsheet_name); 

    my ($row_min, $row_max) = $worksheet->row_range(); 
    my ($col_min, $col_max) = $worksheet->col_range(); 

    for my $row ($row_min .. $row_max) { 

     for my $col ($col_min .. $col_max) { 

      my $cell = $worksheet->get_cell($row, $col); 
      next unless $cell; 

      print "Row, Col = ($row, $col)\n"; 

      if ($cell->value() =~ /Site Name/) { 

       $site_name_col = $col; 
      } 
      print $site_name_col; 

      $new_worksheet->write($row, $col, $cell->value()); 
     } 
    } 
} 

$new_workbook->close(); 
+2

Dlaczego nie użyłeś 'my' ?! – ikegami

Odpowiedz

5

use vars qw() Nie jest już rekomendowany. Aby zadeklarować zmienną globalną, użyj our $my_var Twój problem może wynikać z warunku $cell->value() =~ /Site Name/. Prawdopodobnie nie jest to nigdy spełnione, więc twoja zmienna nigdy nie otrzyma wartości.

0

Nie musisz zadeklarować zmiennej globalnej w tym przypadku, wystarczy lokalna zmienna. Zobacz przykład poniżej.

if ($cell->value() =~ /Site Name/) { 

    my $site_name_col = $col; 
    print $site_name_col; 
} 

LUB

my $site_name_col = ''; # default value 
if ($cell->value() =~ /Site Name/) { 

    $site_name_col = $col; 
} 
print $site_name_col; 
+1

Nie odpowiadasz na pytanie, dlaczego? – Alex

1

Wystarczy, aby wyjaśnić, co inni już powiedział, zmienna zadeklarowana w górnej części pliku z my jest dostępne i użyteczne dla całego pliku. W tym przypadku nie ma powodu dla zmiennej globalnej.

Kiedy chcesz uzyskać globalny?

  • Chcesz, aby zmienna była dostępna dla innego fragmentu kodu spoza Twojego pliku. Na przykład moduł może udostępniać zmienną globalną dostępną dla plików wywołujących moduł.
  • Masz wiele pakietów w jednym pliku. W takim przypadku potrzebna byłaby zmienna globalna dla czegoś dostępnego dla obu pakietów. Jednak byłoby to dość niezwykłe.

Jest całkiem jasne, że nie robisz żadnej z tych rzeczy, więc powinieneś po prostu trzymać się z my. Jeśli chcesz zadeklarować globalną, prawidłowy sposób to zrobić z our. Jest kilka ważnych subtelności tego polecenia, wyjaśnione w powiązanej dokumentacji.

3

uznaję ten post jest trochę stary, ale ... dla tych, którzy nadal zbliża się do tej stronie lat później (jak ja):

wyobrażam sobie te arkusze Excela Państwo czytali w nie mogły zostać opracowane przez ty. więc możesz napotkać problemy z obudową, a w wyrażeniach regularnych jest rozróżniana wielkość liter. wielkimi lub małymi literami dane podczas sprawdzania: if (lc($cell->value()) =~ /site name/) ...

użyj our! Istnieje wiele powodów, dla których można mieć globalne.site_name wydaje się być czymś, wszystkie pliki mogą potrzebować ...

Jarett

edit:

to będzie działać znacznie lepiej:

if ($cell->value()) =~ /site name/i) { print $col; }

nie trzeba drukować poza if oświadczenie w ogóle ... oszczędza drukowanie wiele razy ... wiele razy ...