链到数组索引?

时间:2016-07-13 05:23:45

标签: arrays perl chaining

可以通过链接从函数的结果中获取数组的元素,如下所示:

print $elem->descendants->[0]->as_trimmed_text();

其中$elemHTML::Element

有时这似乎适用于某些功能,但上述功能无效。我找不到任何关于这种链接是否有用的文档。

正常的非链接方式是:

($elem->descendants)[0]->as_trimmed_text();

2 个答案:

答案 0 :(得分:3)

根据HTML::Element模块的文档,方法descendants返回一个列表。

  

<强>后代
      @descendants = $ h-&gt; descendants();

     

在列表上下文中,返回所有$ h的后代元素的列表,       在预订中列出(即,一个元素出现在其内容之前 -       元件)。文本段不会出现在列表中。       在标量上下文中,返回所有这些元素的计数。

然后你必须使用下标运算符索引返回的列表,就像你说的那样。

箭头操作符有两个角色。当它的右侧是[...]下标时(这里考虑的情况),它通过数组引用访问各个数组元素 - 它必须是左侧的东西。来自Arrow operator in perlop

  

如果右侧是[...],{...}或(...)下标,那么左侧必须是对数组的硬引用或符号引用,哈希,或者分别是子程序。

因此,要以这种方式使用它,我们需要从descendants返回的arrayref。函数通常会返回一个数组引用,这可能就是当你以这种方式工作时。

->运算符的另一个用途是当它的左侧是一个对象(祝福引用)或类/包名称时,通常用于调用方法。从上面链接的同一页面

  

否则,右侧是方法名称或包含方法名称或子程序引用的简单标量变量,左侧必须是对象(有福的引用)或类名称(即,包裹名字)。

在行中下一次使用它会调用一个方法->as_trimmed_text(),所以显然descendants返回的列表的第一个元素是一个对象。

答案 1 :(得分:1)

如前所述,间接运算符在其操作数上强制使用标量上下文,并期望引用作为其第一个操作数

在标量上下文中,$elem->descendants返回后代数的简单计数,因此操作失败。它只在列表上下文中返回一个后代元素列表

您可以通过生成匿名数组来强加列表上下文并生成数组引用,如此

[ $elem->descendants ]->[0]->as_trimmed_text;

但我更喜欢像

这样的东西
my ($first_descendant) = $elem->descendants;
$first_descendant->as_trimmed_text;