2015-02-05 1 views
-1

이 문제에 대한 해결책을 찾으려고 노력했습니다. 하지만 도움이 필요할 것 같습니다. 내가 perl에서 시스템 명령에 인수의 무리를 전달하려고합니다. 하지만 관련없는 오류가 발생합니다. 올바른 범위로 내 변수를 올바르게 선언했지만 여전히이 오류가 발생합니다. 여기 내 코드가있다.perl - 시스템 명령 인수에 오류가 발생했습니다

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

my $mi = 0; 
my $mj = 0; 

my @regbyte; 
my @databyte; 
my $filename; 
my @args; 
@regbyte =  ("00","01","02","03","04","05","06","07","08","09","0A","0B","0C","0D","0E","0F","10","11","12"); 
@databyte = ("00","01","02","03","04","05","06","07","08","09", "0A", "0B"); 

for($mi=0; $mi<13; $mi++) 
{ 
for($mj=0; $mj<256; $mj++) 
    { 
     $filename = "write_" . $regbyte[$mi] . "_" . $databyte[$mj] . ".atp"; 
     system("perl perl_2_ver2.5.pl", $filename, $regbyte[$mi],  $databyte[$mj], "n"); 
    } 
} 

오류 메시지가 표시됩니다.

Global symbol "$databyte" requires explicit package name at perl_2_ver2.8.pl  line 20. 
Execution of perl_2_ver2.8.pl aborted due to compilation errors. 
+1

내가 같은 오류 어 얻지 않는다 나는 당신의 코드를 시도하고 확인한다. 축 어적으로 복제되었는지 확신합니까? 또한 논리 오류가 있다고 생각합니다. @databyte의 256 요소를 반복하지만 많은 요소가 없습니다. (foreach 루프는 어쨌든 당신이하고있는 것에 더 적합 할 것이다.) – Sobrique

+3

우리에게'perl_2_ver2.8.pl' 스크립트를 보여주는 스크립트가 있습니까? 그렇지 않다면 관련 Perl 코드가 표시되지 않습니다. 그렇다면 왜 다시 스크립트를 실행하여 '재귀'하고 있습니까? '@ args'를 제거 할 수 있으며, 당신이 정의한 라인에서'@regbyte'와'@ databyte'를 초기화 할 수 있습니다. '$ mi','$ mj' 및'$ filename'은 모두 여러분이 가진 것보다 훨씬 작은 범위를 줄 수 있습니다. –

+2

표시되는 오류 메시지가 Perl 소스 코드와 일치하지 않습니다. 라인 20은'system' 호출이지만'$ databyte'라는 변수에 접근하지 않습니다. 에러 메시지를 생성하지 않는'@ databyte' 배열의 원소에 접근하고 있습니다. – Borodin

답변

2

나는 특히 당신의 system 전화에 당신이 "n"에 이어, 몇 가지에 대해 의아해 해요. 그게 "\n"일까요? 그 맥락에서 불필요하고 잘못 되었기 때문입니다.

가장 큰 문제

for ($mj = 0; $mj < 256; $mj++) { .. } 

이 다음 @databyte은 열두 요소가있는 경우 $databyte[$mj]에 액세스하는 것입니다. 당신이 의미하는 바를 아는 것은 어렵습니다.

다음은 내가 작동하는 것을 쓰는 방법이지만 의도는 아닙니다. 당신이 write_*_*.atp과 같이 모든 파일로 구성된 입력하여 스크립트 perl_2_ver2.5.pl를 실행하려면 같은

use strict; 
use warnings 'FATAL'; 

for my $regbyte (0 .. 0x12) { 
    for my $databyte (0 .. 0x0B) { 
     my $filename = sprintf "write_%02X_%02X.atp", $regbyte, $databyte; 
     system("perl perl_2_ver2.5.pl $filename $regbyte $databyte"); 
    } 
} 

는 것 같습니다. 그게 맞습니까?

디렉토리 방금이 존재하지 및 패턴과 일치하는 모든 파일을 처리 단지

while (my $filename = glob 'write*.atp') { 
    next unless /\Awrite_(\p{hex}{2})_(\p{hex}{2}).atp\z/; 
    system("perl perl_2_ver2.5.pl $filename $1 $2"); 
} 

사용하여 아마 더 낫다, 당신이하지 처리하고자 할 atp 파일을 포함하지 않는 .

0

코드를 복사/붙여 넣기하고 system 통화에 대한 프로그램 매개 변수 만 바꾸 었으며보고하는 오류가 발생하지 않습니다. 그러나 액세스되지 않는 많은 배열 요소가 있습니다.

for($mi=0; $mi<$#regbyte; $mi++) 

을 그리고 난 당신이 시스템 호출에 대한 두 가지 대안을 생각 중 perl_2_ver2.5.pl 그런 다음 (가정, 같은 디렉토리) 말할 수있는, 실행 가능 :

이 같은 arraysizes를 사용하여 루프를 제한 할 수 있습니다 :

system("./perl_2_ver2.5.pl", $filename, $regbyte[$mi], $databyte[$mj], "n"); 

또는 당신은 전화를해야 :

system("perl" , "./perl_2_ver2.5.pl", $filename, $regbyte[$mi], $databyte[$mj], "n"); 
+0

Erm ... 그러나 당신은'system'에 의해 호출 된 프로그램을 보지 못했습니다! – Borodin

+0

미안하지만, 이해가 안되니? 오류 메시지는 표시된 프로그램에서 온 것입니다. – nlu

+0

당신은 *''system' "*에 의해 호출 된 프로그램에만 변경을가했지만 해당 프로그램의 코드를 보지 못했습니까? 그래서 어떻게 변경을 할 수 있습니까? – Borodin

관련 문제