关于join,split的问题

demil
关于join,split的问题

为什么在下面代码中sp:em14: 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);           #打印分隔的字符串
}

想了半天没相通,请指教[img]http://bbs.chinaunix.net/images/smilies/em14.gif[/img]

churchmice
join的右边是一个list
现在你传递进去的是$text
都只有一个元素还join什么,结果不还是$text本身

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

churchmice
这一句
[code]
print (split //,@_);             #打印输出1
[/code]
之所以输出一,是因为split的右边提供了一个scalar的环境,@_在scalar环境中返回的是数组中元素的个数,这里只有一个
所以
相当于
[code]
print (split//,"1");
[/code]
所以结果当然是1了

churchmice
[quote]原帖由 [i]demil[/i] 于 2008-5-8 22:21 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8345861&ptid=1094665][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
楼上说的我知道,这是书上的一个例子,问题在于为什么在函数里面不能直接使用split //,@_,而需要先把传入的参数$text进行join,然后再调用split //,$text [/quote]
建议好好看看上下文的概念,什么是标量(scalar)环境,什么是列表(list)环境,以及perl的一些内置函数需要的环境
比如说:
split 是将一个变量分成好多个,所以右边提供的是一个scalar环境,左边提供的是一个list环境
而join是将多个变量合成一个,所以右边是一个list环境,左边是一个scalar环境
同时
split分割的是一个模式
而join不是
其实你可以简单的
[code]
split //,$_[0];
[/code]
根本不用那么麻烦
还有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.
[/quote]

[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";
}
[/code]

[[i] 本帖最后由 churchmice 于 2008-5-8 22:41 编辑 [/i]]

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