2011-07-13 86 views
2

我想從使用perl API的網站中提取數據。該過程是使用uris列表作爲輸入。然後我從網站提取每個uri的相關信息。如果一個uri的信息不存在,它就會死亡。有些東西像下面的代碼如何在perl中跳過'die'

my @tags = $c->posts_for(uri =>"$currentURI"); 
die "No candidate related articles\n" unless @tags; 

現在,我不希望程序停止,如果它沒有得到任何標籤。我希望程序跳過那個特定的uri並轉到下一個可用的uri。我該怎麼做? 謝謝你的時間和幫助。

謝謝 Sammed

+7

那麼......不要成爲一個聰明的人或任何事情,但如果你不想讓程序死掉,不要使用'死亡'?你不能同時死亡和死亡。 – TLP

+0

@ TLP。好的一..事情是我想跳過錯誤並繼續前進,那正是我想要做的。 – sammed

+1

也許只是將'死'改爲'警告'。 –

回答

5

好吧,假設你是一個循環處理每個依次URI的裏面,你應該能夠做這樣的事情:

next unless @tags; 

例如,下面的程序只打印是數字線:

while (<STDIN>) { 
    next unless /^\d+$/; 
    print; 
} 

的循環處理在依次放入行,但是,如果找到與該正則表達式不匹配的所有數字,它將重新啓動循環(對於下一個輸入行)而不打印。

在上面的第一個代碼塊中使用相同的方法來重新啓動循環,如果沒有標籤,則移動到下一個URI。

+0

謝謝你的回答。是的,我在循環中處理while循環中的每個URI。我只想確認語法,它會是這樣的:'my @tags = $ c-> posts_for(uri =>「$ currentURI」); next除非@tags;' – sammed

0

除了傳統的流量控制工具,在一個循環中,即next/lastreturn在子,可以在Perl使用異常:

eval { 
    die "Bad bad thing"; 
}; 
if ([email protected]) { 
    # do something about it 
}; 

或者只是使用Try::Tiny

但是,從任務描述看來next已經足夠了(所以我投了@ paxdiablo的回答)。

0

這個問題很奇怪,但就我所知,您正在詢問如何控制當前循環的流程。當然,使用die會導致你的程序退出,所以如果你不想這樣做,你不應該使用die。對我來說似乎是初級的,這就是爲什麼這是一個奇怪的問題。

所以,我假設你有一個循環,例如:

for my $currentURI (@uris) { 
    my @tags = $c->posts_for(uri =>"$currentURI"); 
    die "No candidate related articles\n" unless @tags; 
    # do stuff with @tags here.... 
} 

如果@tags是空的,你要進入下一個URI。那麼,這是一個簡單的事情來解決。有很多方法。

next unless @tags; 
for my $tag (@tags) { ... stuff ... } 
if (@tags) { .... } 

下面是最簡單的一個。它跳到循環塊的末尾,並從下一次迭代開始。但是,使用forif塊會導致相同的行爲,因此是等同的。例如:

for my $currentURI (@uris) { 
    my @tags = $c->posts_for(uri =>"$currentURI"); 
    for my $tag (@tags) { 
     do_something($tag); 
    } 
} 

甚至:

for my $currentURI (@uris) { 
    for my $tag ($c->posts_for(uri =>"$currentURI")) { 
     do_something($tag); 
    } 
} 

在這最後一個例子,我們刪除所有@tags一起,因爲它不需要。如果沒有「標籤」,內部循環將運行零次。

這不是真正複雜的東西,如果自己沒有把握,我建議你身邊有點玩循環和條件,瞭解它們是如何工作。

+0

@ TLP ..感謝您的回答。那麼,我正在學習一些條件和循環。我想我已經開始了。感謝您的幫助。 – sammed