Какой простой способ напечатать многострочную строку без подстановки переменных в Perl? - PullRequest
4 голосов
/ 02 июня 2009

У меня есть программа на Perl, которая читает кучу данных, обрабатывает их, а затем выводит несколько различных форматов файлов. Я хотел бы сделать Perl одним из таких форматов (в форме пакета .pm) и позволить людям использовать ложные данные в своих собственных скриптах Perl.

Распечатать данные легко, используя Data :: Dump :: pp .

Я также хотел бы напечатать некоторые вспомогательные функции в полученный пакет.

Какой простой способ печати многострочной строки без подстановки переменных?

Я бы хотел иметь возможность:

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

Но тогда мне пришлось бы сбежать от всех долларов.

Есть ли простой способ сделать это? Возможно, я смогу создать настоящий сабвуфер и распечатать содержимое какого-нибудь волшебного принтера? Напечатанный код не должен соответствовать вводу или даже быть разборчивым.

Ответы [ 5 ]

41 голосов
/ 02 июня 2009

Заключите имя разделителя в одинарные кавычки, и интерполяция не произойдет.

print <<'EOL';
  sub xyz { 
    my $var = shift;
  }
EOL
4 голосов
/ 02 июня 2009

Вы можете использовать шаблонный пакет, например 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;
}

Это выглядит красиво и просто, но есть множество ловушек и трюков, которые ждут вас, если вы сделаете сам. Вы заметили, что я не смог использовать quotemeta в именах своих ключей в замене?

Я рекомендую вам использовать проверенную временем библиотеку шаблонов, такую ​​как я упомянул выше.

3 голосов
/ 02 июня 2009

Вы можете продолжить строковый литерал на следующей строке, например:

my $mail = "Hello!

Blah blah.";

Лично я нахожу это более читабельным, чем heredocs (вещь, упомянутая в другом месте * 1004).

Двойная кавычка "интерполирует переменные, но вы можете использовать '. Обратите внимание, вам нужно экранировать любые' в вашей строке, чтобы это работало.

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 (см. На странице: "Операторы цитирования и операторы, подобные котировкам").

2 голосов
/ 02 июня 2009

Используйте раздел данных для хранения кода 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";
}
1 голос
/ 02 июня 2009

Попробуйте написать свой код как фактическую подпрограмму perl, затем используйте B :: Deparse , чтобы получить исходный код во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...