2014-12-03 141 views
1

我正在學習Mojo,這是我的第一個腳本,它工作正常 - 這是它做我想做的事情。MOJO perl已棄用警告

use Mojo::UserAgent; 
use Mojo::DOM; 
use Mojo::Collection; 
use strict; 
use warnings; 

my $ua = Mojo::UserAgent ->new; 
my $dom = Mojo::DOM ->new; 

$dom = $ua->get('http://lalalala....')->res->dom; 

open (my $file_zlec, "> zlc2012.csv") or die "couldn't open file!"; 
binmode $file_zlec, ":utf8"; 

for my $zlec($dom->find('table.tbl_zlc')->each){ 
    print "$i \n"; $i++; 

    wypisz($zlec, 'td.tbl_zlc_d1',1); 
    print $file_zlec"\n"; 

} 

sub wypisz{ 
    my $ch= $_[0]-> find($_[1])->children; 

    if ($_[2]==1){ 
     my $tekst = $ch->text; 
     print $file_zlec "$tekst;"; 
    } 

    my $href= $ch->map(attr => 'href'); 
    if (not $href=~/lalala\.pl/g) {$href="www.lalala.pl".$href}; 
    print $file_zlec "$href;"; 

}

然而,得到了很多警告的關於 「兒童」, 「文本」 和 「ATTR」: 「魔精::收藏:: AOUTOLOAD(..)有利於已經過時MOJO :: Collection :: map的地圖(..)' 'Mojo中的Stringifacation支持:: Collection :: AOUTOLOAD(...)被棄用於Mojo :: Collection :: join at(..)

我以爲我做錯了,但我跟着例子在http://mojocasts.com/e5 EXCACTLY並得到相同的警告

use Mojo::UserAgent; 

my $ua = Mojo::UserAgent ->new; 
print $ua->get('http://mojolicio.us')->res->dom->html->head->title; 

我的問題是: 1.我應該擔心嗎?就像我說的,腳本工作正常 2.如果ans(1)不是,是否有辦法關閉它?我看不到任何東西在命令行..

+0

*「的問題尋求幫助調試(」爲什麼不是這個代碼的工作?「)必須包括所期望的行爲,一個特定的問題或錯誤,以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者沒有用處。「* – Borodin 2014-12-03 11:53:40

+0

我必須標記您的問題才能關閉,因爲沒有問題用您提供的信息調試程序的方法。如果你想得到答案,那麼你必須向我們提供代碼,我們可以*運行*並查看你所得到的錯誤。您已刪除錯誤消息中最有用的部分,並將其鍵入,而不是將它們複製/粘貼到您的帖子中。 – Borodin 2014-12-03 11:55:01

+0

thakns,我已經編輯了這個問題的例子,給了我像我的腳本一樣的警告 - 我希望這是ENOGH – kamila 2014-12-03 12:02:58

回答

5

好吧,看起來這些棄用最近已被添加。例如,AUTOLOAD棄用於今年10月底推出,而我的Mojolicious版本則在此之前,因此我沒有看到您收到的消息。我現在升級了我的安裝並理解了問題。

不幸的是,Mojolicious 棄用消息由Carp模塊產生的,他們不給no warnings編譯迴應。我知道禁用,那麼唯一的辦法就是報警處理程序設置爲空子程序,這樣

$SIG{__WARN__} == sub { }; 

,但是這是非常嚴厲的,因爲它沉默只是討厭的人,你是所有警告,而不是看到。

由於您使用的工具已被棄用,它很可能會在不久的將來從Mojolicious套件中刪除,所以無論如何,如果您從一開始就學會採用新標準。

有消息稱

Mojo::DOM::AUTOLOAD (html) is DEPRECATED in favor of Mojo::DOM::children 

這意味着他們更希望你用$dom->children('html'),而不是僅僅$dom->html。但是children返回一個Mojo::Collection對象,這是一個集合的節點,因此您需要選擇該集合的第一個項目。那會使

$dom->html->head->title 

到繁瑣

$dom->children('html')->first->children('head')->first->children('title')->first 

所以它是迄今爲止最好使用at方法,這需要CSS3的表達,你可以寫

$dom->at('html > head > title') 

這是很好的,並不會產生警告。請注意,它不是children/first鏈的確切替代品,因爲正在搜索整個文檔中的title節點,該節點是節點的子節點,該節點是html節點的子節點。但是,由於唯一可能發生的地方是文檔的根源,結果是相同的。即使這可以通過使用CSS3項目:root代替html來解決。

完整的程序是這樣的

use strict; 
use warnings; 

use Mojolicious; 

my $ua = Mojo::UserAgent->new; 
my $dom = $ua->get('http://mojolicio.us')->res->dom; 

print $dom->at('html > head > title')->text; 

輸出

 Mojolicious - Perl real-time web framework 
+0

謝謝!這是詳盡的答案,我真的很感激它。 – kamila 2014-12-03 13:40:02

1

「我應該擔心」

你的目標應該刪除一個程序生成的所有警告消息。您首先需要準確理解您獲取它們的原因,然後您可以選擇以不同方式編寫代碼,或者在確定問題是良性後暫時禁用警告。

作爲指導,我禁用警告的程度遠低於百分之一。它們幾乎總是表明可以並且應該解決的編碼問題。