【问题标题】:Indexing directly into returned array in Perl在 Perl 中直接索引到返回的数组
【发布时间】:2010-07-01 00:10:44
【问题描述】:

关于 PHP 的 herehere 都被问过这个问题,我对 Perl 也有同样的问题。给定一个返回列表的函数,有什么方法(或最好的方法)可以在不使用临时变量的情况下立即索引到它?

例如:

my $comma_separated = "a,b,c";
my $a = split (/,/, $comma_separated)[0]; #not valid syntax

我明白为什么第二行中的语法无效,所以我想知道是否有一种方法可以在不首先将返回值分配给列表并从中索引的情况下获得相同的效果。

【问题讨论】:

    标签: perl


    【解决方案1】:

    只需使用括号来定义您的列表,然后将其索引以提取您想要的元素:

    my $a = (split /,/, $comma_separated)[0];
    

    【讨论】:

    • 因为在很多情况下,括号在函数 cals 上是可选的,所以我通常会写成 my $x = (split /,/ => $str)[0]
    • @Carl,您可能会想到的一种方式是,对于split( ... ),括号仅处理 call -> 您希望使用这些参数调用 split。在上面加上[0] 没有什么意义。然而( split ... ) 解决了 returned 的值,这正是您想要索引的内容。
    • 这很有帮助。但出乎意料的是,当我尝试直接打印结果而不是分配给变量时,像这样:print (split /,/, $comma_separated)[0];,我得到:syntax error at test.pl line 3, near ")["
    • @jdhildeb 这是因为在您的情况下,左括号被解释为包含 print 函数的参数。您可以将整个表达式包裹在另一层括号中(即print ((...)[0])),也可以在括号前放置一个加号以使其成为打印的单个参数(即print +(...))。
    • @Sean:谢谢你的解释,这很有道理。
    【解决方案2】:

    就像你可以这样做:

    ($a, $b, $c) = @array;
    

    你可以这样做:

    my($a) = split /,/, $comma_separated;
    

    LHS(左侧)上的my $a 被视为标量上下文。 my($a) 是列表上下文。它是一个单元素列表,因此它只获取从 split 返回的第一个元素。

    它具有自动限制拆分的额外好处,因此如果$comma_separated 很大,则不会浪费工作。

    【讨论】:

    • Perl 已经自动执行了这个优化。 From "perldoc -f split": "当赋值给一个列表时,如果 LIMIT 被省略或者为零,Perl 会提供一个比列表中变量数大一的 LIMIT,以避免不必要的工作。"
    猜你喜欢
    • 2020-06-02
    • 2012-06-28
    • 2023-04-05
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2018-09-13
    相关资源
    最近更新 更多