什么';在Perl中,打印多行字符串而不进行变量替换是一种简单的方法吗?

什么';在Perl中,打印多行字符串而不进行变量替换是一种简单的方法吗?,perl,Perl,我有一个Perl程序,它读入一组数据,对其进行剪切,然后输出几种不同的文件格式。我想让Perl成为其中一种格式(以.pm包的形式),并允许人们在自己的Perl脚本中使用隐藏的数据 打印数据很容易使用 我还想将一些助手函数打印到生成的包中 打印多行字符串而不进行变量替换的简单方法是什么 我希望能够做到: print <<EOL; sub xyz { my $var = shift; } EOL print将分隔符的名称括在单引号中,不会进行插值 print <

我有一个Perl程序,它读入一组数据,对其进行剪切,然后输出几种不同的文件格式。我想让Perl成为其中一种格式(以.pm包的形式),并允许人们在自己的Perl脚本中使用隐藏的数据

打印数据很容易使用

我还想将一些助手函数打印到生成的包中

打印多行字符串而不进行变量替换的简单方法是什么

我希望能够做到:

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

print将分隔符的名称括在单引号中,不会进行插值

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

print您可以使用像或这样的模板包

或者,您可以推出自己的基本模板系统,其外观如下:

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;
}
my $mail = "Hello!

Blah blah.";
my%vars=qw(foo 1 bar 2);
写入\u代码(\$vars);
子写入代码{
我的$vars=班次;

my$code=尝试将您的代码编写为实际的perl子例程,然后使用在运行时获取源代码。

使用数据节存储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";
}
!/usr/bin/perl
严格使用;
使用警告;
印刷品;
#打印蒙版数据
__资料__
包装材料;
严格使用;
使用警告;
sub-foo{
打印“foo\n”;
}

您实际上可以在下一行继续字符串文字,如下所示:

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;
}
my $mail = "Hello!

Blah blah.";

就我个人而言,我发现它比herdocs更具可读性(B::Deparse不能正确捕获闭包,而闭包比人们想象的更为常见。请使用Data::Dump::Streamer。@Schwern:B::Deparse对闭包做一件事(假设eval上下文正确),Data::Dump::Streamer做另一件事(假设除了转储代码之外,任何封闭变量都不被使用)。这两种情况都不能说是“不正确的”。如果您正在创建一个实际的Perl子例程,请不要对其进行字符串化。将其设置为库。这不是捕鼠器游戏:)我建议查看Data::Dump::Streamer,因为它比Data::Dumper更准确。建议使用模板模块。请不要滚动自己的:-)没关系,我想我不得不哭着睡在一堆奇怪的信誉点上