Как обновить путь в скрипте Perl в нескольких файлах - PullRequest
0 голосов
/ 17 января 2020

Я работаю над созданием учебного материала, в котором я использую 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% будет расширяться в строку с обратными слешами, которые должны быть преобразованы в прямые, и должны быть экранированным в регулярном выражении.

Как мне это исправить?

1 Ответ

3 голосов
/ 17 января 2020

Прежде всего, Windows не использует строку Шебанга, поэтому я не уверен, зачем вы вообще делаете эту работу.

Perl прочтет линии shebang и ищите опции, если в пути найден perl, даже на Windows, но это означает, что #!perl достаточно, если вы хотите передать опции через линию shebang (например, #!perl -n).

Теперь, возможно, вы используете Cygwin, MSYS или какую-либо другую unix эмуляцию вместо Windows для запуска программы, но вы помещаете путь Windows в строку shebang (C:...), а не чем путь unix, так что это тоже не имеет смысла.

Есть три дополнительных проблемы с попыткой:

  1. cmd использует двойные кавычки для цитирования.
  2. cmd не выполняет расширение по шаблону, как sh, поэтому ваша программа должна это сделать.
  3. Вы пытаетесь сгенерировать Perl код из cmd. ой.

Если мы go впереди, мы получим:

"%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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...