高级perl语法 - Mojo :: DOM

Wak*_*nka 3 syntax perl dom html-parsing mojolicious

我正在尝试理解一些高级(对我来说)perl语法,用于在本教程后使用DOM进行html解析:

say "div days:";
say $_->text for $dom->find('div.days')->each;

say "\nspan hours:";
say $_->text for $dom->find('span.hours')->each;
Run Code Online (Sandbox Code Playgroud)

这个语法是什么意思?这是什么样的循环?建筑经典看起来像这样:for(i=0;i<10;i++){ code }不:{code} for (some_condition)

在这种情况下,"each"关键字的含义是什么?它是否与eachPerl内置函数有共同之处,或者它是否特定于Mojo :: DOM?我想如果each是在Mojo :: Dom下,应该在Mojo :: DOM主页上提及它.但是我没有each他们网站方法部分找到任何提及,所以它必须是Perl的内置函数.但是,这个内置each函数有一个完全不同的语法 - 这怎么可能?

教程页面的另一个例子

say "Open Times:";
say for $dom->find('div.openTime')
            ->map(sub{$_->children->each})
            ->map(sub{$_->text})
            ->each;
Run Code Online (Sandbox Code Playgroud)

与上述mapsub方法相同的问题.

  • 那些"Perlish"代码可以用更"C风​​格"的方式重写,以便我能理解吗?
  • 最重要的是:如何列出所有方法的参数和返回Mojo :: DOM中包含的值?它必须以某种方式完成,因为我读到即使对于Perl,也有IDE具有intellisense(自动完成),因此这个IDE必须知道方法返回值类型等.

sim*_*que 9

say "Open Times:";
say for $dom->find('div.openTime')
            ->map(sub{$_->children->each})
            ->map(sub{$_->text})
            ->each;
Run Code Online (Sandbox Code Playgroud)

所有这些关键字(find,map,each)实际上不是关键字,但是从方法::魔DOM.您可以由->操作员识别它们.

在这种情况下,几种方法已被链接在一起.只有当它们中的每一个都$dom再次返回它的对象(在这个例子中)时,才有可能.这种链通常用于JavaScript,特别是对于像jQuery这样的现代框架.它使代码易于阅读并节省操作.

基本上,您在链中应用多个事务.

  1. find 所有元素'div.openTime'
  2. map(用每个东西做一些)用给定的子(这是一个真正的Perl sub):
    1. 将所有children当前元素作为集合
    2. each它们的列表(如,返回一个数组)
  3. map 他们有一个给定的子:
    1. text从元素中提取内容
  4. each他们的清单

所有这些都包含在后缀中foreach(如@Quentin所述).say是您可以加载的功能use features qw(say).它结合了print一个换行符.

也许现在它更清楚这里发生了什么:

my $collection1 = $dom->find('div.oopenTime');

my $collection2 = $collection1->map(
  sub {
    my $collection = $_->children;
    return $collection->each;
  }
);

my collection3 = $collection2->map(
  sub {
    return $_->text;
  }
);

foreach my $text ($collection3) {
  say $text;
}
Run Code Online (Sandbox Code Playgroud)

提供自动完成功能的IDE通常会扫描相关代码以了解对象具有的方法.看一下如何在Perl中列出给定对象或包的可用方法?或者阅读模块的代码.更好的是:阅读文档.


Que*_*tin 5

这个语法是什么意思,这里发生了什么?

它是循环后缀.

for (@foo) {
    say $_
}
Run Code Online (Sandbox Code Playgroud)

可写成

say $_ for @foo;
Run Code Online (Sandbox Code Playgroud)

此外,"each"关键字在此上下文中的含义是什么

它是对象的一种方法.它返回Mojo :: Collection中的事物列表.