2014-01-21 79 views
0

我有兩個perl腳本,我需要一起運行。運行嵌套的依賴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模式下,我沒有從調試器獲得有關其他腳本的信息。

我已經做了一些研究並閱讀了關於system,capture,requiredo。如果使用系統函數來運行腳本,我將如何導出腳本二中定義的函數?

問題:
1.無論如何要在perl中做到這一點?
2.如果有,我需要如何達到這個目標?

我完全理解perl是perl。不是另一種編程語言。不幸的是,在轉換時往往會帶來他們所知道的東西。我很抱歉。

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

回答

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

沒錯。

同時運行2個獨立的腳本根本無法讓腳本訪問其他功能。它們是2個完全獨立的過程。你需要使用模塊。模塊的重點在於不會重複自己,通常稱爲「幹」編程。一個簡單的經驗法則是:

  1. 如果您打算使用一段代碼將其放入當前腳本的子例程中。
  2. 如果你打算在幾個程序中使用同一個塊,把它放在一個模塊中。
  3. 還記得,常見的問題通常有CPAN

一個模塊,應該足以讓你去。那麼如果你打算做很多的Perl編程,你應該購買由Larry Wall編寫的書「Programming Perl」,如果你是用其他語言編程的話,或者Randal Schwartz編寫的「學習Perl」如果你是新手編程。我老式,所以我有兩本書,但你仍然可以將它們作爲電子書。還請看看Perl.org,因爲你並不孤單。