2014-02-27 53 views
0

我有一个子程序(在Perl中)需要调用另一个调用其参数并添加字符串的子程序。我已经试过这样的事情(但我在寻找答案,而不仅仅是纠正这个......):从子程序调用子程序

sub TestBase($) 
{ 
    print @_; 
    return 'hard processed string'; 
} 

sub Test($) 
{ 
    print @_; 
    return TestBase(@_, 'Filename.txt'); 
} 

这一次失败,“太多的论据主要:: TestBase”(这些年而且我仍然使用cmd.com,在这种情况下不容易复制粘贴!)。

+0

我不知道Perl中,我与Python,考虑到时间和欲望,我宁愿去学习,而不是红宝石。这就是说我不需要大量的Perl文档。 – Liviu

+0

JavaScript最适合传递函数。 –

+0

@Dan Dascalescu我在Perl工作,因为这就是他们正在使用的(我不想让他们不高兴!)。我无法改变语言。 – Liviu

回答

1

要澄清和总结我对Dan的答案的更正,这是你的代码应该看起来像。

我已经去除了子程序原型,把开括号在同一行作为子程序名(作为优选由perldoc perlstyle),改变了名称为小写(大写通常被保留用于全局变量如包名称),并删除return关键字。

请注意,如果其他人正在编写依赖于他们的代码,那么最好留下子例程名称。遵循公认的做法很重要,但不如将界面保留至现有的代码基础静态。

#!/usr/bin/perl 

use strict; 
use warnings; 

sub test_base { 
    print @_; 
    'hard processed string'; 
} 

sub test { 
    print @_; 
    test_base(@_, 'Filename.txt'); 
} 

my $retval = test('A', 'B', 'C'); 
print "\n\n", $retval, "\n"; 

输出

ABCABCFilename.txt 

hard processed string 
+0

我几乎可以确定原始子程序的作用域是它的文件。我打算增加一些小部分(暂时),但我会包括你的推荐,我预计下周会持续一到两个小时。那么我可能会接受你的答案,谢谢你的努力! – Liviu

+0

顺便说一下,对于Perl风格,是不是有一个脚本来检查它?我的眼睛很弱:p! – Liviu

+0

@Liviu:如果你指的是子程序可以被调用的范围,那么它就在当前的包*中。如果在编译单元中没有'package'语句,那么全局变量将放在'main'包中。任何软件包中的任何子例程都可以被调用(如果它的软件包名称是完全限定的)。 – Borodin

4

Perl的最佳实践:don't define function prototypes除非你真的知道你在做什么。

#!/usr/bin/perl -w 
use strict; 

sub test_base { 
    print @_; 
} 

sub test { 
    print @_; 
    return test_base(@_, 'Filename.txt'); 
} 

test('foo', 'bar'); 
+2

看到http://stackoverflow.com/questions/297034/why-are-perl-5s-function-prototypes-bad – Alnitak

+0

我不明白:有人(这Alnitak?)downvoted你,因为...你正在使用原型?哪里?初始代码中的'TestBase($)'做它。 – Liviu

+0

这不是我的downvote – Alnitak