给数组加引号的确切作用是什么?

给数组加引号的确切作用是什么?

比如数组定义如下:
@myarr = qw(I like you);

print @myarr; 的输出结果为
Ilikeyou

print "@myarr"; 的输出结果为
I like you

print join("\n", reverse(@myarr));的输出结果为
you
like
I

print join("\n", reverse("@myarr"));的输出结果为
I like you

哪位能够逐个说明产生这些结果差别的确切原因,特别是最后一个输出结果的原因,这里面reverse没有发挥作用。谢谢。
@myarr 是一个数组
"@myarr" 是一个字符串……

字符串和数组是不同的,明白了吗?
谢谢flw,明白了。我没有看到本质。呵呵。
print join("\n", reverse(@myarr));的输出结果为
you
like
I


输入应该为:
you
-like
-I


-是空格


QUOTE:
原帖由 gaochong 于 2008-3-21 17:23 发表
print join("\n", reverse(@myarr));的输出结果为
you
like
I


输入应该为:
you
-like
-I


-是空格

不知道你在说什么。


QUOTE:
原帖由 xdwjack 于 2008-3-21 15:25 发表
比如数组定义如下:
@myarr = qw(I like you);

print @myarr; 的输出结果为
Ilikeyou

print "@myarr"; 的输出结果为
I like you

print join("\n", reverse(@myarr));的输出结果为
you
like
I

...

1.

[Copy to clipboard] [ - ]
CODE:
print @myarr;

在这里,传递给print的是一个list,在print之前@myaddr的内容被展开,所以实际执行:
print "I","like","you";
各项之间以$,分割,默认的分隔符是null,也就是什么都没有
可以更改list之间的分隔符,如下所示:

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
my @myarry = qw ( I like you );
$,="***";
print @myarry,"\n";

运行结果

QUOTE:
<lig@other-server:~/chinaunix>$ ./separate
I***like***you***

在这里分割字符改成了"***",所以有上面的输出
2.

[Copy to clipboard] [ - ]
CODE:
print "@myarr";

这一句是首先将@myarr中的所有元素拼接成一个字符串,各个元素之间以$"分割,
$"默认是一个空格" ",然后print得到的参数是此拼接以后的字符串
可以改写$",如下代码:

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
my @myarry = qw ( I like you );
$"="###";
print "@myarry","\n";



QUOTE:
<lig@other-server:~/chinaunix>$ ./separate
I###like###you

3.

[Copy to clipboard] [ - ]
CODE:
print join("\n", reverse(@myarr));

join的原型说明
join EXPR,LIST
因而reverse(@myarr)是在list的环境中操作,将@myarr中的元素取反(最后一个变成第一个,第一个变成最后一个)
然后将各个元素之间用\n连接起来,返回的一个scalar类型(字符串),然后print打印该字符串
4.

[Copy to clipboard] [ - ]
CODE:
print join("\n", reverse("@myarr"));

这一条的话reverse的操作对象是"@myarr",具体执行的时候首先@myarr中个各个元素以$"拼接成一个字符串,然后交给reverse
在list环境中(由join决定),reverse对一个字符串没有影响(在scalar环境中可以返回逆序字符串)
下面的代码很能说明这个问题

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
my @myarry = qw ( I like you );
print join("\n",scalar reverse ("@myarry"));
print "\n";

在上面的代码中reverse是在一个标量环境中操作的,因而返回的是逆序以后的字符串
而join的元素只有一个(反序后的字符串),因而join对结果没有影响
结果

QUOTE:
<lig@other-server:~/chinaunix>$ ./separate
uoy ekil I

关键:
1.有些函数的返回结果收context的影响
2. $",$,变量的理解
楼上讲得很不错!
不过我还是觉得“搞清楚一个是数组,一个是字符串”才是七寸要害。
万分感谢 churchmice 和 flw,听了你们的讲解我彻底明白了。 呵呵。
churchmice 和 flw两人的风格完全不一样,却都让我尊敬


QUOTE:
原帖由 flw 于 2008-3-21 15:33 发表
@myarr 是一个数组
"@myarr" 是一个字符串……

字符串和数组是不同的,明白了吗?

日,你连"@myarr"是字符串变量内插都不跟人说,就指望别人明白!!!!