2013-06-13 2 views
3

나는 master.pl이라는 Perl 스크립트를 가지고 있습니다. 두 번째 배열은 @inputarray입니다.하나의 Perl 스크립트에서 다른 하나의 Perl 스크립트로 2D 배열을 전달

master.pl의 2D 배열 값을 child.pl이라는 다른 프로그램으로 전달하고 child.pl의 데이터에 액세스해야합니다.

많은 시도를했지만 child.pl의 배열을 역 참조 할 수 없습니다.

도와주세요.

master.pl

system "start perl child.pl $appl $count @inputarray"; 

child.pl

($appl, $count, @inputarray) = @ARGV; 

for (my $k = 0; $k < $count + 1; $k++) { 
    for (my $m = 0; $m < 6; $m++) { 
     print "$inputarray[$k][$m] "; 
    } 
    print "\n"; 
} 
+1

Welcome to Stackoverflow. 질문에 관련 코드가 포함 된 스 니펫을 추가하십시오. – mzedeler

+4

'Data :: Dumper' 또는'Storable' –

+0

... 또는 YAML로 직렬화하십시오. 그리고 CPAN에는 다른 많은 옵션들이있을 것입니다. –

답변

2

방법 1 :

은 표준 모듈 Data::Dumper에서보세요 , 그것은 당신이 원하는 것에 이상적입니다.

Data :: Dumper를 사용하여 임시 파일에 데이터 구조를 저장 한 다음 두 번째 스크립트에서 읽습니다.

방법 2 : 첫 번째 스크립트에서 배열을 저장하고 다른에서 검색 할 Storable를 사용

.

편집 (당신은 당신의 코드를 제공 한 후) :

는이

master.pl

#!/usr/local/bin/perl 
use strict; 
use warnings; 
use Storable; 
my @inputarray = ([1, 2, 3], [4, 5, 6], [7, 8, 9]); 
store (\@inputarray, "/home/chankey/child.$$") or die "could not store"; 
system("perl", "child.pl", $$) == 0 or die "error"; 

child.pl

같은 배열에 액세스 할 수 있습니다 참조
#/usr/local/bin/perl 
use strict; 
use warnings; 
use Storable; 
use Data::Dumper; 
my $parentpid = shift; 
my $ref = retrieve("/home/chankey/child.$parentpid") or die "coudn't retrieve"; 
print Dumper $ref; 
print $$ref[0][0]; #prints 1 

$VAR1 = [ 
      [ 
      1, 
      2, 
      3 
      ], 
      [ 
      4, 
      5, 
      6 
      ], 
      [ 
      7, 
      8, 
      9 
      ] 
     ]; #from Dumper 
    1 #from print $$ref[0][0] 

당신이 덤프에서 볼 수 있듯이 출력, 당신은 $ref@inputarray을 받았습니다. 이제 원하는 방식으로 사용하십시오.

+0

거기에 텍스트 파일을 만들지 않고 어떤 방법이 있습니다. 왜냐하면 내가 임시 텍스트 파일을 사용해서는 안된다는 제약이 있기 때문입니다. –

+0

수정 된 답변을 메일 링리스트 링크에서 확인하십시오. –

+0

주소를 하위 파일로 가져올 수 있지만 주소에서 값을 검색 할 수 없습니다. 어떤 값을 출력해도 그 위치의 값이 아닌 주소를 출력 할 수 있습니다. –

1

모든 종류의 펄 데이터 직렬화/직렬화 해제에 대해서는 Storable을 확인하십시오.

POSIX 시스템의 프로세스간에 데이터를 전달할 때 named pipes을 사용합니다. Windows와의 호환성을 향상시키기 위해 File :: Temp를 사용하여 임시 파일을 사용할 수 있습니다.

1

UNIX와 Windows에서 같은 방식으로 작동하는 익명 파이프를 사용할 수 있습니다. start 때문에 Windows를 사용한다고 가정합니다.이 시도 :

use strict; 
use warnings; 

my $appl = 'orange'; 
my @inputarray = ([0,1,2],[3,4,5],[6,7,8]); 

을 우리는 $count 필요하지 않습니다, 당신은 스칼라 문맥, 또는 $#inputarray를 사용하여 가장 높은 인덱스 번호를 사용하여 배열의 요소 수를 얻을 수 있습니다;

디버그하기가 어렵 기 때문에 start을 생략했습니다 (실행 후 콘솔 창이 닫힙니다).

use strict; 
use warnings; 

my ($inp) = <STDIN>; 

my ($appl, $inputarray); 
eval "$inp"; 
print "appl = $$appl\n"; 

: 파이프 (입력 스트림을) 읽는 아이, 지금

use Data::Dumper; 

local $Data::Dumper::Purity = 1; 
local $Data::Dumper::Indent = 0; 

my $dat = Data::Dumper->new([\$appl,\@inputarray], 
          [qw($appl $inputarray)]); 

print $pipe $dat->Dump(); 
close ($pipe); 

: 우리가 eval 문을 추가하고 공백 발생을 줄일 수있는 데이터 : 덤퍼 사용

my $cmd = 'perl child.pl'; 
open(my $pipe, '|-', $cmd) or 
    die "Unable to execte $cmd; $!"; 

eval의 사용은 보통 눈살을 찌푸 리니 보안 구멍이 생길 수 있으므로 조심해서 사용하십시오. 나는 그것이 여기 정당하다고 생각한다.

귀하의 루프는 태드 복잡하고, C의 냄새가이 오히려 더 Perlish 있습니다

for my $ref (@$inputarray) { 
    for my $ele (@$ref) { 
     print "$ele " 
    } 
    print "\n" 
} 

YAML이는 eval을 필요로하지 않기 때문에 안전하지만 설치해야합니다.

+0

나는 perl에별로 관심이 없습니다. 내가 전에 파이프를 작성해야합니까? "print $ pipe $ dat-> Dump()"명령을 사용하여 파이프에 작성하십시오. –

+0

파이프에 읽기 및 파이프 쓰기와 파이프 쓰기가 모두 있어야한다고 생각합니다. 명시 적으로해야합니까 아니면 그냥 파일 핸들로 선언하고 사용해야합니까? –

+0

@BharadwajT : 익명 파이프를 사용하는 경우 'open'은 새 파이프와 새 프로세스 (client.pl)를 만들고 현재 프로세스는 파이프 파일 핸들에 씁니다. client.pl에서 STDIN을 읽었을 때 이미 파이프의 읽기면에 연결되어 있습니다. 아이디어를 얻으려면 코드 예제를 완료하십시오 (Windows 7에서 테스트 완료). – cdarke

관련 문제