为了简化我的程序,我想写一些宏,我可以在不同的子程序中使用。
以下是我写的:
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;
}有更好的方法还是更聪明的方法来做我想做的事?
发布于 2014-12-17 11:23:28
如果发现这种方法很有用,则可以使用闭包或闭包散列,
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();发布于 2014-12-17 11:45:26
如果我已经理解了您想要做的事情,那么我想的就是开始研究面向对象的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;这是非常基本的OOP,但是您可以使用Moose进行更高级的操作。
https://stackoverflow.com/questions/27521152
复制相似问题