ОК, сначала выключите - включите use strict;
и use warnings;
.В вашем коде есть пара синтаксических ошибок.
В частности, FH
- который вы открываете - и $FH
, который вы читаете - это НЕ одно и то же, и даже если бы они были, ..Вы не можете читать / писать из одного и того же файла одновременно (по крайней мере, не так).
Также - My
- это не то же самое, что my
, так что это тоже сломается.
Вы, вероятно, не объявляете подпрограмму таким образом - вы создаете прототипы, и это не означает, что вы думаете, что это означает, потому что прототипы perl не такие, как другие языки.
Чтобы сделать то, что вы хотите - например, заменить некоторые «заполнители» выглядит примерно так:
#!/usr/bin/env perl
use strict;
use warnings;
#define replacement patterns in a hash. (see 'perldoc hash')
my %replace = (
'$var1' => "a word here",
'$var2' => "another different word here",
);
#compile a regular expression that looks for the placeholders.
#note - we need "quotemeta" here because your search patterns include $
my $search = join "|", map { quotemeta } keys %replace;
$search = qr/($search)/;
print "Using regex for matching:",$search,"\n";
#iterate STDIN (or file specified on command line) line by line
while ( <> ) {
#apply pattern matches to current line
s/$search/$replace{$1}/g;
#print current line
print;
}
Мы используем <>
в приведенном выше, потому что это один из самых простых вариантов дляобработка файлов - это означает, что ваш скрипт работает как sed
/ awk
или grep
в том смысле, что вы можете указать имена файлов в командной строке или просто передать файлы к нему.
Однако, если вы хотите открыть-записать, вы можете:
open ( my $input, '<', 'filename_here' ) or die $!;
open ( my $output, '>', 'output_filename' ) or die $!;
select $output; #set output source for print location
while ( <$input> ) {
#apply pattern matches to current line
s/$search/$replace{$1}/g;
#print current line
print;
}
Это будет построчно читать ваш входной файл и записывать (преобразованный) вывод в новый файл.