关于map的问题

关于map的问题

my @numbers=("fdi","fdjos","fd");
print(map (do{$_=~tr/[a-z]/[A-Z]/},@numbers));
输出325,为什么呢?谢谢


QUOTE:
原帖由 demil 于 2008-5-8 22:53 发表
my @numbers=("fdi","fdjos","fd");
print(map (do{$_=~tr/[a-z]/[A-Z]/},@numbers));
输出325,为什么呢?谢谢

tr的返回值是被tr的字符个数
你的map的返回值就是tr的返回值
所以返回 3 2 5,分别是@numbers中各个元素的个数
你显式的返回$_就可以了

[Copy to clipboard] [ - ]
CODE:
<lig@romeo:~/chinaunix>$ perl -e ' my @numbers=("fdi","fdjos","fd"); print map {tr /[a-z]/[A-Z]/;$_ } @numbers '
FDIFDJOSFD<lig@romeo:~/chinaunix>$

而且没有必要用do
其实这东西用uc操作符就可以了

[Copy to clipboard] [ - ]
CODE:
<lig@romeo:~/chinaunix>$ perl -e ' my @numbers=("fdi","fdjos","fd"); print map { uc} @numbers '
FDIFDJOSFD<lig@romeo:~/chinaunix>$

tr的返回值是字符个数? 但是我用foreach实现map
foreach (@numbers) {
$_=~tr/[a-z]/[A-Z]/; #大写字符
}
print @numbers;#返回的大写的字符串数组阿?


QUOTE:
原帖由 demil 于 2008-5-9 15:26 发表
tr的返回值是字符个数? 但是我用foreach实现map
foreach (@numbers) {
$_=~tr/[a-z]/[A-Z]/; #大写字符
}
print @numbers;#返回的大写的字符串数组阿?

没有错
返回的就是替换后的字数
注意=~是绑定操作符,不是赋值
tr绑定了$_,将$_tr了以后$_就改变了,而在foreach中$_其实是个@numbers中每个元素的引用
所以改变了$_也改变了@numbers

你试试下面的代码就知道了:

[Copy to clipboard] [ - ]
CODE:
foreach (@numbers) {
my $res =  $_=~tr/[a-z]/[A-Z]/  ; #大写字符
print "result $res\n";
}
print @numbers



QUOTE:
tr/SEARCHLIST/REPLACEMENTLIST/cds
       y/SEARCHLIST/REPLACEMENTLIST/cds
               Transliterates all occurrences of the characters found in the
               search list with the corresponding character in the replacement
               list.  It returns the number of characters replaced or deleted.
               If no string is specified via the =~ or !~ operator, the $_
               string is transliterated.

厉害,我学的太粗糙了