2014-01-29 3 views
-1

이 모듈을 사용하고 있습니다 : Net::SFTP::Foreign 그리고 "더 많은"옵션을 여러 인수와 함께 사용하려고합니다.Perl - 배열 참조

문서가

more => [@more_ssh_args] 

Note that this option expects a single command argument or a reference to an array of arguments. For instance: 

    more => '-v'   # right 
    more => ['-v']  # right 
    more => "-c $cipher" # wrong!!! 
    more => [-c => $cipher] # right 

를 말합니다하지만 난이 일을 얻을 수 없습니다.

기본적으로, 난 당신이 예를 들어, 여기에 데이터를 볼 수 있습니다 배열 내 모든 인수가 @sftp_args라는이 (\ @와 함께 @) : 내 SFTP 코드에서

print Dumper(@sftp_opts); 
$VAR1 = '-v'; 
$VAR2 = '-q'; 
---------------------------------- 
print Dumper(\@sftp_opts); 
$VAR1 = [ 
      '-v', 
      '-q' 
     ]; 

, 난 시도했습니다 같은 많은 옵션 :

more => [\@sftp_opts]; 
more => \@sftp_opts; 
more => \[@sftp_opts]; 

하지만 아무것도 작동 :(

도움 바랍니다

?

감사,

관해서는, 당신이 이해할 필요가 무엇

+4

백 슬래시가없고 세미콜론이 없습니다 :'more => [@sftp_opts]' – toolic

+2

"아무것도 작동하지 않습니다"라고 정의하면, 펄은 오류를 발생 시키거나 SFTP 연결이 실패합니까? – grebneke

답변

2

백그라운드에서 벌어지고있는 것입니다. 이러한 옵션은 클래스 생성자에 배열로 전달됩니다. 인수는 항상 배열로 전달됩니다.

따라서 나는 서브 루틴이있는 경우, (또는 방법 또는 클래스 생성자을, 그들은 그들의 옷을 입고 외부 아래 모든 서브 루틴을 것), 나는 다음과 같이 호출 전달 :

foo (
    -bar => "far", 
    -foo => "boo", 
); 

는 사실은이 일을 오전 :

foo("bar", "far", "foo", "boo"); 

을 그리고 내 서브 루틴이 점점 :

을 내가 원하는

sub foo (
    my @array = [email protected]; 

    say $array[0]; # -bar 
    say $array[1]; # far 
    say $array[2]; # -foo 
    say $array[3]; # boo 
    say $array[4]; # -more 
    say $array[5]; # ARRAY reference 

    say $array[5]->[0]; # -fubar 
    say $array[5]->[1]; # bufar 
    say $array[5]->[2]; # -barfu 
    say $array[5]->[3]; # farbu 

:

foo (
    -bar => "far", 
    -foo => "boo", 
    -more => [ 
     -fubar => "bufar", 
     -barfu => "farbu", 
    ], 
}; 

내가 통과하고있어이 같은 배열은 다음과 같습니다

하자 '는 내가 배열에 대한 참조입니다 옵션을 전달할 수 있다고 방법을 강조하기 위해 간단히이 전부입니다. 때로는 사람이 상황을 생각하고 이상하게 생각할 때가 있습니다. 배열 참조를 -more으로 전달해야한다면 배열 참조의 뒤에 배열의 다음 요소 인 -more이 오는 것입니다. 따라서 배열 참조를 전달하려고합니다. 이 할 수있는 올바른 방법입니다 :

-more => \@more_args; 

또는 당신은 그것을 많이 나는 위의 서브 루틴 foo을 위해 그것을 어떻게 같은 익명의 배열 참조를 나타 내기 위해 [...]를 사용하여 옵션의 실제 목록을 제공 할 수 있습니다.여기

당신이 올바르게 서브 루틴의 매개 변수 (그냥 배열의 기억)의 배열을 전달하지 않는 의심되는 경우 당신이 할 수있는 작업은 다음과 같습니다

my @temp_array = (-host => server, -user => bob, -more => [ -c => "cypher" ]); 

: 당신의 매개 변수를 포함하는 임시 배열 만들기 지금, 당신은 생성자에 직접 배열을 전달 할 수 있습니다

:

my $ftp = Net::SFTP::Foreign->new(@temp_array); 

이 당신이 할 수 있습니다 어떤 것은 올바른 형식의 매개 변수가 포함되어 있는지 확인하기 위해 @temp_array 덤프하는 것입니다 6,

say Dumper \@temp_array; 

출력은 다음과 비슷한 모습이 될 것

VAR1 = { 
    -host => "server", 
    -user => "bob" 
    -more => { 
     -c => "cypher" 
    } 
} 

또는,이 같은 (결국,이하던 ARRAY 참조) :

VAR = [ 
    "-host", 
    "server", 
    "-user", 
    "bob", 
    "-more", 
    [ 
     "-c", 
     "cypher", 
    ], 
] 

어쨌든, 나는 것을 볼 수 있습니다 내 매개 변수가 생성자에 올바르게 전달됩니다. Net :: SFTP :: Foreign에 여전히 문제가있는 경우 문제 해결을 위해 매개 변수 전달을 제거 할 수 있습니다. 대신 문제는 다른 문제로 인한 것일 수 있습니다. 예를 들어 클래스가 내 ssh 명령 줄 기능을 사용하는 방식 때문일 수 있습니다. (예,이 클래스는 외부 명령을 사용합니다!). 즉, Windows 시스템에 있고 ssh 클라이언트를 설치하지 않은 경우 프로그램이 작동하지 않을 수 있습니다.