运行嵌套的依赖perl脚本

时间:2014-01-21 08:05:17

标签: perl dependencies

我有两个perl脚本需要一起运行。

第一个脚本定义了许多常用函数和主方法。

脚本1(one.pl)示例:

#!/usr/bin/perl
sub getInformation
{
  my $serverMode = $_[0];
  my $port = $_[1];
  return "You\nneed\nto\nparse\nme\nright\nnow\n!\n";
}

#main
&parseInformation(&getInformation($ARGV[0], $ARGV[1]));

第二个是在定义两个函数后调用第二个脚本的脚本。

脚本2(two.pl)示例:

#!/usr/bin/perl
sub parseInformation
{
  my $parsedInformation = $_[0];
  #omitted
  print "$parsedInformation";
}

my $parameterOne = $ARGV[0];
my $parameterTwo = $ARGV[1];
do "./one.pl $parameterOne $parameterTwo";

命令行用法:

> ./two.pl bayside 20

我试图这样做并且脚本似乎运行但是,每当我在perl -d two.pl模式下运行脚本时,我都没有从调试器获得有关其他脚本的信息。

我做了一些研究并阅读了systemcapturerequiredo。如果使用系统函数来运行脚本,我将如何导出脚本2中定义的函数?

问题:
1.无论如何在perl中这样做吗?
2.如果是这样,我究竟需要如何实现这一目标?

我完全理解perl是perl。不是另一种编程语言。不幸的是,过渡时往往会带来他们所知道的东西。道歉。

参考文献:
How to run a per script from within a perl script
Perl documentation for require function

2 个答案:

答案 0 :(得分:1)

一般来说,这不是你应该在Perl中编写可重用的常用函数的方式。相反,您应该将大部分代码放入Perl模块中,并编写充当模块包装器的简短脚本。这些简短的脚本基本上应该只是获取并验证命令行参数,将这些参数传递给模块以进行实际工作,然后格式化并输出结果。

我真的希望我能推荐perldoc perlmod来学习编写模块,但它似乎主要集中在细节上而不是如何编写和使用Perl模块的高级概述。 Gabor Szabo's tutorial也许是一个更好的起点。

这是一个简单的例子,创建一个输出Unix时间戳的脚本。这是模块:

# This file is called "lib/MyLib/DateTime.pm"
use strict;
use warnings;

package MyLib::DateTime;

use parent "Exporter";
our @EXPORT_OK = qw( get_timestamp );

sub get_timestamp {
    my $ts = time;
    return $ts;
}

1;

这是使用它的脚本:

#!/usr/bin/env perl
use strict;
use warnings;
use lib "/path/to/lib";   # path to the module we want, but
                          # excluding the "MyLib/DateTime.pm" part

use MyLib::DateTime qw( get_timestamp );  # import the function we want

# Here we might deal with input; e.g. @ARGV
# but as get_timestamp doesn't need any input, we don't
# have anything to do.

# Here we'll call the function we defined in the module.
my $result = get_timestamp();

# And here we'll do the output
print $result, "\n";

现在,运行脚本应该输出当前的Unix时间戳。另一个使用时间戳执行更复杂的脚本也可以使用MyLib :: DateTime。

更重要的是,需要对时间戳执行某些操作的另一个模块可以使用MyLib :: DateTime。将逻辑放入模块中,让这些模块相互使用,实际上是CPAN的本质。我一直在展示一个非常基本的日期和时间库,但日期时间操作之王是CPAN上的DateTime模块。这反过来使用DateTime::TimeZone

重用代码的简易性,以及CPAN上大量免费,经过良好测试和(大多数)文档齐全的模块的可用性,是Perl的主要卖点之一。

答案 1 :(得分:1)

完全。

同时运行2个单独的脚本将不会让任何脚本访问其他功能。它们是两个完全独立的过程。你需要使用模块。模块的要点是你不要重复自己,通常称为“干”编程。一个简单的经验法则是:

  1. 如果您打算多次使用一段代码,请将其放入当前脚本的子程序中。
  2. 如果您打算在多个程序中使用相同的块,请将其放入模块中。
  3. 还要记住常见问题通常在CPAN
  4. 上有一个模块

    这应该足以让你前进。然后,如果你要做很多Perl编程,你应该买Larry Wall的书“ Programming Perl ”,如果你用其他语言编程,或者“学习Perl “Randal Schwartz,如果你是编程新手。我很老式,所以我有两本印刷版书籍,但你仍然可以将它们作为电子书。同时查看Perl.org,因为您并不孤单。