gpt4 book ai didi

Perl 子程序原型(prototype)——正确的方法

转载 作者:行者123 更新时间:2023-12-04 08:58:02 24 4
gpt4 key购买 nike

我有一个名为 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;
}

我想对此进行原型(prototype)制作,所以我可以做这样的事情:
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.

所以,我坚持把原型(prototype)定义放在两个地方。做这样的事情的正确方法是什么?

回复

Stop! Module time. – Chris Lutz



一个模块?你的意思是创建一个单独的文件?这增加了一些复杂性,但没有解决我要解决的问题:消除了围绕这个特定子例程的括号的需要。

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

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

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

Why do you want prototypes? See this question How to pass optional parameters to a Perl function – TLP



是的,原型(prototype)设计存在很多问题。主要问题是它根本没有做人们认为它应该做的事情:为传递给函数的参数声明变量类型。

这不是我在这里使用原型(prototype)设计的原因。

我很少使用原型(prototype)。事实上,这可能是我所有代码中唯一的情况。

最佳答案

如果我理解正确,您想要原型(prototype)和预先声明,以便您可以在同一个文件中使用该函数(原型(prototype)和无括号)。这就是 subs pragma 是为了。

例如,此代码可以正常工作:

#!/usr/bin/env perl

use strict;
use warnings;

use subs qw/mysay/;

mysay "Yo";
mysay "Yo", "Joel";

sub mysay ($;$) {
my $message = shift;
my $speaker = shift;
if (defined $speaker) {
$message = "$speaker says: " . $message;
}
print $message, "\n";
}

关于Perl 子程序原型(prototype)——正确的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8128918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com