我有一个Perl程序,它读入一堆数据,然后输出,然后输出几种不同的文件格式。我想让Perl成为这些格式之一(以.pm包的形式),并允许人们在他们自己的Perl脚本中使用munged数据。
使用Data::Dump::pp可以轻松打印出数据。
我还想在生成的包中打印一些辅助函数。
在没有 变量替换的情况下打印多行字符串 的简单方法是什么?
我希望能够做到:
print <<EOL;
sub xyz {
my $var = shift;
}
EOL
但是我必须逃脱所有的$。
有一种简单的方法吗?也许我可以创建一个实际的子和一些神奇的漂亮打印机打印内容?打印的代码不必与输入匹配,甚至不清晰。
答案 0 :(得分:41)
用单引号括住分隔符的名称,不会进行插值。
print <<'EOL';
sub xyz {
my $var = shift;
}
EOL
答案 1 :(得分:4)
您可以使用Template::Toolkit或Text::Template等模板包。
或者,你可以推出自己的原始模板系统,如下所示:
my %vars = qw( foo 1 bar 2 );
Write_Code(\$vars);
sub Write_Code {
my $vars = shift;
my $code = <<'END';
sub baz {
my $foo = <%foo%>;
my $bar = <%bar%>;
return $foo + $bar;
}
END
while ( my ($key, $value) = each %$vars ) {
$code =~ s/<%$key%>/$value/g;
}
return $code;
}
这看起来很简单,但如果你DIY,有各种各样的陷阱和技巧等着你。您是否注意到我没有在替换中使用我的关键名称中的quotemeta?
我建议您使用经过时间考验的模板库,就像我上面提到的那样。
答案 2 :(得分:3)
您实际上可以在下一行继续使用字符串文字,如下所示:
my $mail = "Hello!
Blah blah.";
就我个人而言,我发现它比heredocs(其他地方提到的<<<EOL
更具可读性)。
双引号“插入变量,但你可以使用'。注意你需要在你的字符串中转义任何'才能使它工作。
实际上,Perl实际上非常丰富,可以使事物更具可读性,例如:其他报价操作。 qq和q对应于“和”,你可以使用任何有意义的分隔符:my $greeting = qq/Hello there $name!
Nice to meet you/; # Interpolation
my $url = q|http://perlmonks.org/|; # No need to escape /
(注意这里的语法着色并没有完全跟上)
阅读perldoc perlop
(在页面中找到“引用和引用类似的运算符”)以获取更多信息。
答案 3 :(得分:2)
使用数据部分存储Perl代码:
#!/usr/bin/perl
use strict;
use warnings;
print <DATA>;
#print munged data
__DATA__
package MungedData;
use strict;
use warnings;
sub foo {
print "foo\n";
}
答案 4 :(得分:1)
尝试将代码编写为实际的perl子例程,然后使用B::Deparse在运行时获取源代码。