Скопировать файл в другой при замене переменных в Perl? - PullRequest
0 голосов
/ 04 июня 2018

У меня проблема. Я новичок в Perl и не могу найти ответ на свою проблему.

Мне нужно создать файл, скопировать содержимое другого файла в этот новый созданный файл.Но у скопированного файла есть некоторые переменные $var1 и $var2, которые я должен заменить содержимым (интерполировать) этих переменных в новом файле.

Я действительно не знаю, как создать,открыть файл, скопировать и интерполировать одновременно ...

Есть идеи?


Вот мой код:

sub my_function ($)
{
 My $var = shift ;
 open (FH, ‘>’, « file1 ») ; #this file is created because it doesn’t exist. 

 Copy($file_to_copy, $FH) ;
  while (my $line = <$FH>)
  {
    if ($line =~ /(Substituethis)/   
    {
      $line =~ s/$1/$var/g;
      print $FH $line;
    }
  }
  close $FH;
}

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Это решение отлично работает для меня:

use strict;
use warnings;

sub myfunction () 
{
  open ( my $input, '<', ‘file_name’ ) or die $!;
  open ( my $output, '>', ‘output_file_name’ ) or die $!; 

  my $var1 = "cup";
  my $var2 = "tea";

  my  %replace = (
   '$var1' => "round" ;
   '$var2' => "sweet",
  );

  my $search = join "|", map { quotemeta } keys %replace;
  $search = qr/($search)/;

  print "Using regex for matching:",$search,"\n";

  while ( <$input> )
  {
    s/$search/$replace{$1}/g; 
    print;
  }    
}
0 голосов
/ 04 июня 2018

ОК, сначала выключите - включите 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;
}   

Это будет построчно читать ваш входной файл и записывать (преобразованный) вывод в новый файл.

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