Как мне ссылаться на переменную в скрипте подстановки Perl? - PullRequest
0 голосов
/ 03 октября 2011

Я пишу Perl-скрипт для изменения всех URL-адресов в нескольких файлах в одном каталоге с регистра верблюда на строчные.

например, с

   <a href="FooBar.html">

на

   <a href="foobar.html"> 

Эта тестовая подстановка корректно переименовывает все URL-адреса в foobartest.html, как и ожидалось:

   s/^<a href=\"(.*?)\"/<a href=\"foobartest.html\"/g

Но у меня возникают трудности при ссылке на фактическое имя файла через переменную $ 1.Пример того, что я пытаюсь:

   s/^<a href=\"(.*?)\"/<a href=\"\L$1\"/g

Эта замена просто меняет ссылку на.Что мне не хватает?Вы, вероятно, можете сказать, что я довольно новичок в Perl, и поэтому любые рекомендации будут высоко оценены.


Полный сценарий для чтения файлов в каталоге и его замены (запись в виде одной строки неработать либо, несмотря на другие замены, работающие через одну строку):

#!/usr/bin/perl

use strict;
use warnings;

    chdir("/var/www/html/twiki_html") or die "$!";
    opendir (DIR, ".") or die "$!";
    my @files = grep {/.*?\.html/} readdir DIR;
    close DIR;
        {
        local @ARGV = @files;
        while(<>){
            s/^<a href=\""(.*?)\"/<a href=\"\L$1\"/g;
            }
        }

Ответы [ 2 ]

1 голос
/ 03 октября 2011

Простой однострочник:

perl -pwe 's/(?<=<a href=")([^"]+)(?=")/\L$1/' *.html

Это ничего не изменит, просто отобразит изменения. Таким образом, когда вы будете удовлетворены, вы можете добавить -i к параметрам, чтобы внести изменения в файлы. Имейте в виду, что изменения необратимы. Используйте -i.bak для хранения резервных копий. E.g.:

perl -i.bak -pwe 's/(?<=<a href=")([^"]+)(?=")/\L$1/' *.html
0 голосов
/ 03 октября 2011

Ваш код работает на меня. Поэтому я думаю, что любые проблемы должны быть в коде, который вы нам не показываете.

#!/usr/bin/env perl

use strict;
use warnings;

use 5.010;

$_ = '<a href="FooBar.html">';

s/^<a href=\"(.*?)\"/<a href=\"\L$1\"/g;

say;

Бег, который дает:

$ ./html_test
<a href="foobar.html">
...