在连接(。)或字符串中使用未初始化的值 - Perl问题

时间:2014-02-21 17:09:58

标签: regex perl syntax-error perl-module logical-operators

我是第一次发布此内容。我在论坛中遇到过类似的问题,但我仍然无法确定为什么会收到此错误。

以下是我想要制作的示例代码..

use strict;
use warnings;
my ($m, $b) = @ARGV;
my $count_args = $#ARGV + 1;
my $times = 2**$m;
main();

sub main {
     if ( $m =~ /^\d+$/ ) {
         if ( $b =~ /^and$/i ) {
             func_and();    
         }   else {
             print " not supported\n";
         }
     }   else {
         print " enter valid number of pins\n";
     }
}
sub func_and {
    my $bit;
    for ( my $i = 0 ; $i < $times ; $i++ ) {
        my $p = sprintf( "%0${m}b", $i );    
        print "$p\t";
        my @c = split( '', $p );             
        my $result = 3;                      
        foreach  $bit (@c) {
            if ( $result < 3 ) {
                $result = $result && $bit;    
            } else {
                $result = $bit;    
            }
        }
        print "result for AND operation on $bit is $result \n";
    }
}

如果我将输入设为perl AND.pl 2 and

我得到的错误是Use of uninitialized value in concatenation (.) or string at NAND.pl line 34。 有没有其他方法来声明$ bit变量?以及如何初始化这个? 感谢

2 个答案:

答案 0 :(得分:3)

变化:

print "result for AND operation on $bit is $result \n";

为:

print "result for AND operation on $p is $result \n";

然后,您可以将$bit本地化为foreach循环:

foreach my $bit (@c) {

perldoc perlsyn

  

foreach循环遍历正常列表值并设置   变量VAR依次是列表的每个元素。如果变量   之前是关键字my,然后它是词法范围的,并且是   因此仅在循环内可见。否则,变量是   隐含地循环本地并在退出时重新获得其原值   循环。   如果先前使用my声明了变量,则使用该变量   而不是全局的,但它仍然局限于循环。

$bit在循环之前未初始化,因此在循环之后它仍未改变。

答案 1 :(得分:0)

解决此问题的最糟糕方法是在声明时为$ bit分配一个值。

my $bit = 0; # no!!!

虽然这会解决错误消息,但却很难在代码中找到逻辑错误。警告消息“使用未初始化的值...”是您拥有的最重要的调试工具之一。如果您的代码产生了许多此类消息,则应将警告转为错误,以便程序在第一次警告时停止。

use warnings 'FATAL' => 'all';