Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25696
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-05 16:13
文章分类
文章存档

2016年(1)

2014年(12)

我的朋友

分类: PERL

2014-01-10 16:40:12

1.6.1 问题描述

如题,一次处理字符串的一个字符.

1.6.2解决方案

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

1.6.3 讨论

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

    }

 

使用splitunpack会把得到一个含有字符的数组,如果你不想使用数组,可以在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

一般情况下,如果需要一个个的处理字符,除了用indexsubstr或者splitunpack,用模式更为简单。如需计算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);
      }
  }
阅读(385) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~