我有两个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;
谢谢。
答案 0 :(得分:5)
您需要模板系统
最受欢迎的一个是Template Toolkit
例如,使用此模板文件
This number is x=[% one %]/or less then two
his name is [% name %]
It is a [% animal %]/kind of animal.
这个Perl代码
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::Template或Template Toolkit,请执行此操作。
这是非常好的建议。你应该遵循它。