首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl编写宏的正确方法

Perl编写宏的正确方法
EN

Stack Overflow用户
提问于 2014-12-17 08:26:55
回答 2查看 234关注 0票数 3

为了简化我的程序,我想写一些宏,我可以在不同的子程序中使用。

以下是我写的:

代码语言:javascript
复制
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;
}

有更好的方法还是更聪明的方法来做我想做的事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-17 11:23:28

如果发现这种方法很有用,则可以使用闭包或闭包散列,

代码语言:javascript
复制
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();
票数 3
EN

Stack Overflow用户

发布于 2014-12-17 11:45:26

如果我已经理解了您想要做的事情,那么我想的就是开始研究面向对象的perl。

对象是构建复杂数据结构的方式,而“在代码中构建”则是对数据结构“做事情”的方式。

因此,您需要创建一个对象(perl模块):

代码语言:javascript
复制
#!/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;

然后用:

代码语言:javascript
复制
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进行更高级的操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27521152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档