我到Perl已经1天了,正在经历API doc here,几乎没有基本问题
$sftp = Net::SFTP::Foreign->new($host, autodie => 1);
my $ls = $sftp->ls("/bar");
# dies as: "Couldn't open remote dir '/bar': No such file"
问题
或者这样的事情更有意义吗?
my $sftp = Net::SFTP::Foreign->new($host, autodie => 1);
$sftp->find("/sdfjkalshfl", # nonexistent directory
on_error => sub { print "foo!\n";sftp->disconnect();exit; });
我试图在我的Windows机器上运行以下代码
use Net::SFTP::Foreign;
my $host = "demo.wftpserver.com";
my $sftp = Net::SFTP::Foreign->new($host ,ssh_cmd => 'plink',autodie => 1);
my $ls = $sftp->ls("/bar");
但我得到错误
' PLINK'不被视为内部或外部命令,
然而,当我从Windows命令行运行plink时,它工作正常!!
答案 0 :(得分:2)
使用autodie会自动关闭连接吗?
是。当程序结束时,所有内容都会被销毁,连接也会关闭。当$sftp
变量超出范围时也是如此。像这样的模块通常实现a DESTROY
sub。当对象(它只是Perl中的引用)超出范围时,会调用它们。该子可以有一些清理。另一个例子是DBI,当然还有词法文件句柄(例如来自$fh
调用的open
)。
我们在上面的示例中看到如何使用文件夹,类似的语法也适用于文件?
不。 The docs说ls
用于目录:
获取远程目录$ remote的列表。如果未给出$ remote,则列出当前的远程工作目录。
但是你可以为你想要的文件所在的目录做ls
,并使用wanted
选项。
my $ls = $sftp->ls( '/home/foo', wanted => qr/^filename.txt$/ );
虽然autodie
会死亡,但如果你不想让它真的死在这里,你应该把它包裹在Try::Tiny电话或eval
中。
use Try::Tiny
# ...
my $ls = try {
return $sftp->ls( '/home/foo', wanted => qr/^filename.txt$/ );
} catch {
return; # will return undef
};
say 'Found file "filename.txt" on remote server' if $ls;
至于plink
未找到,可能Windows PATH
与Perl看到的不同。