Perl - 数组的引用

时间:2014-01-29 14:56:44

标签: arrays perl reference sftp

我正在使用此模块: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];

但没有任何作用:(

有什么帮助吗?

感谢,

的问候,

1 个答案:

答案 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客户端,我的程序可能无法正常工作。