2016-04-05 6 views
-3

ユーザーから5,10または15または20のいずれかを受け取る必要があります。そうでない場合は、4つの番号のいずれかを入力するまで再度尋ねる必要があります。ここにコードはありますが、同じことはしません。論理的な誤解を指摘する。perlスクリプトは、再度尋ねないと特定のユーザーデータを取得しますか?

print "Enter either 5 or 10 or 15 or 20): "; 
my $obfuscation_percentage = <STDIN>; 
chomp $obfuscation_percentage; 
if ($obfuscation_percentage ne 5 or 10 or 15 or 20){ 
print "Enter valid number: "; } 
$obfuscation_percentage = <STDIN>; 
chomp $obfuscation_percentage; 
+0

最終的な作業コードです.print "難読化率の値を入力してください(5または10または15または20)。"; my $ obfuscation_percentage; 一方($ obfuscation_percentage = ){ 場合($ obfuscation_percentage == 5 || $ obfuscation_percentage == 10 || $ obfuscation_percentage == 15 || $ obfuscation_percentage == 20){ 最後;}そう {プリント」有効な難読化率を入力してください: "; } } chomp $ obfuscation_percentage; –

答えて

1

まず、何も繰り返しません。典型的には、while()ループが使用される。次に、文字列を比較するneを使用しています。数値入力には==が必要です。第三に、あなたのifステートメントは機能しません。あなたは完全な比較を繰り返す必要があります。

if ($x == 5 || $x == 10 || $x == 15) {...} 

はここでループを備えた例だと、比較のためにgrep()を使用して:

use warnings; 
use strict; 

while (1){ 
    print "Enter either 5 or 10 or 15 or 20): "; 
    my $obfuscation_percentage = <STDIN>; 
    chomp $obfuscation_percentage; 

    my @valid = qw(5 10 15 20); 

    if (grep {$obfuscation_percentage == $_} @valid){ 
     print 10 * $obfuscation_percentage ."\n"; 
     last; 
    } 
} 

__END__ 
Enter either 5 or 10 or 15 or 20): 7 
Enter either 5 or 10 or 15 or 20): 12 
Enter either 5 or 10 or 15 or 20): 5 
50 
0

いくつかの問題。

まず、ループしたり、STDINから2番目の読み取りをチェックしたりすることはありません。ここであなたのコードはprettifiedです。

print "Enter either 5 or 10 or 15 or 20): "; 
my $obfuscation_percentage = <STDIN>; 
chomp $obfuscation_percentage; 
if ($obfuscation_percentage ne 5 or 10 or 15 or 20){ 
    print "Enter valid number: "; 
} 
$obfuscation_percentage = <STDIN>; 
chomp $obfuscation_percentage; 

stdinから読み込むには、ある種のループが必要です。

第二の問題は、perlop

バイナリ「または」両側の式の論理和を返すから、です。 ||と同じです非常に低い優先順位を除いて。これにより、制御フローに役立ちます。

したがって、リストチェックのように思うようには機能しません。それぞれの番号を調べたり、何か他のことをする必要があります。

neも文字列の比較ですが、演算子の右側には整数がありますが、Perlはそれを理解するのに十分なほどスマートです。

関連する問題