2014-12-17 2 views
3

Чтобы упростить мою программу, я хотел бы написать некоторые макросы, которые я могу использовать в разных подпрограммах.Perl правильный путь для написания макросов

Вот что я написал:

my @m =(); 
sub winit { @m =(); } 
sub w  { push @m, shift; } 
sub wline { push @m, ''; } 
sub wheader { push @m, commentHeader(shift); } 
sub walign { push @m, alignMakeRule(shift); } 
sub wflush { join($/, @m); } 

sub process { 
    winit; 

    w "some text"; 
    wline; 

    wheader 'Architecture'; 
    w getArchitecture(); 
    wline; 

    say wflush; 
} 

Есть ли лучший способ или более разумный способ сделать то, что я хочу сделать?

+0

Что вы имеете в виду под «macro» – Jens

ответ

3

Вы можете использовать замыкание, или хэш закрытия, если вы найдете такой подход полезен,

use strict; 
use warnings; 
use feature 'say'; 

sub winit { 
    my @m; 
    return (
    w  => sub { push @m, shift; }, 
    wline => sub { push @m, ''; }, 
    wheader => sub { push @m, "commentHeader ". shift; }, 
    walign => sub { push @m, "alignMakeRule ". shift; }, 
    wflush => sub { join($/, @m); }, 
); 
} 

sub process { 
    my %w = winit(); 

    $w{w}->("some text"); 
    $w{wline}->(); 

    $w{wheader}->('Architecture'); 
    $w{w}->("getArchitecture()"); 
    $w{wline}->(); 

    say $w{wflush}->(); 
} 

process(); 
+0

Для трех меньших строк вы можете создать класс. Почему бы не сделать это вместо этого? Затем '$ w {wline} ->();' становится '$ w-> wline();' – ikegami

+0

@ikegami Sobrique уже сделал это? –

1

Если я понял, что вы пытаетесь сделать, что я буду думать, чтобы начать поиск в объектно-ориентированном perl.

Объекты - это способ построения сложных структур данных и «построения внутри» кода, чтобы «делать вещи» в структуре данных.

Таким образом, вы бы создать объект (Perl модуль):

#!/usr/bin/perl 
use strict; 
use warnings; 

package MyMacro; 

sub new { 
    my ($class) = @_; 
    my $self = {}; 
    $self->{m} =(); 
    bless($self, $class); 
} 

sub flush { 
    my ($self) = @_; 
    return join($/, @{ $self->{m} }); 
} 

sub addline { 
    my ($self) = @_; 
    push(@{$self -> {m}}, ''); 
} 

sub addtext { 
    my ($self, $text) = @_; 
    push (@{$self -> {m}}, $text); 
} 

#etc. for your other functions 

1; 

И затем 'диск' это с:

use strict; 
use warnings; 
use MyMacro; 

my $w = MyMacro->new(); 

$w->addtext("some text"); 
$w->addline(); 
$w->addtext("some text"); 

print $w ->flush; 

Это довольно простой ООП, но вы можете сделать более продвинутый с Moose.

Смежные вопросы