如何在perl中另一个文件中存在的文件中替换变量的实际值

时间:2016-10-28 09:45:16

标签: perl

我有两个file.Variables在第一个文件中声明($ one = 1;),在第二个文件变量名中给出($ one)。我想用实际值替换此变量名称并打印输出 File1.txt

 variables are gieven here
    $one=1;
    $name="gorge";
    $animal="cat";

File2.txt

This number is x=$one/or less then two  
his name is $name  
It is a $animal/ kind of animal. 

预期输出

This number is x=1/or less then two  
    his name is gorge  
    It is a cat/ kind of animal. 

我尝试使用此代码:

open (data1,"</home/file1");
open (data2,"</home/file2");
while (<data1>){
     while (<data2>){
       print $_;
  }
}
close data2;
close data1;  

谢谢。

3 个答案:

答案 0 :(得分:5)

您需要模板系统

最受欢迎的一个是Template Toolkit

例如,使用此模板文件

File2.template

This number is x=[% one %]/or less then two  
his name is [% name %]  
It is a [% animal %]/kind of animal.

这个Perl代码

main.pl

use strict;
use warnings 'all';

use Template;

my $tt = Template->new;

my $vars = {
    one    => 1,
    name   => 'gorge',
    animal => 'cat',
};


$tt->process('File2.template', $vars);

结果就是这个

输出

This number is x=1/or less then two  
his name is gorge  
It is a cat/kind of animal.

答案 1 :(得分:1)

我认为你正在寻找horribly bad idea的东西。

因此,我建议采用不同的方法,构建正则表达式来替换文本。虽然这样做 - $one的使用会有点混乱,因为这意味着perl中的标量变量,这就是&#34;只是&#34;将成为模式匹配。

所以,如果你能改变它 - 你应该:

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

my %replace = ( 'one' => '1',
                'name' => 'gorge',
                'animal' => 'cat' ); 

my $search = join ( '|', keys %replace ); 
   $search = qr/\$($search)/;

print Dumper \%replace;
print $search;

while ( <DATA> ) {
    s/$search/$replace{$1}/g;
    print;
}

__DATA__
This number is x=$one/or less then two  
his name is $name  
It is a $animal/ kind of animal. 

您可以构建类似这样的replace模式:

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

my %replace = map { m/\$(\w+)=\"?([^;\"]+)/ } <DATA>;

print Dumper \%replace;

__DATA__
    $one=1;
    $name="gorge";
    $animal="cat";

这会给你:

$VAR1 = {
          'name' => 'gorge',
          'one' => '1',
          'animal' => 'cat'
        };

答案 2 :(得分:1)

如果您将成为任何类型的Perl程序员,那么您需要阅读Perl FAQ

在那里,你会找到你问题的答案。

如果您阅读了该答案,那么您最终会得到与what Sobrique gave you非常相似的代码。但是,为了获得该代码,您需要首先通过答案中的第一段说明:

  

如果您可以避免,或者如果您可以使用模板系统,例如Text::TemplateTemplate Toolkit,请执行此操作。

这是非常好的建议。你应该遵循它。