MOJO perl不赞成警告

kam*_*ila 1 perl mojo mojolicious

我正在学习Mojo,这是我的第一个脚本,它工作正常 - 这就是我想要它做的事情.

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;";
Run Code Online (Sandbox Code Playgroud)

}

然而,关于"儿童","文本"和"attr"的问题得到了很多警告:'Mojo :: Collection :: AOUTOLOAD(..)被弃用,有利于MOJO :: Collection :: map at(..) ''Mojo :: Collection :: AOUTOLOAD(...)中的Stringifacation支持已弃用,有利于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;
Run Code Online (Sandbox Code Playgroud)

我的问题是:1.我应该担心吗?就像我说的,脚本工作正常2.如果ans(1)不是,有没有办法将其关闭?我在命令行中看不到任何东西..

Bor*_*din 5

好的,最近添加了这些弃用.例如,AUTOLOAD弃用是在今年10月底推出的,我的Mojolicious版本之前就是这样,所以我没有看到你收到的消息.我现在升级了我的安装并理解了这个问题.

不幸的是,Mojolicious DEPRECATED消息是由Carp模块生成的,它们不响应no warnings编译指示.我知道禁用的唯一方法是将警告处理程序设置为null子例程,就像这样

$SIG{__WARN__} == sub {  };
Run Code Online (Sandbox Code Playgroud)

但这非常严厉,因为它会使所有警告沉默,而不仅仅是你所看到的令人讨厌的警告.

由于您使用的设施已被弃用,因此很可能在不久的将来从Mojolicious套件中删除,因此如果您从一开始就学会采用新标准,那么最好.

消息说

Mojo::DOM::AUTOLOAD (html) is DEPRECATED in favor of Mojo::DOM::children
Run Code Online (Sandbox Code Playgroud)

这意味着他们更愿意使用$dom->children('html')而不是仅仅使用$dom->html.但是children返回一个Mojo::Collection对象,它是一节点,因此您需要选择该集合的第一个项目.转过来了

$dom->html->head->title
Run Code Online (Sandbox Code Playgroud)

陷入麻烦

$dom->children('html')->first->children('head')->first->children('title')->first
Run Code Online (Sandbox Code Playgroud)

所以使用at带有CSS3表达式的方法要好得多,你可以编写

$dom->at('html > head > title')
Run Code Online (Sandbox Code Playgroud)

哪个很好,并且不会产生任何警告.请注意,它不是children/ firstchain 的确切替换,因为正在搜索整个文档中的title节点,该节点是节点的子head节点的子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;
Run Code Online (Sandbox Code Playgroud)

产量

      Mojolicious - Perl real-time web framework
Run Code Online (Sandbox Code Playgroud)