替换扩展名和修剪空白的Perl脚本

替换扩展名和修剪空白的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$

我是perl新手

目前,我的任务是循环遍历文件夹中的所有.htm文件,并执行两项操作:

  • 将所有“.htm”扩展名替换为“.xml”
  • 将文件名中的所有空格替换为下划线
  • 在我的perl脚本中,我加入了以下两行:

    @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