2012-12-08 87 views
2

有人可以解釋爲什麼我的循環不起作用嗎?Perl簡單循環

#!/usr/bin/perl -w 
use warnings; 
use strict; 
use URI; 
use Web::Scraper; 

my $url = "http://example.com"; 


# prepare data 
my $scrapedata = scraper { 
process "div.something", 'pages[]' => '@rel'; 
}; 

# scrape the data 
my $res = $scrapedata->scrape(URI->new($url)); 

# Get number of pages and define as var 
for my $j (0 .. $#{$res->{pages}}) { 
my $varpages = $res->{pages}[$j]; 
    print "$varpages\n"; 
} 


for (my $count = 2; $count <= $varpages; $count++) { 

print "$varpages\n"; 
print "$count\n"; 

} 

這是錯誤:

# perl oli 
Global symbol "$varpages" requires explicit package name at oli line 25. 
Global symbol "$varpages" requires explicit package name at oli line 27. 
Execution of oli aborted due to compilation errors. 
+0

您希望$ varpages在離開第一個循環後有什麼價值? – stark

+0

我想要從以下位置獲取值: process「div.something」,'pages []'=>'@rel'; – oliwiak82

回答

6

$varpages被詞法作用域到碼塊:

# Get number of pages and define as var 
for my $j (0 .. $#{$res->{pages}}) { 
my $varpages = $res->{pages}[$j]; 
    print "$varpages\n"; 
} 

以後引用它的嘗試引用一個不同的變量。如果您希望$varpages具有全局範圍,請在分配給它的塊之外聲明它。例如:

my $varpages; 
# Get number of pages and define as var 
for my $j (0 .. $#{$res->{pages}}) { 
    $varpages = $res->{pages}[$j]; 
    print "$varpages\n"; 
} 
+0

你好, 所以我定義了$ varpages var之前的循環,現在我有以下錯誤: 使用未初始化的值$ varpages在數字le(<=)在6 – oliwiak82

+0

這肯定會發生如果'$#{$ res - > {pages}'爲零。嘗試初始化:'my $ varpages = 0;' –

+2

您是否像威廉表示的那樣,在for循環中將'my'從'my $ varpages'中刪除了? –