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)不是,有没有办法将其关闭?我在命令行中看不到任何东西..
好的,最近添加了这些弃用.例如,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)