2017-04-12 47 views
0

我有這個Perl程序,應該將單位,英寸釐米等。但它不會在循環中打印變量。它只是打印標準「等於」,並說,$ UNIT2未初始化Perl文本解析變量無法打印

Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 1. 
    is equal to 
Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 2. 
    is equal to 
Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 3. 
    is equal to 
Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 4. 
is equal to 
Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 5. 
    is equal to 
Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 6. 
    is equal to 
Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 7. 
    is equal to 
Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 8. 
    is equal to 
Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 9. 
    is equal to 
Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 10. 
    is equal to 
Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 11. 
    is equal to 
Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 12. 
    is equal to 
Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 13. 
    is equal to 
Use of uninitialized value $unit2 in print at convert.pl line 47, <GEN1> line 14. 
    is equal to 

這裏是我的代碼

#!/usr/bin/perl 
#usage: perl convert.pl 

use Path::Class; 
use warnings; 
use autodie; # die if problem reading or writing a file 

my $dir = dir("./"); 

my $file = $dir->file("distances.txt"); 

# Read in the entire contents of a file 
my $content = $file->slurp(); 

# openr() returns an IO::File object to read from 
my $file_handle = $file->openr(); 

# Read in line at a time 
while(my $line = $file_handle->getline()) { 
    # parses string into value and unit 
    my ($val, $unit) = split /[\n]/, $line; 
    # initialize values 
    my ($val2, $unit2) = ""; 
    # check unit and apply corresponding math 
    if ($unit eq "in") { 
     $val2 = $val * 2.54; 
     $unit2 = "cm"; 
    } 
    else { 
     if ($unit eq "ft") { 
      $val2 = $val * 0.3048; 
      $unit2 = "m"; 
     } 
     else { 
      if ($unit eq "yd") { 
       $val2 = $val * 0.9144; 
       $unit2 = "m"; 
      } 
      else { 
       if ($unit eq "mi") { 
        $val2 = $val * 1.609347; 
        $unit2 = "km"; 
       }#close mile if statement 
      }#close else statement 
     }#close 2nd else statement 
    }#close 1st else statement 
    print $val, " ", $unit, " is equal to ", $val2, " ", $unit2, "\n"; 
} 

下面是我使用的文本文件。

74 in 
10 in 
10 ft 
10 yd 
10 mi 
72 in 
6 ft 
2 yd 
300 ft 
100 yd 
158400 in 
13200 ft 
4400 yd 
2.5 mi 
+0

'使用警告;' – toolic

+0

https://metacpan.org/pod/Math::Units – toolic

+0

* **總是***'嚴格使用'和'使用警告'全部' – Borodin

回答

1
while(my $line = $file_handle->getline()) { 
    # parses string into value and unit 
    my ($val, $unit) = split /[\n]/, $line; 

getline返回一行。通過將其拆分爲新行[\n],您可以在$val中獲得該行本身,而在unit中沒有任何行。也許你想split ' '

使用的單位轉換的哈希可能顯著縮短代碼爲什麼使其更具可讀性:

my %units = (in => [ cm => 2.54 ], 
       ft => [ m => .3048 ], 
       yd => [ m => .9144 ], 
       mi => [ km => 1.609347 ], 
); 

while (my $line = $file_handle->getline) { 
    my ($val, $unit) = split ' ', $line; 
    my ($val2, $unit2) = ($units{$unit}[1] * $val, $units{$unit}[0]); 
    print "$val $unit is equal to $val2 $unit2\n"; 
} 
+0

非常感謝! – Josh

+0

@Josh:也檢查更新。 – choroba

+0

@mkHun:我不是,那就是重點。 – choroba