【问题标题】:Perl `split` does not `split` to default arrayPerl `split` 不会`split` 到默认数组
【发布时间】:2017-10-24 12:05:33
【问题描述】:

我对@9​​87654322@ 有一个奇怪的问题,默认情况下它不会将split 放入默认数组中。

下面是一些玩具代码。

#!/usr/bin/perl

$A="A:B:C:D";
split (":",$A);
print $_[0];

这不会打印任何内容。但是,如果我明确拆分为默认数组,例如

#!/usr/bin/perl

$A="A:B:C:D";
@_=split (":",$A);
print $_[0];

正确打印 A。我的 perl 版本是 v5.22.1。

【问题讨论】:

  • @_ 不是“默认数组”。 @_ 是包含子程序参数的数组。 Perl 文档中没有任何内容将其称为默认数组。
  • @DaveCross 这并不完全正确。 perldoc.perl.org/perlvar.html#%40ARG 表示在子例程中,@ 是数组运算符 pop 和 shift_ 的默认数组。但你当然是对的。

标签: perl split


【解决方案1】:

split 默认不会转到@_@_ 不像 $_ 那样工作。它仅用于函数的参数。 perlvar 说:

在子程序中,数组@_ 包含传递给该子程序的参数。在子例程中,@_ 是数组运算符 pop 和 shift 的默认数组。

如果你使用use strictuse warnings 运行你的程序,你会看到

在 void 上下文中对 split 的无用使用

但是,如果没有提供任何内容,split 确实使用$_ 作为其第二个参数(拆分的字符串)。但是您必须始终将返回值用于某事。

【讨论】:

  • split 在 void 上下文中用于填充 @_
  • @ikegami 那是什么时候?
  • 在 5.12 中消失了。至少早在 5.8.8 就已弃用
  • @ikegami 感谢您的查找。我认为我们可以将其作为评论。 OP 要求 5.22。如果您认为它应该进入答案,请随时对其进行编辑。
【解决方案2】:

您必须将拆分分配给数组:

use strict;
use warnings;

my $string = "A:B:C:D";
my @array = split(/:/, $string);
print $array[0] . "\n";

【讨论】:

  • 并且不要调用你的变量$a@a - 无论如何使用单个字母名称是不好的,但尤其是当它是$a$bsort 使用
猜你喜欢
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 2014-02-24
相关资源
最近更新 更多