关于join,split的问题

关于join,split的问题

为什么在下面代码中sp lit,join在函数里面和外面使用的结果不同?谢谢

my $text="the quick brown fox jumps over the lazy dog";
print(split //,$text);  #运行正确,分隔成数组

my %count = frequence($text);
sub frequence {
my $text=join('',@_);
print length($text),",",length(@_),"\n";       #运行结果为 43,1
print "$text,@_\n";             #运行结果内容一样
print (split //,@_);             #打印输出1
print (split //,$text);           #打印分隔的字符串
}

想了半天没相通,请指教
join的右边是一个list
现在你传递进去的是$text
都只有一个元素还join什么,结果不还是$text本身
楼上说的我知道,这是书上的一个例子,问题在于为什么在函数里面不能直接使用split //,@_,而需要先把传入的参数$text进行join,然后再调用split //,$text
这一句

[Copy to clipboard] [ - ]
CODE:
print (split //,@_);             #打印输出1

之所以输出一,是因为split的右边提供了一个scalar的环境,@_在scalar环境中返回的是数组中元素的个数,这里只有一个
所以
相当于

[Copy to clipboard] [ - ]
CODE:
print (split//,"1");

所以结果当然是1了


QUOTE:
原帖由 demil 于 2008-5-8 22:21 发表
楼上说的我知道,这是书上的一个例子,问题在于为什么在函数里面不能直接使用split //,@_,而需要先把传入的参数$text进行join,然后再调用split //,$text

建议好好看看上下文的概念,什么是标量(scalar)环境,什么是列表(list)环境,以及perl的一些内置函数需要的环境
比如说:
split 是将一个变量分成好多个,所以右边提供的是一个scalar环境,左边提供的是一个list环境
而join是将多个变量合成一个,所以右边是一个list环境,左边是一个scalar环境
同时
split分割的是一个模式
而join不是
其实你可以简单的

[Copy to clipboard] [ - ]
CODE:
split //,$_[0];

根本不用那么麻烦
还有length 一个数组一点意义都没有

QUOTE:
       length EXPR
       length  Returns the length in characters of the value of EXPR.  If EXPR
               is omitted, returns length of $_.  Note that this cannot be
               used on an entire array or hash to find out how many elements
               these have.  For that, use "scalar @array" and "scalar keys
               %hash" respectively.



[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
my $text="the quick brown fox jumps over the lazy dog";

frequence ($text);
sub frequence {
print +(split //,$_[0]),"\n";
}

明白了,虽然传入的$text是个标量,但是参数@_是列表类型,而$_[0]才是真正需要的,谢谢