如何理解(和修改)这个Perl语句

时间:2013-08-29 08:51:17

标签: perl

我是Perl的新手。

我如何解释这个Perl语句?:

my( $foo, $bar ) = split /\s+/, $foobar, 2;

我知道局部变量是由split函数同时分配的,但是我不明白整数2是什么 - 我猜func会返回一个包含两个元素的数组吗?

Perl monger可以向我解释上述声明(ELI5)

此外,有时,被拆分的字符串不包含预期的标记,导致foo或bar未初始化,因此当尝试在代码中进一步使用它们时会发出警告。

如果拆分“失败”返回两个字符串,如何将$ foo和$ bar初始化为合理值(空字符串)?

3 个答案:

答案 0 :(得分:4)

split函数有三个参数:

  1. 匹配分隔符的正则表达式,或者特殊值" "(由单个空格组成的字符串),它修剪字符串,然后在/\s+/这样的空白处拆分。

  2. 应拆分的字符串。

  3. 结果片段的最大数量。有时这是对所有字段不感兴趣的优化,有时您不希望在每个分隔符处进行拆分,就像这里的情况一样。

  4. 因此,您的split表达式最多会返回两个字段,但不一定只返回两个字段。要为变量提供默认值,请在split之前指定默认值,或在undef之后检查它们是split,并提供默认值:

    my ($foo, $bar) = ('', '');
    ($foo, $bar) = split ...;
    

    或合并

    (my ($foo, $bar) = ('', '')) = split ...
    

    my ($foo, $bar) = split ...;
    $_ //= '' for $foo, $bar;
    

    如果LHS为//=undef运算符会在RHS上分配值。 for循环只是缩短代码的一种方法。

    您可能还希望仅在生成两个字段时继续使用一段代码:

    if ( 2 == (my ($foo, $bar) = split ...) ) {
      say "foo = $foo";
      say "bar = $bar";
    } else {
      warn "could not split!";
    }
    

    标量上下文中的列表赋值评估为分配的元素数。

答案 1 :(得分:1)

2是拆分返回的最大组件数。

因此,正则表达式/\s+/在空白块上分割$foobar,但只会拆分一次,以构成两个组件。如果没有空格,那么$ bar将是未定义的。

请参阅http://perldoc.perl.org/functions/split.html

除了amon的方法之外,Perl还有一个defined(x)函数,它返回true或false,具体取决于它的参数x是定义的还是未定义的,并且可以在if中使用用于纠正某些内容未定义的情况的声明。

请参阅http://perldoc.perl.org/functions/defined.html

答案 2 :(得分:0)

如上所述:http://perldoc.perl.org/functions/split.html

“如果指定LIMIT且为正,则表示EXPR可以分割到的最大字段数;”

例如:

#!/opt/local/bin/perl

my $foobar = "A B C D";
my( $foo, $bar ) = split /\s+/, $foobar, 2;

print "\nfoo=$foo";
print "\nbar=$bar";
print "\n";

输出:

foo=A
bar=B C D