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

2016年(1)

2014年(12)

我的朋友

分类: PERL

2014-01-06 16:46:35

1.1 访问字串

1.1.1 问题描述

需要访问或者修改字符串的一部分。

1.1.2 解决方案

substr 函数可以实现对字符串部分的读,写功能。使用方法如下:

$value = substr($string, $offset, $count);

$value = substr($string, $offset);

$string="abcdefghijk";

$offset=5;

$count=5;

$newstring1=substr($string, $offset, );

$newstring2=substr($string,$offset,$count)

print $newstring1; # fghijk

print $newstring2; # fghij

unpack函数同样可以访问字符串,但它只能够读,不能改变原来的字符串。它的运行速度比substr快,当需要摘录的内容很多时会表现的更明显

$newstring=unpack(“A4”,$string); #获取前四个字节(只对 ASCII码有效)

1.1.3  讨论

字符串是一种基本的数据类型,在其他编程语言中,用数组下表来访问字符串中的字符。Perl里边可以使用函数substrunpack来访问字符串中的部分字符。

substr 函数的参数offset 是从字符串的开始位置计算。

offset值为“+”的时候,从字符串的左边开始;

offset值为“-”的时候,从字符串的右边开始;

offset值为“0”的时候,从字符串的起始位置开始;

   参数count 是需要的字串的长度;

$string = "This is what you have";

#         +012345678901234567890  Indexing forwards  (left to right)

#          109876543210987654321- Indexing backwards (right to left)

$first  = substr($string, 0, 1);  # "T"

$start  = substr($string, 5, 2);  # "is"

$rest   = substr($string, 13);    # "you have"

$last   = substr($string, -1);    # "e"

$end    = substr($string, -4);    # "have"

$piece  = substr($string, -8, 3); # "you"

substr除了对字符串部分截取外,还可以改变字符串中部分字符的值。substr是左值函数的一种,所谓左值函数,即函数的返回值即为函数的左侧(字符串或表达式)的值.另外的一些函数例如vec,pos,keys,local,my,our等也是左值函数

$string = "This is what you have";

print $string;# This is what you have

substr($string, 5, 2) = "wasn't"; # change "is" to "wasn't"

#This wasn't what you have

substr($string, -12)  = "ondrous";# "This wasn't wondrous"

#This wasn't wondrous

substr($string, 0, 1) = "";       # delete first character

#his wasn't wondrous

#substr($string, -10)  = "";       # delete last 10 characters

#his wasn'

Substr和操作符=~s///m//tr//一起可使得操作仅对匹配的部分有效

# you can test substrings with =~

if (substr($string, -10) =~ /pattern/) {

            print "Pattern matches in last 10 characters\n";

}

# substitute "at" for "is", restricted to first five characters

substr($string, 0, 5) =~ s/is/at/g;#在前五个字符中匹配”is”更换为at

                                     #测试fail

通过substr,甚至可以交换字符串中两个位置字符的值

# exchange the first and last letters in a string

$a = "make a hat";

(substr($a,0,1), substr($a,-1)) =

(substr($a,-1),  substr($a,0,1));

print $a;          # take a ham

尽管unpack不是左值函数,但是当一次性的处理许多“摘录”时,它比substr的运行速度快。而且它可以指定输出的格式。(以下三个符号的操作针对ASCII码的字符串)

小写的“x”后面跟数字,表示向前跳过的字节数;

大写的“X”后面跟数字,表示向后跳过的字节数

@”表示跳过绝对偏移量

# extract column with unpack

$a = "To be or not to be";

$b = unpack("x6 A6", $a);  # skip 6, grab 6

print $b;#or not

($b, $c) = unpack("x6 A2 X5 A2", $a);

 # forward 6, grab 2; backward 5, grab 2

print "$b\n$c\n";

#output or

        be

也许有的时候我们在切割数据时,更倾向于在指定的栏位,例如切割的位置在8,14,20,2630的位置。虽然我们可以计算出unpack的格式为,“A7,A6,A6,A6,A4,A*”但这个计算过程对perl的程序员来说也许很伤脑筋,我们可以通过子程序cut2fmt解决

sub cut2fmt {

    my(@positions) = @_;

    my $template   = '';

    my $lastpos    = 1;

    foreach $place (@positions) {

        $template .= "A" . ($place - $lastpos) . " ";

        $lastpos   = $place;

    }

    $template .= "A*";

    return $template;

}

$fmt = cut2fmt(8, 14, 20, 26, 30);

print "$fmt\n"; #A7 A6 A6 A6 A4 A*

这个unpack功能强大,它不仅可以应用与文本的处理,它也是文本和二进制文件的桥梁,在本节中,所有的例子中,假设字符为7-bit8bit的数据(ASCI&ASCII

1.1.4 其它

函数 pack, unpack, substr 请参阅 perlfunc(1) 或者 Programming Perl29; 子程序cut2fmt的应用参阅第1.24; unpack在二进制中的应用参阅第 8.24

阅读(343) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:Perl Cookbook----1.2赋值缺省值

给主人留下些什么吧!~~