Похоже, вы делаете что-то вроде @file =~ s/find/replace/;
.Вы получаете эту ошибку, потому что левая часть оператора привязки регулярного выражения налагает скалярный контекст на его аргумент.Массив в скалярном контексте возвращает свою длину, но это значение доступно только для чтения.Поэтому, когда ваша подстановка пытается выполнить замену, kaboom.
Чтобы обработать все строки файла, вы можете использовать цикл foreach
:
foreach my $line (@file) {$line =~ s/find/replace/}
или болеевкратце, как:
s/find/replace/ for @file;
Однако, если вы запускаете регулярные выражения в файле HTML, скорее всего, вам понадобится, чтобы они совпали по нескольким строкам.То, что вы делаете выше, - это чтение всего файла и сохранение каждой строки как элемента @file
.Если вы используете одну из итеративных структур управления Perl в массиве, вы не сможете сопоставить несколько строк.Поэтому вместо этого вы должны прочитать файл в единый скаляр.Затем вы можете использовать $file =~ s///
, как и ожидалось.
Файл можно сжать в одну переменную, временно очистив разделитель входной записи $/
:
my $file = do {local $/; <DATA>};
В общем случае регулярные выраженияэто неправильный инструмент для разбора HTML, но звучит так, будто это домашнее задание, поэтому в любом случае его просто попрактикуйте.
И, наконец, в современном Perl вы должны использовать форму с тремя аргументами open
с лексическим дескриптором файла и проверкой ошибок:
open my $DATA, '<', $ARGV[1] or die "open error: $!";
my $file = do {local $/; <$DATA>};