这是我的Perl代码,当我运行它时,它会显示我的菜单,我可以退出3.但是菜单上的1和2都没有注册为值输入而是直接转向其他并发出错误导致无限循环。
#! c:\Strawberry\perl\bin\Perl.exe
# This is a simple Temperature converter
# that will convert Fahrenheit to Celsius
# and Celsius to Fahrenheit.
use strict;
my $fahr = 0;
my $cel = 0;
my $choice = 0;
my $input = 0;
print "\n";
print "*********************************************\n";
print "*** This is a Temperature Converter ***\n";
print "*********************************************\n";
print "1. Celsius to Fahrenheit.\n";
print "2. Fahrenheit to Celsius. \n";
print "3. Exit\n";
print "*********************************************\n\n";
print "Enter a choice (1-3): ";
my $choice = <STDIN>;
chomp ($choice);
if(&IsNumeric($choice) == 0) {
$choice = 0;
}
while ($choice != 3) {
# Do conversion from C to F
if ($choice == 1) {
print "\nEnter a Temperature: ";
chomp ($cel = "" );
$fahr = ($cel * (9 / 5)) + 32;
# Format to one decimal
$fahr = sprintf("%.1f", $fahr);
print "$cel degrees Celsius = ";
print "$fahr degrees Fahrenheit\n";
}
# Do conversion from F to C
elsif ($choice == 2) {
print "\nEnter a Temperature: ";
chomp ($fahr = "" );
$cel = ($fahr - 32) * 5 / 9;
# Format to one decimal
$cel = sprintf("%.1f", $cel);
print "$fahr degrees Fahrenheit = ";
print "$cel degrees Celsius\n";
}
# Display Error Message
else {
print "\nYou entered and invalid choice please choose a choice from the menu.\n\n";
}
print "\nEnter a Choice (1-3): ";
chomp ($choice = "" );
if(&IsNumeric($choice) == 0) {
$choice = 0;
}
}
# Sub Name: IsNumeric.
# Description: This sub validates the input to check to see if
# the input is a Numeric value
# Example: 100, 1,000, $10.00, and 14.00 are valid inputs.
sub IsNumeric {
my $InputString = shift;
if ($InputString !~ /^[0-9|.|,]*$/) {
return 0;
}
else {
return 1;
}
}
答案 0 :(得分:4)
您的代码还有很大的改进空间,但由于这不是代码审核,我会回答您提出的问题并将其保留。你(非)阅读输入和咀嚼它的模式是错误的。而不是:
print "\nEnter a Temperature: ";
chomp ($cel = "" );
您需要先阅读STDIN
然后chomp
,而不必指定空字符串:
$cel = <STDIN>;
chomp($cel);
或者只是:
chomp($cel = <STDIN>);
如果您在脚本的顶部添加了use warnings
,您会看到以下消息或与其非常类似的消息:
参数“”在foo.pl第59行的数字ne(!=)中不是数字, 第1行。
这会提醒你,某些东西没有被设置为你认为它被设置的值。
答案 1 :(得分:2)
您的代码从不检索温度。
chomp( $cel = "" );
和
chomp ($fahr = "" );
只是将空字符串赋给那些变量。您需要<>
代替""
另请注意,永远不要使用&符号调用Perl子例程。无论你在哪里阅读说明,它都已经过时了。除了use warnings 'all'
之外,您还应始终use strict
,并且应避免使用大写字母表示局部变量
最后,你的正则表达式/^[0-9|.|,]*$/
使用一个字符类,它将匹配0到9中的任何一个字符,一个逗号,一个点或一个管道。我相信这不是你的意思。 Perl不会处理包含逗号或管道符号的数字
答案 2 :(得分:0)
输入选项1或2后,您要求输入温度,但您没有从输入中读取此温度。
此chomp ($cel = "" );
和chomp ($fahr = "" );
,您没有读取输入并将其添加到其中。把它写成:
chomp ($cel = <STDIN>);
和
chomp ($fahr = <STDIN>);
并且无需两次声明$choice
。这段代码需要很多改进。