有人可以解释以下输出:
为什么有两个$ 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;
答案 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
没有任何要打印的参数。