【问题标题】:If a subroutine is in the same directory as my main function, how do I call it?如果一个子程序与我的主函数在同一目录中,我该如何调用它?
【发布时间】:2014-07-10 20:18:54
【问题描述】:

好的,我正在重写它以详细说明。我对 Perl 和编程相当陌生,所以请多多包涵。本质上,我想知道当它们来自同一目录时,如何在主 .pl 文件中运行一个或多个文件(我猜是模块?)。我的代码可以正常工作,它们都作为子例程插入我的文件底部,但如果我将子例程拉出并将它们转换为模块,则不能。

【问题讨论】:

  • @Prix 大声笑 - 简短的问题,简短的评论?虽然您可能是对的,但您确实应该提供更多解释。对于这里的所有问题,有人可以用 link to RTFM 回答,但是,恕我直言,这不是 SO 的重点。
  • 什么是“子程序文件”?这些是模块吗? .pl 脚本?

标签: perl call subroutine


【解决方案1】:

这里有几个步骤可以帮助您入门。这会将一些 subs 导出到包 MyModule

首先在与主程序相同的目录中创建MyModule.pm。例如:

package MyModule;
use warnings; use strict;

sub foo {
    my $p = shift;
    print "foo called with param: $p\n";
    bar();
}

sub bar {
    print "bar called\n";
}

1; # don't delete this line

然后从你的主程序中加载和调用这个包中的 subs:

#/usr/bin/perl                                                                                                                                            
use warnings; use strict;

use File::Basename qw(dirname);
use lib dirname(__FILE__); # prepend source directory to the include path                                                                                 

use MyModule;

MyModule::foo(42);

use lib dirname(__FILE__) 语句将主程序的源目录添加到模块包含路径。

【讨论】:

  • 您实际上是在编写 use lib dirname(FILE) 还是在 FILE 中添加了其他内容?前置是不是有点像将主程序的源目录发送到模块的位置,反之亦然?
  • @John:是的,我正在使用__FILE__。这是一个 Perl 魔术变量,它给出了完整的源程序路径。 – 史努比
  • @John 通过 prepend,我的意思是取消转移到 @INC - 模块搜索路径。
【解决方案2】:

我有一个库文件,其中包含我创建的所有子例程,我称之为 util.pl。假设它在 $HOME/perl/lib/util.pl 中。

现在我在 $HOME/perl/project1/myscript.pl 中有一个 perl 脚本

在 myscript.pl 的顶部,我输入:require '$HOME/perl/lib/util.pl';

现在我可以从 myscript.pl 调用 util.pl 中的任何子例程。例如,undupespace() 在 util.pl 中。在 myscript.pl 我可以称之为:$s=undupespace($s);

安装模块后,我把它放在 myscript.pl 的顶部:use File::Copy;

这就是你想要的OP吗?

【讨论】:

  • 你的库是一个充满子程序的文件吗?还是包含单独子程序的单独文件的文件夹位置?
猜你喜欢
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多