LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1348|回复: 6

关于模式匹配选项的问题

[复制链接]
发表于 2003-11-30 22:22:09 | 显示全部楼层 |阅读模式
看了书上的几个模式匹配选项的例子,还是没有感觉到他们的用处,尤其是选项g,o,哪位师兄能帮我举个例子讲解一下吗?谢谢~~~~~~
发表于 2003-11-30 22:42:49 | 显示全部楼层
1.g的解释。
匹配所有可能的模式(g选项)
   @matches = "balata" =~ /.a/g; # now @matches = ("ba", "la", "ta")
   匹配的循环:
   while ("balata" =~ /.a/g) {
     $match = $&;
     print ("$match\n");
   }
   结果为:
     ba
     la
     ta
   当使用了选项g时,可用函数pos来控制下次匹配的偏移:
     $offset = pos($string);
     pos($string) = $newoffset;

2. o的解释
只执行一次变量替换例
   $var = 1;
   $line = <STDIN>;
   while ($var < 10) {
     $result = $line =~ /$var/o;
     $line = <STDIN>;
     $var++;
   }
   每次均匹配/1/。

其他不懂的请先看http://www.yuzi.net/perl5/perl6. ... C%B5%C4%C4%A3%CA%BD(g%D1%A1%CF%EE)
 楼主| 发表于 2003-12-1 12:22:08 | 显示全部楼层
2. o的解释
只执行一次变量替换例
$var = 1;
$line = <STDIN>;
while ($var < 10) {
$result = $line =~ /$var/o;
$line = <STDIN>;
$var++;
}
每次均匹配/1/。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我的书上也是这两个例子,这个我有点不明白了
每次匹配/1/是不是指在$var++之后返回执行 $result = $line =~ /$var/o;的时候仍然匹配/1/,而不管$var现在的值是不是1,而现在$var的值为2了是吗?这这个意思吧?
发表于 2003-12-1 12:57:31 | 显示全部楼层
这个脚本不是很好,我改了一下。:sorry

#!/usr/bin/perl -w
$var = 1;
while ($var < 6) {
$line=<>;
$result = $line =~ /$var/o;
print "$result\n";
$var++;
}

这里的o是使$var++失效,每次输入的数字有1结果都为真。
你把o去掉就可以看出了。

只执行一次变量替换例,就是只要初值,以后都不变化了。
 楼主| 发表于 2003-12-2 18:04:32 | 显示全部楼层
哦,运行的时候只匹配1了啊
我在print "$result\n";后加了
print "$var\n";
输出:
1
1(回车)

2(回车)


5
只输出了一次匹配1,循环时没有再输出了阿
这样看来好像是$var++有效,但/$var/o中不变
但后来又为什么没有输出$result呢?
发表于 2003-12-2 19:45:52 | 显示全部楼层
$result = $line =~ /$var/o;
把這行分開便可以了
发表于 2003-12-2 20:29:32 | 显示全部楼层
$line =~ /$var/o; 是返回一个值个$result,真就是1,假就没有输出。

要输出符合条件并是原来的值,可以用这个脚本试试。

#!/usr/bin/perl -w
$var = 1;
while ($var < 6) {
$line=<>;
if ($line =~ /$var/o ){
print "$line\n";
}
$var++;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表