【问题标题】:Weird behavior of split function分裂函数的奇怪行为
【发布时间】:2014-08-07 18:29:35
【问题描述】:

有人可以解释以下输出吗:

为什么有两个 $VAR1 变量,如果它是具有更多元素的数组,那么 $VAR2 在哪里?

$ echo -e "a:b:c\n" | perl -lne 'use Data::Dumper; @a = split(":", $_); print Dumper \@a'
$VAR1 = [
          'a',
          'b',
          'c'
        ];

$VAR1 = [];

上面的 Seme 输出而不是引用是打印的数组,没有像以前那样的其他元素。

$ echo -e "a:b:c\n" | perl -lne 'use Data::Dumper; @a = split(":", $_); print Dumper @a'
$VAR1 = 'a';
$VAR2 = 'b';
$VAR3 = 'c';

“undef”从何而来?为什么又是奇怪的 $VAR1?

$ echo -e "a:b:c\n" | perl -lne 'use Data::Dumper; @a = split(":", $_); $b = $a[0]; print Dumper $b'
$VAR1 = 'a';

$VAR1 = undef;

【问题讨论】:

  • 附注:您可以将第一个 perl 语句简化为 perl -MData::Dumper -F: -lane 'print Dumper \@F'
  • 谢谢,这是学者的错误

标签: bash perl


【解决方案1】:

Echo 已经添加了一个尾随换行符(除非您指定 -n),因此您输入的是“a:b:c\n\n”,一个带有“a:b:c”的行和一个空行。

由于有两行,perl 的 -n 标志的隐式循环运行了两次,并且对 Data::Dumper 有两个单独的调用。

Data::Dumper 获取要单独转储的项目列表;当你将它传递给 @a 而不是 \@a 时,它会获得一个包含三个标量的列表(第一行,第二行的空列表)以独立转储。

您可以设置简洁标志来抑制变量名(我相信在某些递归结构的情况下除外):

$Data::Dumper::Terse = 1;
print Dumper ["a".."c"];

产量:

[
  'a',
  'b',
  'c'
]

或使用 OO 接口显式设置变量名称:

print Data::Dumper->new( [ ["a".."c"], "apple" ], [ "array", "fruit" ] )->Dump();

产量:

$array = [
           'a',
           'b',
           'c'
         ];
$fruit = 'apple';

【讨论】:

    【解决方案2】:

    echo 命令在输出其参数后输出换行符,因此echo -e "a:b:c\n" 实际上输出a:b:c\n\n

    因为您使用-l-n 开关调用Perl,所以代码将运行两次,一次使用$_ = "a:b:c",一次使用$_ = "",这是第二次运行产生@ 987654328@ 和$VAR1 = undef; 行。

    第二个代码 sn-p 不会为空输入行产生任何输出,因为此时 @a 是空的,因此 Dumper 没有任何要打印的参数。

    【讨论】:

    • 谢谢,这是学者的错误。
    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 2019-06-03
    • 2011-06-14
    • 2020-01-31
    • 2014-05-24
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多