Теперь, когда у вас уже есть ответ <>
-> <STDIN>
, я думаю, что вижу проблему.Когда @ARGV
содержит что-либо, <>
является «магическим открытием».Perl интерпретирует следующий элемент в @ARGV
как имя файла, открывает его и читает его построчно.Поэтому, я думаю, вы, вероятно, можете сделать что-то вроде:
use strict;
use Net::FTP;
use warnings;
use Scalar::Util 'looks_like_number';
if(@ARGV < 2)
{
print "Usage: ftp.pl host [port] file [credentials file]\n";
exit();
}
my $host = shift; # or equiv shift @ARGV;
my $port = (looks_like_number $ARGV[0]) ? shift : 0;
my $filename = shift;
my @ftp_args = (
$host,
Timeout => 30,
Debug => 1
);
if ($port)
}
print "Connecting to $host on port $port.\n";
push @ftp_args, (Port => $port);
}
else
{
print "Connecting to $host with the default port.\n";
}
my $ftp = Net::FTP->new(@ftp_args)
or die "Can't open $host on port $port.\n";
#now if @ARGV is empty reads STDIN, if not opens file named in current $ARGV[0]
print "Usename: ";
chomp(my $username = <>); #reads line 1 of file
print "\nPassword: ";
chomp(my $password = <>); #reads line 2 of file
$ftp->login($username, $password);
$ftp->put($filename) or die "Can't upload $filename.\n";
print "Done!\n";
$ftp->quit;
Тогда, если у вас есть несколько кредитных карт в файле (скажем, с именем cred), таких как
myname
mypass
затем
$ ftp.pl host 8020 file cred
откроет host: 8020 для файла, использующего учетные данные в кредите.
Я не уверен, что вы хотите это сделать, просто так ТАК работает <>
.