分裂函数的奇怪行为

时间:2014-08-07 18:29:35

标签: bash perl

有人可以解释以下输出:

为什么有两个$ 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;

2 个答案:

答案 0 :(得分:6)

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

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

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

您可以设置terse标志来禁止变量名称(除非在某些递归结构中,我相信):

$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';

答案 1 :(得分:4)

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

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

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