分类: PERL
2014-01-10 16:40:12
如题,一次处理字符串的一个字符.
用split跟一个空的模式来分离字符串成为单一/独立的字符,假如只想得到字符对应的值,也可以用unpack。
$string=“springs”;
@array = split(//, $string); # s p r i n g s
@array = unpack("U*", $string); #115 112 114 105 110 103 115
Perl 的基本单位是字符串,一次处理字符串的一个字符时很少见的。用perl的一些高级操作例如模式匹配处理此类问题更为有效。
用空的模式将字符串分割为独立的字符,如果是有意而为,这回给我们带来很多方便,但很容易使误操作引起的。例如,/X*/会匹配所有可能的字符串,包括空字符串有时候匹配的结果却不是你想要的。下面的例子把字符串“an aple a day ”的字符按照升序排列
%seen = ( );
$string = "an apple a day";
foreach $char (split //, $string) {
$seen{$char}++;
}
print "unique chars are: ", sort(keys %seen), "\n";
=>unique chars are: adelnpy
或者通过使用while循环,依次提取字符
while (/(.)/g) { # . is never a newline here
# $1 has character, ord($1) its number
}
使用split和unpack会把得到一个含有字符的数组,如果你不想使用数组,可以在while的循环中使用标示符/g,这样可以一次提取一个字符:
%seen = ( );
$string = "an apple a day";
while ($string =~ /(.)/g) {
$seen{$1}++;
}
print "unique chars are: ", sort(keys %seen), "\n";
=>unique chars are: adelnpy
一般情况下,如果需要一个个的处理字符,除了用index和substr或者split和unpack,用模式更为简单。如需计算32位的校验和,比起手动计算,则用unpack更有效率。
下面的例子中用foreach循环来计算$string的校验和,这种方法只用来计算基本的简单校验和,用标准的Digest::MD5模块(5.8版本以上perl版本自带,其它版本可以从CPAN下载)可以计算更为复杂的校验和。
$sum = 0;
foreach $byteval (unpack("C*", $string)) {
$sum += $byteval;
}
print "sum is $sum\n";
# prints "1248" if $string was "an apple a day"
This does the same thing, but much faster:
$sum = unpack("%32C*", $string);
下面的小程序Example 1-1 slowcat,对于输入的部分它一次处理一个字符。程序中每当一个字符输出后程序暂停以便阅读和了解整个输出内容
Example 1-1. slowcat #!/usr/bin/perl
# slowcat - emulate a s l o w line printer
# usage: slowcat [-DELAY] [files ...]
$DELAY = ($ARGV[0] =~ /^-([.\d]+)/) ? (shift, $1) : 1;
$| = 1;
while (<>) {
for (split(//)) {
print;
select(undef,undef,undef, 0.005 * $DELAY);
}
}