在Perl中打印多行字符串而不使用变量替换的简单方法是什么?

时间:2009-06-01 22:55:13

标签: perl

我有一个Perl程序,它读入一堆数据,然后输出,然后输出几种不同的文件格式。我想让Perl成为这些格式之一(以.pm包的形式),并允许人们在他们自己的Perl脚本中使用munged数据。

使用Data::Dump::pp可以轻松打印出数据。

我还想在生成的包中打印一些辅助函数。

在没有 变量替换的情况下打印多行字符串 的简单方法是什么?

我希望能够做到:

print <<EOL;
  sub xyz { 
    my $var = shift;
  }
EOL

但是我必须逃脱所有的$。

有一种简单的方法吗?也许我可以创建一个实际的子和一些神奇的漂亮打印机打印内容?打印的代码不必与输入匹配,甚至不清晰。

5 个答案:

答案 0 :(得分:41)

用单引号括住分隔符的名称,不会进行插值。

print <<'EOL';
  sub xyz { 
    my $var = shift;
  }
EOL

答案 1 :(得分:4)

您可以使用Template::ToolkitText::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在运行时获取源代码。