Chinaunix

标题: 初学perl 被一简单的程序困惑 [打印本页]

作者: 308happy    时间: 2008-07-31 10:42
标题: 初学perl 被一简单的程序困惑
本人初学perl 被一简单的程序困惑 还请同志们指点

写一个模式,它能匹配$what 当前的内容的3 份连续拷贝。也就是说,如果$what 为fred
,则此模式能匹配fredfredfred。
如果$what 为fred|barney,则此模式能匹配fredfredbarney, barneyfredfred, barneyb
arneybarney,或者其它的变种。(提示:
你应当在程序的顶端设置$what 的值,如my $what = ‘fred|barney’;)


我写的代码是:
#!usr/bin/perl
use warnings;
use strict;
my $what = 'fred';
$what =~ s/$what{3}/$what;
print "$what.\n";

总是报错:Substitution replacement not terminated at ex9_1 line 5.

不太知道究竟是哪个地方写错了
作者: guijia8427    时间: 2008-07-31 10:45
原帖由 308happy 于 2008-7-31 10:42 发表
本人初学perl 被一简单的程序困惑 还请同志们指点

写一个模式,它能匹配$what 当前的内容的3 份连续拷贝。也就是说,如果$what 为fred
,则此模式能匹配fredfredfred。
如果$what 为fred|barney,则此模式 ...

哈哈哈 我知道这是小骆驼上的练习题
作者: 308happy    时间: 2008-07-31 10:52
呵呵 是啊 不过答案就一行代码 不明白啊
作者: guijia8427    时间: 2008-07-31 10:57
原帖由 308happy 于 2008-7-31 10:52 发表
呵呵 是啊 不过答案就一行代码 不明白啊

有答案么 没看到 写出来看看
作者: 308happy    时间: 2008-07-31 10:58
答案写的是
/($what){3}/
作者: guijia8427    时间: 2008-07-31 11:02
原帖由 308happy 于 2008-7-31 10:58 发表
答案写的是
/($what){3}/

呵呵 我也挺好奇 为啥你的 $what =~ s/$what{3}/$what; 后面为啥要多个$what
作者: 308happy    时间: 2008-07-31 11:07
我就是想用替换 把之前的$what替换成$what{3}
不过就是用答案的这个 我还是没运行成功的
还请guijia8427 指点~
作者: changejun    时间: 2008-07-31 11:09
在替换部分可使用模式次序变量$n,如$n,如s/(\d+)/[$1]/,但在替换部分不支持模式的特殊字符,如{},*,+等
作者: guijia8427    时间: 2008-07-31 11:20
原帖由 308happy 于 2008-7-31 11:07 发表
我就是想用替换 把之前的$what替换成$what{3}
不过就是用答案的这个 我还是没运行成功的
还请guijia8427 指点~

$str =~/($what){3}/;   可以啊  我试过行啊
#!/usr/bin/perl
use warnings;
use strict;
my $str="fredfredfreddkkd";
my $what = 'fred';
$str =~/($what){3}/;
print $&;

输出
fredfredfred

[ 本帖最后由 guijia8427 于 2008-7-31 11:22 编辑 ]
作者: net_robber    时间: 2008-07-31 11:20
(A|B){1,3}
作者: 308happy    时间: 2008-07-31 12:29
to guijia8427:好像换成my $what = ‘fred|barney’不行啊, $str="fredfredfreddkkd"赋值是什么意思呢?

请教net_robber
(A|B){1,3} 没太看明白 可否告知细节?

谢谢
作者: guijia8427    时间: 2008-07-31 13:08
原帖由 308happy 于 2008-7-31 12:29 发表
to guijia8427:好像换成my $what = ‘fred|barney’不行啊, $str="fredfredfreddkkd"赋值是什么意思呢?

请教net_robber
(A|B){1,3} 没太看明白 可否告知细节?

谢谢

换成 $what = ‘fred|barney’也行
$str="fredfredfreddkkd"就是你要解析的字符串啊 不然这个正则拿来做什么呢
作者: 308happy    时间: 2008-07-31 13:13
标题: 回复 #12 guijia8427 的帖子
明白了 可能我把题目理解错了 谢谢哈~
作者: hdc1112    时间: 2008-07-31 13:15
其实不用括号也可以

#!perl -w

$a="fredfredfred";

$regex=eval{qr/fred/};

if($a=~m/$regex{3}/) {print "aa";}

这样就可以

所以说要把正则表达式放到变量中时,最好采用$regex=eval{qr/fred/};这种形式,能判断该正则表达式的有效性
作者: 2gua    时间: 2008-08-02 21:15
建议买一本《正则表达式必知必会》放在案头做辅助参考。
:wink:
作者: yingweixu    时间: 2008-08-04 14:21
感觉~~~
新手上路应该多看书!多理解!
作者: 不死草    时间: 2008-08-04 15:41
同意14楼的,呵呵。。。
作者: churchmice    时间: 2008-08-04 15:54
标题: 回复 #9 guijia8427 的帖子
他那个没有加括号
解释成hash了吧




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2