【问题标题】:Perl Script to Both Replace Extension Name and Trim White Space替换扩展名和修剪空白的 Perl 脚本
【发布时间】:2011-03-16 01:59:08
【问题描述】:

我是 perl 新手。

目前,我的任务是遍历文件夹中的所有 .htm 文件并做两件事:

  1. 将所有“.htm”扩展名替换为“.xml”
  2. 将文件名中的所有空格替换为下划线。

在我的 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”。

专家可以帮助我吗?并且还可以建议我哪里出错了?提前致谢!

【问题讨论】:

  • 首先,您的正则表达式.htm$ 将查找在字符串末尾有任何字符后跟htm 的模式,因为. 表示任何字符。如果你想要一个文字句点,你需要使用\.
  • s/.htm$//g 将删除.htm 而不是用.xml 替换它,并且由于您在行尾寻找单个实例,所以g 是可能不需要

标签: perl


【解决方案1】:

你确定就是这样吗

$docName =~ s/.htm$//g;

在做什么?

您需要转义 . 并添加替换字符串。你也不需要g,因为正确的锚保证它只能发生一次。

$docName =~ s/\.htm$/\.xml/;

除此之外,你应该没问题。

【讨论】:

  • 实际上,如果你有一个 .htm.htm.htm.htm.htm.htm.htm 的字符串,g 可能会将它们全部吞噬。
  • @Zeke:成功了。实际上我在 Perl:system("java -Xms256m -Xmx512m -jar $saxonJar -o $tmpFile $inFile $xslFile $saxonParams") 中做一个 XSLT。如果 $inFile 中有空格,那么语法是错误的,但通常我们可以通过在 $inFile 周围加上引号来解决这个问题,你知道在我上面的 Java 语句中如何实现吗?
  • @Zeke:不,/\.htm$/ 只会找到最后一个,因为它被锚定了。
  • @Robert - 你只需要在你的system() - Perl:system("java -Xms256m -Xmx512m -jar $saxonJar -o $tmpFile \"$inFile\" $xslFile $saxonParams") 中加上引号(注意你必须转义引号)
  • 我怀疑@Zeke 的推理是,在从字符串末尾删除最后一个.htm 之后,最后仍然会有一个.htm,所以一个也被删除了等。这不会发生的原因是,在执行替换后,正则表达式引擎不会回溯以查看替换是否创建了任何新匹配项。如果是这样,那么 s/a/aa/g 在任何时候针对包含字母 a 的字符串运行时都会导致无限循环。
【解决方案2】:

试试:

my @pub = grep { ! /Default/ } glob( '*.htm' );

for my $pub ( @pub ){
  $pub =~ s{ \. htm \z }{}msx;
  $pub =~ s{ \s+ }{_}gmsx;
  print "$pub\n";
}

见:

perldoc -f glob
perldoc -f grep
perldoc perlretut
perldoc perlre

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 2017-03-16
    • 1970-01-01
    • 2013-04-10
    相关资源
    最近更新 更多