【问题标题】:How to update path in Perl script in multiple files如何在多个文件中更新 Perl 脚本中的路径
【发布时间】:2020-01-18 08:47:06
【问题描述】:

我正在创建一些我使用 perl 的培训材料。我想做的一件事是为学生正确设置脚本,无论他们在哪里添加压缩文件。我正在处理一个 Windows 批处理文件,它将 perl 模板复制到工作位置,然后将 perl 模板文件副本中的路径更新到正确的位置。 perl 模板的第一行是:

#!_BASE_software/perl/bin/perl.exe

批处理文件如下所示:

SET TRAINING=%~dp0
copy %TRAINING%\template\*.pl %TRAINING%work
%TRAINING%software\perl\bin\perl -pi.bak -e 's/_BASE_/%TRAINING%/g' %TRAINING%work\*.pl

我有几个问题:

  1. Perl 似乎不喜欢文件名中的通配符
  2. 事实证明,%TRAINING% 将扩展为带有反斜杠的字符串,需要将其转换为正斜杠,并且需要在正则表达式中进行转义。

我该如何解决这个问题?

【问题讨论】:

  • 您的代码严重缺少双引号。您可以使用%TRAINING:\=/% 自动将反斜杠替换为正斜杠。请记住,%~dp0 已经包含一个尾部反斜杠,在你有的地方和其他你没有的地方。
  • s/// 的第二部分不是正则表达式,而是带引号的字符串。也就是说,如果它扩展到带有正斜杠的东西,它仍然是一个问题(语法错误)。在环境中设置它可能更简单,然后使用 Perl 中的$ENV{TRAINING}
  • 也许 ExtUtils::Command 会有所帮助。流行的 UNIX 实用程序的 Perl'ish 实现
  • 看看help for,尤其是`/f'选项。

标签: regex perl batch-file


【解决方案1】:

首先,Windows 不使用 shebang 行,所以我不知道你为什么首先要做这些工作。

如果在路径中找到perl,Perl 将读取shebang 行并查找选项,即使在Windows 上也是如此,但这意味着如果您想通过shebang 行传递选项,#!perl 就足够了(例如@987654323 @)。

现在,您可能使用 Cygwin、MSYS 或其他一些 unix 仿真而不是 Windows 来运行程序,但是您在 shebang 行 (C:...) 中放置了 Windows 路径而不是 unix 路径,这样也没有意义。

这次尝试还有另外三个问题:

  1. cmd 使用双引号进行引用。
  2. cmd 不会像 sh 那样执行通配符扩展,所以这取决于你的程序。
  3. 您正试图从cmd 生成 Perl 代码。哎哟。

如果我们继续,我们会得到:

"%TRAINING%software\perl\bin\perl" -MFile::DosGlob=glob -pe"BEGIN { @ARGV = map glob, @ARGV; $base = $ENV{TRAINING} =~ s{\\}{/}rg } s/_BASE_/$base/g" -i.bak -- %TRAINING%work\*.pl

如果我们为可读性添加换行符,我们会得到以下内容(cmd 不会接受):

"%TRAINING%software\perl\bin\perl"
   -MFile::DosGlob=glob
   -pe"
      BEGIN {
         @ARGV = map glob, @ARGV;
         $base = $ENV{TRAINING} =~ s{\\}{/}rg
      }
      s/_BASE_/$base/g
   "
   -i.bak -- %TRAINING%work\*.pl

【讨论】:

  • 好答案!但有一件事,为了路径中可能的空白,我会双引号路径。 "%TRAINING%software\perl\bin\perl"
  • @Gerhard Barnard,即使使用您推荐的引号,它也不能使用空格,因为在 shebang 行的路径中不能有空格。可能有特定于系统的方法来解决这个问题,但我不熟悉它们。但我确实添加了引号,谢谢。
  • 我喜欢这样一个简单的事实,我不必担心 Windows 中的路径,鉴于此,我将放弃这整件事。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2018-08-03
  • 2015-10-15
  • 1970-01-01
  • 2019-02-02
相关资源
最近更新 更多