替换扩展名和修剪空白的Perl脚本
我是perl新手 目前,我的任务是循环遍历文件夹中的所有.htm文件,并执行两项操作:替换扩展名和修剪空白的Perl脚本,perl,Perl,我是perl新手 目前,我的任务是循环遍历文件夹中的所有.htm文件,并执行两项操作: 将所有“.htm”扩展名替换为“.xml” 将文件名中的所有空格替换为下划线 在我的perl脚本中,我加入了以下两行: @pub=`ls $sourceDir | grep '\.htm' | grep -v Default | head -550`; foreach (@pub) { my $docName = $_; chomp($docName); $docName =~ s/.htm$
@pub=`ls $sourceDir | grep '\.htm' | grep -v Default | head -550`;
foreach (@pub) {
my $docName = $_;
chomp($docName);
$docName =~ s/.htm$//g;
$docName =~ s/ /_/g;
....}
$docName是保存文件当前全名(包括扩展名)的变量。有趣的是,这两个$docName替换语句,在任何时候,只有上面的一个有效。例如,这里的示例代码将只替换扩展名,但不包含空格,但如果我注释掉第一个,则空格将完全变为下划线,但扩展名仍保留“.htm”
专家们能帮我吗?也能告诉我哪里出了问题?提前谢谢 你确定就这些吗
$docName =~ s/.htm$//g;
你在干什么
您需要转义
,并添加替换字符串。您也不需要g
,因为右锚点保证它只能发生一次
$docName =~ s/\.htm$/\.xml/;
除此之外,你应该没事。试试:
my @pub = grep { ! /Default/ } glob( '*.htm' );
for my $pub ( @pub ){
$pub =~ s{ \. htm \z }{}msx;
$pub =~ s{ \s+ }{_}gmsx;
print "$pub\n";
}
见:
首先,您的正则表达式
.htm$
将查找一个模式,该模式在字符串末尾后跟htm,因为
表示任何字符。如果您想要一个文字句点,您需要使用\.
,而s/.htm$//g
将删除.htm
,而不是将其替换为.xml
,并且由于您正在查找行末尾的单个实例,如果您有一个字符串是.htm.htm.htm.htm.htm.htm.htm.htm.htm
,g
可能会将它们全部吞掉。@Zeke:它起作用了。实际上,我正在用Perl:system(java-Xms256m-Xmx512m-jar$saxonJar-o$tmpFile$infle$xslFile$saxonParams)做一个XSLT。如果$infle中有空格,那么语法是错误的,但是通常我们可以通过在$infle周围加引号来解决这个问题,你知道如何在我上面的Java语句中实现吗?@Zeke:No,/\.htm$/
只会在锚定后找到最后一个。@Robert-你只需要在系统()中加引号就可以了
-Perl:system(“java-Xms256m-Xmx512m-jar$saxonJar-o$tmpFile\”$infle\“$xslFile$saxonParams”)
(请注意,您必须转义引号)我怀疑@Zeke的推理是,在从字符串末尾删除最后的.htm
之后,在末尾仍然会有一个.htm
,因此,一个也会被删除,等等。这不会发生的原因是,在执行替换之后,正则表达式引擎不会回溯以查看替换是否创建了任何新的匹配项。如果是这样的话,s/a/aa/g
将在对包含字母a
的字符串运行时导致无限循环。
perldoc -f glob
perldoc -f grep
perldoc perlretut
perldoc perlre