我最近一直在阅读有关Perl的内容,并且对于Perl如何处理传递给子例程的参数感到有些困惑.
在Python,Java或PHP等语言中,函数定义采用(伪代码)形式:
function myFunc(arg1, arg2) {
// Do something with arg1 and arg2 here
}
Run Code Online (Sandbox Code Playgroud)
然而在Perl中,它只是:
sub mySub {
# @_ holds all arguments passed
}
Run Code Online (Sandbox Code Playgroud)
据我了解,这是唯一的方法.
如果我想限制调用者只传递2个参数怎么办?
这不仅仅是Perl在其他语言(即Python,C等)中不允许任何变量数量参数吗?
在某些时候这不会成为问题吗?
其他语言中的所有默认参数号检查怎么样?是否必须在Perl中明确地做到这一点?例如
sub a_sub {
if (@_ == 2) {
# Continue function
}
else {
return false
}
}
Run Code Online (Sandbox Code Playgroud)我想将一些参数(其中一个是可选的)传递给一个函数.我知道的唯一方法是使用列表(@)作为参数.因此,它没有内容或1个元素(永远不会是undef),所以我可以使用以下代码:
sub someFunction($$@) {
my ( $oblig_param1, $oblig_param2, $option_param ) = @_;
...
}
Run Code Online (Sandbox Code Playgroud)
这段代码有效,但我觉得这可能不是最好的解决方法.
有没有其他方法可以做到这一点?
谢谢.
在C++中我会做这样的事情:
void some_func(const char *str, ...);
some_func("hi %s u r %d", "n00b", 420);
Run Code Online (Sandbox Code Playgroud)
在PHP中我会这样做:
function some_func()
{
$args = func_get_args();
}
some_func($holy, $moly, $guacomole);
Run Code Online (Sandbox Code Playgroud)
我如何在Perl中做到这一点?
sub wut {
# What goes here?
}
Run Code Online (Sandbox Code Playgroud) 这是一个Perl n00b问题,但我没有找到一个清晰易懂的在线回答.
我有这个代码:
1.sub remCH();
2.#some stuff
3.$line = remCH($line);
4.
5.sub remCH() {
6.$rem = shift;
7.$rem = chomp($rem);
8.return ($rem);
9.}
Run Code Online (Sandbox Code Playgroud)
执行此代码时总是会出现以下错误(第24行将在上面的代码中为第3行):
Too many arguments for main::rem_CRLF at ./make_csv.pl line 24, near "$line)"
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这是因为函数设置为返回一些东西但是当我声明它时,它被声明为"void".
我如何声明如下函数???
sub remCH(string/integer);
Run Code Online (Sandbox Code Playgroud)