Chinaunix首页 | 论坛 | 博客
  • 博客访问: 470009
  • 博文数量: 142
  • 博客积分: 4126
  • 博客等级: 上校
  • 技术积分: 1545
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-22 10:03
文章分类

全部博文(142)

文章存档

2011年(8)

2010年(7)

2009年(64)

2008年(63)

我的朋友

分类:

2008-12-15 17:17:27

1.1.1 提出问题
 
你想以字符或者单词为单位翻转字符串
 
1.1.2 解决方案
 
使用reverse函数在标量上下文里面以字符为单位翻转字符串:
 

$revchars = reverse($string);

要是想以单词为单位,则要在列表环境中使用reverse函数,并且配合split和join函数,如下:

$revwords = join(" ", reverse split(" ", $string));

1.1.3 讨论

reverse函数在标量上下文或和列表上下文里面分别具有不同的功能。在标量上下文的情况下,它把它的所有参数拼合成一个字符串,然后把这个字符串按字符为单位翻转后返回;而在列表上下文时,它只是把它的所有参数翻转并返回一个翻转后的列表。如果你要用reverse把字符串按字符为单位翻转,除非明显是在标量上下文里面, 否则你得用scalar函数强制声明这是个标量上下文。

$gnirts = reverse($string); # 反转$string的字符


@sdrow = reverse(@words); # 反转@words中的元素


$confused = reverse(@words); # 反转join("", @words)中的字符


@words=('machine','is','a','good','boy');
$confused=reverse(@words);
print $confused;
# $>yobdoogasienihcam

下面是一个把字符串以单词为单位翻转的例子。在split函数里面,模式使用一个只包含一个空格的字符串是一个特例。因为使用这样的模式的话,split会以连续的空格作为分隔符,而且会舍弃结果中的首部空元素(leading null fields),这点就跟awk一样。一般情况下的话,aplit只会舍弃尾部的空元素(trailing null fields)。

 

# 以单词为单位反转

$string = 'Yoda said, "can you see this?"';
@allwords = split(" ", $string);
$revwords = join(" ", reverse @allwords);
print $revwords, "\n";

我们可以不使用临时数组@allwords而把上面的语句写成一行:

 

$revwords = join(" ", reverse split(" ", $string));

原字符串$string 里面的多个连续空格现在在$revwords里面会编程单个空格。如果你想要保留原字符串的空格,这样写:

 

$revwords = join("", reverse split(/(\s+)/, $string));

#例子

$string='machine is a good boy!';
$revword1 = join("", reverse split(/(\s+)/, $string));
$revword2 = join(" ", reverse split(" ", $string));
print "$revword1\n$revword2";
# $>boy! good a is machine
# $>boy! good a is machine

reverse函数的用途之一确定一个单词是否是一个palindrome(正看和反看这个单词都是一样的):

 

$word = "reviver";
$is_palindrome = ($word eq reverse($word));

我们可以用这样的一行代码来在/usr/dict/words这个文件里面找到一些比较长的palindromes:
% perl -nle 'print if $_ eq reverse && length > 5' /usr/dict/words
deedeed
degged
deified
denned
hallah
kakkak
murdrum
redder
repaper
retter
reviver
rotator
sooloos
tebbet
terret
tut-tut

1.2.4 参考

关于split,reverse,scalor函数的用法可以参考perlfunc(1)和大骆驼书29章,下面一节也有介绍。

阅读(557) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~