1

我是 Perl 的新手。

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

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

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

Perl 贩子可以向我解释上面的陈述吗(ELI5)

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

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

4

3 回答 3

4

split函数接受三个参数:

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

  2. 应拆分的字符串。

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

因此,您的split表达式最多会返回两个字段,但不一定正好是两个。要为您的变量提供默认值,请在 之前分配默认值split,或者检查它们是否undef在 之后split,并给出默认值:

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

或结合

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

或者

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

如果 LHS 是,//=则操作员在 RHS 上分配值undeffor循环只是缩短代码的一种方式。

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

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

标量上下文中的列表分配计算为分配的元素数。

于 2013-08-29T08:59:30.447 回答
1

2 是 split 返回的最大组件数。

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

http://perldoc.perl.org/functions/split.html

除了 amon 的方法之外,Perl 有一个defined(x)函数,它根据参数x是定义的还是未定义的来返回 true 或 false,这可以在if语句中用于纠正未定义的情况。

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

于 2013-08-29T08:55:31.237 回答
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
于 2013-08-29T09:00:35.643 回答