如何避免Perl脚本调用另一个Perl脚本

时间:2010-04-04 09:27:00

标签: perl

我从主脚本调用perl脚本client.pl来捕获client.pl的输出 在@output。

无论如何都要避免使用这两个文件,所以我可以在main.pl本身使用client.pl的输出

这是我的代码......

main.pl
=======

my @output = readpipe("client.pl");

client.pl
=========

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

#initialize host and port


my $host = shift || $FTP_SERVER;


my $port = shift || $CLIENT_PORT;

my $proto = getprotobyname('tcp');

#get the port address
my $iaddr = inet_aton($host);
my $paddr = sockaddr_in($port, $iaddr);

#create the socket, connect to the port
socket(SOCKET, PF_INET, SOCK_STREAM, $proto)or die "socket: $!\n";
connect(SOCKET, $paddr) or die "connect: $!\n";

my $line;
while ($line = <SOCKET>)
{
    print "$line\n";
}
close SOCKET or die "close: $!";

/岩石..

3 个答案:

答案 0 :(得分:3)

将公共代码放在包中。 Use client.pl和main.pl中的包。 Programming Perl的第10章提供了更多信息。

答案 1 :(得分:0)

不确定你真正想做什么,但可能会调查Net :: FTP(http://search.cpan.org/perldoc?Net%3A%3AFTP)等软件包

答案 2 :(得分:0)

你可以做两件事:

  1. 合并client.pl和main.pl中的代码,因为除了打印之外,您的主要功能不起作用。如果您想从传入的输入数据中做更多的事情,您应该在client.pl本身中执行此操作,因为内存数组(@output)可能会在RAM中读取大型数据时耗尽RAM。

  2. 如果您想要输出数组(@output

  3. 
        sub client {
         # intialize ..
         my @array =  (); #empty array
         while ($line = <SOCKET>)
         {
          push(@array,$line);
         }
         return @array;
        }
    
       @output = client();
    
       print @output;
    
    

    其他方式,您也可以使用引用:

    
    
        sub client {
         # intialize ..
    
         my @array =  (); #empty array
         while ($line = <SOCKET>)
         {
          push(@array,$line);
         }
         return @array;
        }
    
       my $output_ref = client();
    
       print @$output_ref; // dereference and print.