【发布时间】:2016-10-18 22:27:21
【问题描述】:
我编写了以下程序来测试 Perl 评估 ASCII 值的能力,以及它的 if / elsif 语句。
我想避免使用语言的排序功能。
#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
提前谢谢你。欢迎提供有关如何改进我的问题写作的提示。
【问题讨论】:
-
打开严格和警告,你会看到你正在尝试对非数字字符进行数字比较。所以,“使用严格;”和“使用警告;”并将你的变量声明为“my $s;”等。然后当你运行它时,你会看到警告。查看 perldoc perlop 以获取比较运算符。
-
我很困惑。
52、97和65来自哪里?它们是输入4、a和AS的第一个字符的序数值,但我看不出你在哪里计算它们。无论如何,Perl 有两组比较运算符。<,<=,==,!=,>,>=,<=>用于数值比较,lt,le,@987654345,@9876543454 @、gt、cmp用于词法(字符串)比较。见perldoc perlop。 -
换句话说,如果你想得到 ASCII(并用它计算,通过使用
==, <, >运算符),你需要转换字符串。例如,您可以使用ord或unpack来做到这一点。 (而且似乎你已经以某种方式做到了,因为你在“输出”中展示了这一点——所以显示完整的例子。)虽然 Perl 确实允许我们将数字或字符串存储在标量变量中,在使用它们时,您不能总是期望事情无论如何都能正常工作。 -
// , 你问了一个很好的问题,McNulty 先生。欢迎来到苦难!请考虑向我们展示您已经对该主题所做的一些研究,并将 Tim Bunce 对“linting”问题的回答应用到您提供给我们的代码示例中:stackoverflow.com/a/27133639/2146138
-
您显示的代码甚至无法编译,因为您尚未在任何地方定义
say。修复后,输出为a、AS、4,而不是您显示的文本。除非您准确地解释您的问题,否则我们无法帮助您。
标签: perl if-statement ascii