Perl子例程原型-正确的方法 [英] Perl Subroutine Prototyping -- The correct way to do it

查看:73
本文介绍了Perl子例程原型-正确的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个名为debug的子例程,我在代码中使用了该子例程.它基本上可以让我看到发生了什么,等等.

I have a subroutine called debug I use in my code. It basically allows me to see what's going on, etc.

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;
}

我想对此建模,所以我可以做这样的事情:

I want to prototype this, so I can do things like this:

debug "Here I am! And the value of foo is $foo";

debug "I am in subroutine foo", 3;

同时,我喜欢将子例程定义放在程序的底部,因此您不必费心在代码中进行1/2遍查找程序的实质.

At the same time, I like putting subroutine definitions at the bottom of my program, so you don't have to wade 1/2 way through the code to find the meat of the program.

我想这样做:

sub debug($;$);  #Prototype debug subroutine

/Here goes the main program code/

sub debug {      #The entire subroutine goes here
   /Here goes the debug subroutine code/
}

但是,当我这样做时会收到警告:

However, I get a warning when I do this:

Prototype mismatch: sub main::debug ($;$) vs none at foo.pl line 249.

因此,我将原型定义放在两个地方.做这样的事情的正确方法是什么?

So, I'm stuck putting the prototype definition in both places. What is the correct way to do something like this?

停止!模块时间. –克里斯·卢茨(Chris Lutz)

Stop! Module time. – Chris Lutz

一个模块?您是说要创建一个单独的文件?这就增加了一些复杂性,却没有解决我要解决的问题:消除了在此特定子例程周围使用括号的需要.

A module? You mean create a separate file? That adds a bit of complication without solving the issue I'm trying to solve: Removing the need for parentheses around this particular subroutine.

我们的$ debugLevel;无论如何都不应该在subbody中,但是我同意Chris的观点. – 3小时前的SinanÜnür

our $debugLevel; should not be in the sub body anyway, but I agree with Chris on this. – Sinan Ünür 3 hours ago

在这种情况下,our $debugLevel不必在那里,但是如果我定义了一个类,并且想在我的类中使用此子例程进行调试,则需要它.我可以将其作为::debug

The our $debugLevel does not have to be there in this case, but if I defined a class and I want to use this subroutine in my class for debugging, I need it. I can put it in my class as ::debug

令人惊讶的是,远远超出了您想了解的有关Perl中原型的所有内容解决这个问题,但是我相信您不能避免在两个地方都编写原型.

Surprisingly, Far more than everything you ever wanted to know about prototypes in Perl doesn't address this, but I believe you cannot avoid writing the prototype in both places.

我一直希望有一种简单的方法来避免这种情况.正如埃里克·斯特罗姆(Eric Strom)展示的那样.不幸的是,它比我的debug例程长.

I was hoping for an easy way to avoid it. There is a way as Eric Strom showed. Unfortunately, it's longer than my debug routine.

我曾经使用原型,但是我养成了不为子例程编写单独的声明并在所有调用上使用括号的习惯:debug(我在子例程foo",3);.有人建议原型真的不是一个好主意. TMTOWTDI –基思·汤普森(Keith Thompson)3小时

I used to use prototypes, but I've developed the habit of not writing separate declarations for subroutines and using parentheses on all calls: debug("I am in subroutine foo", 3);. It's been suggested that prototypes really aren't a good idea. TMTOWTDI – Keith Thompson 3 hours

除了我倾向于:

debug (qq(The value of Foo is "$foo"), 3);

在阅读时可能不太清楚,并且可能会造成打字的痛苦.每当您加倍括号时,您就在自找麻烦.我想做的最后一件事是调试我的调试语句.

which can be less clear when reading, and can be a pain to type. Whenever you double up parenthese, you're asking for trouble. The last thing I want to do is debug my debug statements.

您为什么要原型?参见以下问题如何将可选参数传递给Perl函数 – TLP

是的,原型存在很多问题.主要的问题是它根本不执行人们认为应该做的事情:声明要传递给函数的参数的变量类型.

Yes, there are lots of problems with prototyping. The main problem is that it simply doesn't do what people think it should do: Declare the variable types for the parameters you're passing to your function.

这不是我在此处使用原型制作的原因.

This is not the reason I'm using prototyping here.

我很少使用原型.实际上,这可能是我所有代码中唯一的情况.

I rarely use prototypes. In fact, this is probably the only case in all of my code where I do.

推荐答案

完全摆脱原型:

sub debug;

debug "Here I am! And the value of foo is $foo";
debug "I am in subroutine foo", 3;

sub debug {
    # body of debug
}

这篇关于Perl子例程原型-正确的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆