2009-06-01 7 views
5

Mam program Perl, który czyta w zbiorze danych, munges go, a następnie wyprowadza kilka różnych formatów plików. Chciałbym, aby Perl był jednym z tych formatów (w postaci pakietu .pm) i pozwalał ludziom używać zmasakrowanych danych w ich własnych skryptach Perla.Jaki jest łatwy sposób drukowania ciągu wielowierszowego bez podstawiania zmiennych w języku Perl?

Drukowanie danych jest łatwe przy użyciu .

Chciałbym również wydrukować niektóre funkcje pomocnicze do wynikowego pakietu.

Jaki jest łatwy sposób wydrukowania ciągu wieloliniowego bez podstawienie zmiennych?

Chciałbym móc zrobić:

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

Ale wtedy musiałbym uciec wszystkie z $ 's.

Czy istnieje prosty sposób na zrobienie tego? Być może mogę stworzyć rzeczywistą subadę i mieć magiczną, ładną drukarkę, która wydrukuje zawartość? Wydrukowany kod nie musi pasować do danych wejściowych, a nawet być czytelny.

+0

Polecam, patrząc na Data :: Dump :: Streamer, jako bardziej dokładny niż Data :: Dumper. – Schwern

Odpowiedz

1

Spróbuj wpisać kod jako rzeczywisty podprogram perl, a następnie użyj B::Deparse, aby uzyskać kod źródłowy w czasie wykonywania.

+3

B :: Deparse nie będzie właściwie przechwytywał zamknięć, które są częstsze niż mogłoby się wydawać. Użyj danych :: Dump :: Streamer. – Schwern

+0

@Schwern: B :: Deparse robi jedną rzecz z zamknięciami (zakładając, że kontekst eval jest poprawny), Data :: Dump :: Streamer robi inny (zakładamy, że zmienne typu "closed over" nie są używane przez nic poza zrzuconym kodem). Nie można powiedzieć, że jest "niewłaściwy". – ysth

+1

Jeśli tworzysz rzeczywisty podprogram Perla, nie należy go wcale. Zrób z tego bibliotekę. To nie jest gra w Mousetrap :) –

40

Powoduje umieszczenie nazwy separatora w pojedynczych cudzysłowach, a interpolacja nie zostanie wprowadzona.

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

Brak" akceptowalnej "miłości dla właściwej odpowiedzi.: ( –

+2

To jest ok. Myślę, że będę musiał się rozpłakać, żeby spać na dziwacznie dużym stosie punktów reputacji –

4

Można użyć pakietu szablonów jak Template::Toolkit lub Text::Template.

Albo, można toczyć własną prymitywny system szablonów, który wygląda mniej więcej tak:

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; 
} 

To wygląda ładne i proste, ale istnieje wiele pułapek i sztuczek czeka na ciebie, jeśli DIY. Czy zauważyłeś, że nie udało mi się użyć quotemeta na moich kluczowych nazwiskach w podmenu?

Polecam korzystanie z przetestowanej biblioteki szablonów, takiej jak te wymienione powyżej.

+1

+1 za polecenie użycia modułu szablonu. Proszę nie toczyć własnego :-) –

2

Użyj sekcję danych do przechowywania kodu 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"; 
} 
2

Rzeczywiście można kontynuować ciąg dosłowny w następnej linii, na przykład:

my $mail = "Hello! 

Blah blah."; 

Osobiście uważam, że bardziej czytelne niż heredocs (<<<EOL rzecz, o której mowa w innym miejscu).

Pokój cytat "interpoluje zmienne, ale można użyć« Zauważ, trzeba uciec każdy»w ciąg to zadziałało.

Perl jest całkiem bogaty w wygodnych rzeczy, aby rzeczy bardziej czytelny , np. inne operacje wyceny.qq i q odpowiada „i" i można go używać niezależnie od separatora sens:

my $greeting = qq/Hello there $name! 
Nice to meet you/; # Interpolation 

my $url = q|http://perlmonks.org/|;  # No need to escape/

(Zauważ, że kolorowanie składni tutaj nie całkiem nadążyć)

Czytaj perldoc perlop (Znajdź na stronie:” Quote and Quote-like Operators "), aby uzyskać więcej informacji:

Powiązane problemy