分类: 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里边可以使用函数substr和unpack来访问字符串中的部分字符。
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,26和30的位置。虽然我们可以计算出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-bit或8bit的数据(ASCI&ASCII)
1.1.4 其它
函数 pack, unpack, 和 substr 请参阅 perlfunc(1) 或者 Programming Perl的29章; 子程序cut2fmt的应用参阅第1.24节; unpack在二进制中的应用参阅第 8.24节