perl 正则表达式s///的2个疑问

#! /usr/perl/bin
use warnings;
use strict;
my $in=$ARGV[0];
$out=$in;
$out=~s/(\.w+)?$/\.out/;
print $out;
open LOG1,"<$in";
open LOG2,">$out";

=============
$out=~s/(\.w+)?$/\.out/;
1.这一行为什么必须加上?才能匹配并且替换成.out,$out=~s/(\.w+)$/\.out/; 为什么不能替换

2.\.out--替换成的内容为什么不加反斜杠也可以呢?

他这个替换的作用是把 一个文件名例如 a.txt 替换成 a.out
或者无后缀的文件名 b 替换为 b.out
所以你的问题:
1. 加上? 是为了可以匹配有后缀和无后缀的两种情况,还有你的正则写错了 w 前面应该加个\
写成 s/(\.\w+)?$/.out/ 才对
2. s后面的替换内容不是正则表达式,是一个字符串形式,是不会理解+? 这种东西的,不需要转义
字符串里面怎么写,那里就怎么写
就像 print "\.out"; 这里加不加反斜杠都可以,但是推荐是不加的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-21
1.你没有把你此处的输出的值写出来,别人没法帮你分析具体原因。

2.正则表达式中的字符,点'.',是正则表达式中的语法中最基本的一个,表示匹配任意单个字符的意思。所以,点'.',在正则表达式中,表示的是去匹配单个的任意的字符;
想要在正则表达式中,匹配字符点'.'本身,需要用到反斜杠,表示转义,写法为'\.';

除去正则表达式,其他时候,在写字符串本身的时候,字符点'.',就只是字符'.'点而已,所以不需要加上反斜杠。

更多详细解释,可以去参考:
【教程】详解Python正则表达式之: ‘.’ dot 点 匹配任意单个字符

(此处不能贴地址,请用google搜标题,即可找到帖子地址)
第2个回答  2012-11-21
第一个问题需要问你自己,你可以vim 你的这些文件的目录,看文件名中最后一个字符是什么。

第二个问题。
http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators

s/PATTERN/REPLACEMENT/msixpodualgcer

s///运算符中第二个/后面是要替换的内容,不进行正则运算,所以你可以不用转义