my @a = (1,2,3,4,5);
print @a; #output: 12345
print "\n";
print "@a"; #output: 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)
通过将名称加上双引号来打印数组会在输出的每个索引值之间放置一个空格.它是如何做到的?为什么不print @a;
打印相同?两种类型的需求是什么?我的意思是你何时会使用print @a;
而不是print "@a";
反之亦然.
更好的问题:为什么不打印类似数组{0x1232ef}的东西.打印是假设打印字符串输出而@a
不是标量.
哎呀,甚至更好:这是一个标量上下文,所以为什么不打印5
哪个是数组中的元素数.这是如何:
print scalar @a;
Run Code Online (Sandbox Code Playgroud)
会打印.
相反,这个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"
Run Code Online (Sandbox Code Playgroud)
请注意print @a
打印abcde
,但如果我\n
在末尾添加一个,则会@a
在标量上下文中打印.
看看打印时的Perldoc(尝试命令perldoc -f print
.在大多数系统上,可以通过以下方式获得整个Perl文档perldoc
)
* print LIST
* print
Prints a string or a list of strings. Returns true if successful[...]
Run Code Online (Sandbox Code Playgroud)
啊! 如果给出一个列表,它将打印一个字符串列表.
在每个LIST项目之间打印$(如果有)的当前值.在打印完整个LIST后打印$ \(如果有)的当前值.因为print采用LIST,所以LIST中的任何内容都在列表上下文中进行评估,包括您传递给打印的返回列表的所有子例程.
我们来试试一个新程序:
@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"
Run Code Online (Sandbox Code Playgroud)
嗯... $,
在列表元素之间添加了双短划线,但它不会影响@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.
Run Code Online (Sandbox Code Playgroud)
所以,这解释了一切!
默认$"
值为单个空格,默认$,
值为null.这就是为什么我们得到了我们得到的东西!
还有一个程序......
@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"
Run Code Online (Sandbox Code Playgroud)
在第一个实例中,您将传递一个参数列表print
,并依次打印每个参数.
在第二个中,您将数组插入到字符串中,然后打印结果.当一个数组以字符串形式插入时,这些值被分隔$"
,默认为.