【发布时间】:2011-12-29 01:24:50
【问题描述】:
我在我的代码中使用了一个名为debug 的子例程。它基本上可以让我看到发生了什么,等等。
sub debug {
my $message = shift;
my $messageLevel = shift;
our $debugLevel;
$messageLevel = 1 if not defined $messageLevel;
return if $messageLevel > $debugLevel;
my $printMessage = " " x $messageLevel . "DEBUG: $message\n";
print STDERR $printMessage;
return $printMessage;
}
我想制作这个原型,所以我可以这样做:
debug "Here I am! And the value of foo is $foo";
或
debug "I am in subroutine foo", 3;
同时,我喜欢将子例程定义放在程序的底部,这样您就不必费力 1/2 遍代码来找到程序的精髓。
我想这样做:
sub debug($;$); #Prototype debug subroutine
/Here goes the main program code/
sub debug { #The entire subroutine goes here
/Here goes the debug subroutine code/
}
但是,当我这样做时会收到警告:
Prototype mismatch: sub main::debug ($;$) vs none at foo.pl line 249.
所以,我坚持把原型定义放在两个地方。这样做的正确方法是什么?
回应
停下!模块时间。 ——克里斯·卢茨
一个模块?你的意思是创建一个单独的文件?这增加了一些复杂性,但没有解决我要解决的问题:消除对这个特定子例程周围括号的需求。
我们的 $debugLevel;无论如何不应该在子正文中,但我同意克里斯的观点。 – Sinan Ünür 3 小时前
our $debugLevel 在这种情况下不必存在,但是如果我定义了一个类并且我想在我的类中使用这个子例程进行调试,我需要它。我可以把它放在我的课堂上::debug
令人惊讶的是,Far more than everything you ever wanted to know about prototypes in Perl 没有解决这个问题,但我相信你不能避免在这两个地方编写原型。
我希望有一个简单的方法来避免它。 Eric Strom 展示了一种方法。不幸的是,它比我的debug 例程要长。
我曾经使用原型,但我养成了不为子例程编写单独声明并在所有调用中使用括号的习惯:debug("I am in subroutine foo", 3);。有人建议原型真的不是一个好主意。 TMTOWTDI – 基思汤普森 3 小时
除了我会倾向于这样做:
debug (qq(The value of Foo is "$foo"), 3);
阅读时可能不太清楚,而且打字会很痛苦。每当你把括号加倍时,你就是在自找麻烦。我要做的最后一件事是调试我的调试语句。
为什么需要原型?看到这个问题How to pass optional parameters to a Perl function – TLP
是的,原型设计存在很多问题。主要问题是它根本没有做人们认为它应该做的事情:为您传递给函数的参数声明变量类型。
这不是我在这里使用原型设计的原因。
我很少使用原型。事实上,这可能是我所有代码中唯一这样做的情况。
【问题讨论】:
-
our $debugLevel;无论如何都不应该出现在子正文中,但我同意 Chris 的观点。 -
令人惊讶的是,perlmonks.org/?node_id=861966 没有解决这个问题,但我相信你不能避免在这两个地方编写原型。
-
我曾经使用原型,但我养成了不为子例程编写单独声明并在所有调用中使用括号的习惯:
debug("I am in subroutine foo", 3);。有人建议原型真的不是一个好主意。 TMTOWTDI -
为什么需要原型?看到这个最近的问题stackoverflow.com/q/8124138/725418
-
在我的原始帖子末尾查看我的 RESPONSE。
标签: perl