0

サーバーにFTPで接続しようとしています。そこに着いたら、ファイルを取得し、5分間スリープした後に元に戻します。その部分は正しいですが、コードに追加しました。コードの実行時に入力される2つの変数です。ユーザーは、接続したいユーザー名を入力します。接続に問題があります。ユーザー名t14pbを入力すると、t14pmdsと言ったかのように、最初のifステートメントに移動します。コードは次のとおりです。

#!/usr/bin/perl

use Net::FTP;

$host     = "fd00p02";
$username = "$ARGV[0]";
$ftpdir   = "/";
$file     = "$ARGV[1]";

print "$username\n";
print "$file\n";

if ($username == t14pmds) {

  $password = "test1";

  $ftp = Net::FTP->new($host) or die "Error connecting to $host: $!";
  $ftp->login($username, $password) or die "Login failed: $!";
  $ftp->cwd($ftpdir) or die "Can't go to $ftpdir: $!";
  $ftp->get($file) or die "Can't get $file: $!";

  sleep 5;

  $ftp->put($file) or die "Can't put $file: $!";
  $ftp->quit or die "Error closing ftp connection: $!";
}

if ($username == t14pb) {

  $password = "test2";

  $ftp = Net::FTP->new($host) or die "Error connecting to $host: $!";
  $ftp->login($username, $password) or die "Login failed: $!";
  $ftp->cwd($ftpdir) or die "Can't go to $ftpdir: $!";
  $ftp->get($file) or die "Can't get $file: $!";

  sleep 5;

  $ftp->put($file) or die "Can't put $file: $!";
  $ftp->quit or die "Error closing ftp connection: $!";
}

if ($username == t14pmds_out) {

  $password = "test3";

  $ftp = Net::FTP->new($host) or die "Error connecting to $host: $!";
  $ftp->login($username, $password) or die "Login failed: $!";
  $ftp->cwd($ftpdir) or die "Can't go to $ftpdir: $!";
  $ftp->get($file) or die "Can't get $file: $!";

  sleep 5;

  $ftp->put($file) or die "Can't put $file: $!";
  $ftp->quit or die "Error closing ftp connection: $!";
}

if ($username == t14fiserv) {

  $password = "test4";

  $ftp = Net::FTP->new($host) or die "Error connecting to $host: $!";
  $ftp->login($username, $password) or die "Login failed: $!";
  $ftp->cwd($ftpdir) or die "Can't go to $ftpdir: $!";
  $ftp->get($file) or die "Can't get $file: $!";

  sleep 5;

  $ftp->put($file) or die "Can't put $file: $!";
  $ftp->quit or die "Error closing ftp connection: $!";
}
4

2 に答える 2

5

Perl のスカラーには、文字列型と数値型の 2 種類があります。で数値が等しいかどうかをテストします==。文字列は、数値のように見えない場合、ゼロに等しいと見なされます。これが、最初の分岐が常に実行される理由です (0 == 0)。

との厳密な等価性をテストするためeq、 のように比較したいとしますif ($username eq "foo") {...}

ただし、if-brances 内のコードは変更されないため、共通コードを外部に移動できます。残っているのは、ユーザー名とパスワードの間のマッピングです。これには、ハッシュが適しています。

my %uname_2_passwd = (
   t14pmds => "test1", # LHS of "=>" is auto-quoted, 
   ...                 # if it would be a valid variable name.
);

my $password = $uname_2_passwd{$username};

# common code here

また、use strict; use warningsスクリプトの先頭にお願いします。これにより、ほとんどの間違いが指摘されます (引用符を忘れる、文字列比較に eq を使用しない、数値比較で文字列を使用する、変数を宣言しないなど)。

于 2012-12-17T18:46:42.367 に答える
2

作成するすべてのプログラムにとって特に重要でuse strictあり、最初の使用ポイントの近くで変数を宣言します。use warningsmy

プログラム全体は、各ユーザーのパスワードを検索するためのルックアップ テーブルとしてハッシュを使用して、このように記述するのが最適です。

#!/usr/bin/perl

use strict;
use warnings;

use Net::FTP;

my ($username, $file) = @ARGV;

my %passwords = (
  t14pmds => 'test1',
  t14pb => 'test2',
  t14pmds_out => 'test3',
  t14fiserv => 'test4',
);

my $password = $passwords{$username} or die qq<Unknown username "$username">;

print "User: $username\n";
print "Pass: $file\n";

my $host     = 'fd00p02';
my $ftpdir   = '/';

my $ftp = Net::FTP->new($host) or die "Error connecting to $host: $!";
$ftp->login($username, $password) or die "Login failed: $!";
$ftp->cwd($ftpdir) or die "Can't go to $ftpdir: $!";
$ftp->get($file) or die "Can't get $file: $!";

sleep 5;

$ftp->put($file) or die "Can't put $file: $!";
$ftp->quit or die "Error closing ftp connection: $!";

print "All phases successful\n";
于 2012-12-17T23:01:38.940 に答える