如何在Perl中使用宏?

mur*_*uga 3 perl

我如何在Perl中使用宏,就像我在C中一样?

例:

#define value 100 
print value; 
Run Code Online (Sandbox Code Playgroud)

我希望输出为100.

Gav*_*ock 31

如果你只想定义常量(比如你的例子)而不是完整的宏,那么有几种perl方法可以做到这一点.

有些人喜欢:

use constant value => 100;
print value;
Run Code Online (Sandbox Code Playgroud)

请注意,'value'是子程序,而不是'变量'.这意味着你不能在字符串中插入它,所以你必须这样做.print "The value is ".value."\n";.

" 最佳实践 "人群如下:

use Readonly;
Readonly my $value => 100;
print $value;
Run Code Online (Sandbox Code Playgroud)

但是,与常量不同,Readonly不是核心perl发行版的一部分,因此需要从CPAN安装.

  • Duncan:如果someconst为false,那么如果(someconst){...}在编译期间完全消失,则常量会被优化掉.对于Readonly变量,情况并非如此.此外,如果您坚持使用Readonly,请始终安装Readonly :: XS! (4认同)
  • @rjh:我不同意Readonly文档中的大多数批评.此外,编译时行为意味着您还要保存代码的OP结构的内存.关于if(0):你错了:使用Readonly(至少是纯perl版本),你实际上每次访问至少支付一个子程序调用.这是*很多*因为子程序调用非常慢.如果您考虑使用''Readonly my $ DEBUG'',并将其用于调试输出,那么您需要在运行时付出高昂的代价. (2认同)
  • 常量不是_很难插入字符串.你可能有点讨厌,但并不困难. (2认同)

Dav*_*man 14

Perl不是C.通过学习相应的Perl习语(比如已经提到的use constant value => 100)而不是试图将C语言拖入Perl,你会得到更好的服务.


Eri*_*rom 10

对于常量,常见的方法是使用一个由编译器内联的常量子例程:

use constant value => 100;
Run Code Online (Sandbox Code Playgroud)

要么

sub value () {100}
Run Code Online (Sandbox Code Playgroud)