更好的问题:为什么它不打印像 array{0x1232ef} 这样的东西。 Print 假设打印字符串输出,@a 不是标量。
哎呀,更好:这是一个标量上下文,所以为什么不打印5,它是数组中元素的数量。方法如下:
print scalar @a;
会打印。
相反,print 命令正在尝试做一些你想要做的事情,而不是你说你想要做的事情。
我们来看看这个小程序:
@a = qw(a b c d e);
print "@a"; #prints "a b c d e"
print "\n";
print @a; #prints "abcde"
print "\n";
print @a . "\n"; #prints "5"
print scalar @a; #prints "5"
注意print @a 打印abcde,但如果我在末尾添加\n,它会在标量上下文中打印@a。
查看Perldoc on print(尝试命令perldoc -f print。在大多数系统上,整个Perl 文档都可以通过perldoc 获得)
* print LIST
* print
Prints a string or a list of strings. Returns true if successful[...]
啊!如果给定一个列表,它将打印一个字符串列表。
$, 的当前值(如果有)打印在每个 LIST 项目之间。 $\ 的当前值(如果有)在打印整个 LIST 之后打印。因为 print 需要一个 LIST,所以 LIST 中的任何内容都在列表上下文中进行评估,包括您传递给 print 的返回列表的任何子例程。
让我们尝试一个新程序:
@a = qw(a b c d e);
$, = "--";
print "@a"; #prints "a b c d e"
print "\n";
print @a; #prints "a--b--c--d--e"
print "\n";
print @a . "\n"; #prints "5"
print scalar @a; #prints "5"
嗯...$, 在列表元素之间添加了双破折号,但它不影响引号中的@a。而且,如果perldoc中提到了$,,为什么大家都在喋喋不休地谈论$"?
我们来看看perldoc perlvar
* $LIST_SEPARATOR
* $"
When an array or an array slice is interpolated into a double-quoted string or a
similar context such as /.../ , its elements are separated by this value. Default
is a space. For example, this:
print "The array is: @array\n";
is equivalent to this:
print "The array is: " . join($", @array) . "\n";
Mnemonic: works in double-quoted context.
所以,这就解释了一切!
$" 默认为单个空格,$, 默认为空。这就是为什么我们得到了我们得到的!
还有一个程序...
@a = qw(a b c d e);
$, = "--";
$" = "++";
print "@a"; #prints "a++b++c++d++e"
print "\n";
print @a; #prints "a--b--c--d--e"
print "\n";
print @a . "\n"; #prints "5"
print scalar @a; #prints "5"