我是第一次发布此内容。我在论坛中遇到过类似的问题,但我仍然无法确定为什么会收到此错误。
以下是我想要制作的示例代码..
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变量?以及如何初始化这个?
感谢
答案 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) {
foreach循环遍历正常列表值并设置 变量VAR依次是列表的每个元素。如果变量 之前是关键字my,然后它是词法范围的,并且是 因此仅在循环内可见。否则,变量是 隐含地循环本地并在退出时重新获得其原值 循环。 如果先前使用my声明了变量,则使用该变量 而不是全局的,但它仍然局限于循环。
$bit
在循环之前未初始化,因此在循环之后它仍未改变。
答案 1 :(得分:0)
解决此问题的最糟糕方法是在声明时为$ bit分配一个值。
my $bit = 0; # no!!!
虽然这会解决错误消息,但却很难在代码中找到逻辑错误。警告消息“使用未初始化的值...”是您拥有的最重要的调试工具之一。如果您的代码产生了许多此类消息,则应将警告转为错误,以便程序在第一次警告时停止。
use warnings 'FATAL' => 'all';