我正在使用此模块:Net::SFTP::Foreign 我试图使用多个参数的“更多”选项。
文件说
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的数组中 你可以在这里看到这里的数据(用\ @和@):
print Dumper(@sftp_opts);
$VAR1 = '-v';
$VAR2 = '-q';
----------------------------------
print Dumper(\@sftp_opts);
$VAR1 = [
'-v',
'-q'
];
在我的SFTP代码中,我尝试了很多选项,例如:
more => [\@sftp_opts];
more => \@sftp_opts;
more => \[@sftp_opts];
但没有任何作用:(
有什么帮助吗?
感谢,
的问候,
答案 0 :(得分:2)
您需要了解的是后台发生的事情。这些选项作为数组传递给类构造函数。参数总是作为数组传递。
因此,如果我有一个子程序(或方法或类构造函数,它们都是在它们打扮的外部下面的所有子程序),我传入了像这样打电话:
foo (
-bar => "far",
-foo => "boo",
);
我实际上是这样做的:
foo( "bar", "far", "foo", "boo" );
我的子程序得到了这个:
sub foo {
my %args = @_; # Arguments are passed in array @_ no matter what the syntax is
...
让我说我可以传递 more 选项,它是对数组的引用:
foo (
-bar => "far",
-foo => "boo",
-more => [
-fubar => "bufar",
-barfu => "farbu",
],
};
我传递的是这样的数组:
sub foo (
my @array = _@;
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
我想强调简单这是怎么回事。有时一个人可以过度思考情况,并且会感到慌乱。如果需要将数组引用传递给-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
以查看它是否包含正确格式的参数:
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
客户端,我的程序可能无法正常工作。