Как использовать переменную в регулярном выражении / замене Perl? - PullRequest
1 голос
/ 07 июня 2019

Обычно я пытаюсь вставить строку в текстовый файл и порождаю системную команду для выполнения "perl -pi.orig -e"

Вот что я пытаюсь сделать:

my $find='# Foo Bar'
my $replace="foo/bar/blah.txt\n# Foo'

my $file = './some_text_file.txt'

system("perl -pi.orig -e 's|$find|$replace|;' $file");

Это работает без использования переменных.

$ file содержит следующий текст:

# Foo Bar is a comment
then/a/path/to/a/file.txt

Ответы [ 3 ]

5 голосов
/ 07 июня 2019

Не вызывайте Perl из Perl, выполняйте работу непосредственно в одном процессе.

#! /usr/bin/perl
use warnings;
use strict;

my $find    = qr/# Foo/;
my $replace = "foo/bar/blah.txt\n# Foo";
my $file    = './some_text_file.txt';

open my $in, '<', $file or die $!;
open my $out, '>', "$file.new" or die $!;

while (<$in>) {
    s/$find/$replace/;
    print {$out} $_;
}
close $out;
rename "$file.new", $file or die "Can't rename";

Или, если вам нужно сохранить резервную копию,

rename $file, "$file.backup" or warn "Can't create backup";
rename "$file.new", $file or die "Can't rename";
1 голос
/ 07 июня 2019

Если у вас есть однострочный текст, который вы хотите использовать в программе, используйте Deparse , чтобы увидеть, что вам нужно сделать:

$ perl -MO=Deparse -pi.orig -e 's|$find|$replace|;' file
BEGIN { $^I = ".orig"; }
LINE: while (defined($_ = readline ARGV)) {
    s/$find/$replace/;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

Оттуда вы можете увидетьчто тебе необходимо сделать.

ответ Чоробы делает то же самое без специальной переменной $^I, которая обрабатывает файл.

0 голосов
/ 07 июня 2019

Мы также можем использовать простое регулярное выражение и заменить его на что угодно:

Демо

Тест

use strict;

my $str = 'foo/bar/blah.txt\\n# Foo';
my $regex = qr/#\sFoo/mp;
my $subst = 'With Anything You wish To Replace';

my $result = $str =~ s/$regex/$subst/rg;

print $result\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...