web-dev-qa-db-ja.com

Perl-コードを複製しない複数のifステートメント

これは、ターミナル(Windowsコマンドライン)を使用して実行されるPerlプログラムです。コードを繰り返すことなく、両方の条件に対して同じコードブロックを使用するステートメントの場合、「これとこれが真の場合、またはこれとこれが真の場合」を作成しようとしています。

if ($name eq "tom" and $password eq "123!") elsif ($name eq "frank" and $password eq "321!") {

print "You have gained access.";

} else {

print "Access denied!";

}
8
John Doe

シンプル:

if ( $name eq 'tom' && $password eq '123!'
    || $name eq 'frank' && $password eq '321!'
) {

(優先度の高い&&および||式で、一般的な優先順位エラーを回避するために、フロー制御用にandおよびorを予約)

より良い:

my %password = (
    'tom' => '123!',
    'frank' => '321!',
);

if ( exists $password{$name} && $password eq $password{$name} ) {
20
ysth

スクリプトにパスワードを保存することはお勧めしませんが、これはあなたが指示する方法です:

use 5.010;
my %user_table = ( tom => '123!', frank => '321!' );

say ( $user_table{ $name } eq $password ? 'You have gained access.'
    :                                     'Access denied!'
    );

このような関連付けを強制する場合は、tableと考えるのが得策です。Perlで最も一般的な形式のテーブルはハッシュです。

3
Axeman
if (   ($name eq "tom" and $password eq "123!")
    or ($name eq "frank" and $password eq "321!")) {
    print "You have gained access.";
}
else {
    print "Access denied!";
}

(他の人々:ここのJohn Doeは実際にはパスワードをハードコーディングしていないと確信しています。彼は単にそれを例として使用しているだけです。)

1
Dodger