Я хотел бы знать, что эквивалентный код, который Perl запускает при выполнении с опциями perl -pi -e
?Что именно делает perl -pi -e?
На некоторых SO вопрос я могу прочитать:
while (<>) {
... # your script goes here
} continue {
print;
}
Но этот пример не показывает ту часть, где будет сохранен файл.
Как Perl определяет EOL? Прикосновение к файлу, когда никаких изменений не произошло? Например, если у меня есть старый файл MAC (только \r
). Как это относится к s/^foo/bar/gm
?
Я пытался использовать отладчик Perl, но это действительно не помогает. Так что я просто пытаюсь угадать:
#!/usr/bin/env perl
my $pattern = shift;
map &process, @ARGV;
# perl -pi -e PATTERN <files>...
sub process {
next unless -f;
open my $fh, '<', $_;
my $extract;
read $fh, $extract, 1024;
seek &fh, 0, 0;
if ($extract =~ /\r\n/) {
$/ = "\r\n";
} elsif ($extract =~ /\r[^\n]/) {
$/ = "\r";
} else {
$/ = "\n";
}
my $out = '';
while(<&fh>) {
my $__ = $_;
eval $pattern;
my $changes = 1 if $_ ne $__;
$out .= $_;
}
if($changes)
{
open my $fh, '>', $_;
print $fh $out;
}
close &fh;
}
Очень интересный ответ. Я все еще немного смущен, потому что я не вижу каких-либо '' open' или печать $ Fh $ _' заявление в этом выводе. Как Perl открыть файл? '' для меня похож на 'my @ARGV = qw/foo.txt /; my $ bar = , где я получу ошибку. Я что-то упустил? –
nowox
@coin I/O Раздел операторов '[perlop] (http://perldoc.perl.org/perlop.html)' имеет часть, начинающуюся с «Нулевой дескриптор файла <> является специальным», который предлагает довольно хорошее объяснение. – Slade
Да, открытие и закрытие выходных файлов не отображается в выводе deparse. Оно обрабатывается магией редактирования inplace. Этот раздел для «-i» в perldoc perlrun объясняет это. 'Print $ _' можно увидеть в блоке continue. Нет $ fh, потому что магия редактирования inplace выбирает дескриптор выходного файла по умолчанию. Вы можете сделать что-то подобное с командой 'select'. '' это, как я понимаю, синониму для '<>'. –
BarneySchmale