2016-10-18 1 views
0

PerlがASCII値を評価する能力をテストする次のプログラムとそのif/elsif文を書きました。Perlプログラミング演習 - ASCII値を比較するにはどうすればよいですか?

言語の並べ替え機能の使用を避けたいと思います。

#test ASCII values using if and elsif 
$s = '4'; 
$j = 'a'; 
$k = "AS"; 

#1st print the variable with the lowest ASCII value 
if ($s <= $j && $s <= $k) { 
    say $s; 
    $s = 1000; 
} elsif ($j <= $s && $j <= $k) { 
    say $j; 
    $j = 1000; 
} elsif ($k <= $j && $k <= $s) { 
    say $k; 
    $k = 1000; 
} 

#print the variable with the 2nd lowest value 
if ($s <= $j && $s <= $k) { 
    say $s; 
    $s = 1000; 
} elsif ($j <= $s && $j <= $k) { 
    say $j; 
    $j = 1000; 
} elsif ($k <= $j && $k <= $s) { 
    say $k; 
    $k = 1000; 
} 

#print the variable with the 3nd lowest value 
if ($s <= $j && $s <= $k) { 
    say $s; 
    $s = 1000; 
} elsif ($j <= $s && $j <= $k) { 
    say $j; 
    $j = 1000; 
} elsif ($k <= $j && $k <= $s) { 
    say $k; 
    $k = 1000; 
} 

次のように私の出力は次のようになります。

52 
97 
65 
a 
AS 
4 

が、正しい結果は次のとおりです。

52 
97 
65 
4 
AS 
a 

事前にありがとうございます。私の質問文を改善するためのヒントは大歓迎です。

+6

厳密と警告をオンにすると、数字以外の文字に対して数値比較を実行しようとしていることがわかります。だから、 "厳密に使う"と "警告を使用する";あなたのvarsを "my $ s;"と宣言します。それを実行すると、警告が表示されます。比較演算子のperldoc perlopをチェックアウトします。 – jmcneirney

+4

私は混乱しています。 「52」、「97」、「65」はどこから来たのですか?それらはあなたの入力の '4'、' a'、 'AS'の最初の文字の順序値ですが、私はあなたがそれらをどこで計算するか分かりません。とにかく、Perlには2組の比較演算子があります。 '<'、 '='、 '!='、 '>'、 '> ='、 '<=>'、数値比較のために 'lt'、' le'、 'eq'、' ne '、' ge'、 'gt'、' cmp'を使ってレキシカル(文字列)を比較します。 ['perldoc perlop'](http://metacpan.org/pod/perlop)を参照してください。 – mob

+1

言い換えれば、ASCIIを取得したい(そして '==、<, >'演算子を使って計算する)場合は、文字列を変換する必要があります。たとえば、 'ord'や' unpack'などでそれを行うことができます。 (そして、それはあなたが "出力"でそれを示しているので、何とかしているように思えます。つまり、完全な例を表示します。)Perlでは、数値や文字列をスカラー変数に格納することができますが、あなたはいつも物事が関係なく働くことを期待することはできません。 – zdim

答えて

0

常にuse strict; use warnings;を使用してください!後者は、文字列比較演算子(例:lt)を使用する必要がある数値比較演算子(例:<)を使用しているとお伝えしました。

しかし、あなたは、単に次のように使用できます。

say for sort $s, $j, $k; 
+0

はい、あなたは正しいです。ありがとう、そして他の人々にも感謝します。私は文字列の比較を使用していたはずだったときに数値比較を使用していました。 –

0

あなたは、引数の最初の文字の数値を得るために、ord機能を使用します。バイト単位ではなく文字単位であり、これはUnicodeが正しく動作することを意味します。詳細についてはhttp://perldoc.perl.org/functions/ord.htmlをご覧ください。