2014-12-03 100 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

“我应该担心”

你的目标应该删除一个程序生成的所有警告消息。您首先需要准确理解您获取它们的原因,然后您可以选择以不同方式编写代码,或者在确定问题是良性后暂时禁用警告。

作为指导,我禁用警告的程度远低于百分之一。它们几乎总是表明可以并且应该解决的编码问题。