Perl温度转换器

时间:2016-02-22 06:08:57

标签: perl

这是我的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;   
        }   
}

3 个答案:

答案 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。这段代码需要很多改进。