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]
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]才是真正需要的,谢谢:)