所以,我有一个文件列表,正在检查数据库表以查看条目是否存在,并提取ID和目标文件名。如果不存在,请插入一个条目并重新输入该条目(请注意,id是自动递增的,因此无论我是否要进行第二次查询。)
问题是,当我在插入后重新拉查询时,它要输入的变量是词法(我认为这是正确的措词),一旦离开了if(!defined)块的范围,它就会失去其值。
#lookup file db entry
my ($fileId, $destFilename) = $dbh->selectrow_array("select fileId, destFilename from myTable where sourceFilename = '$file'");
if (! defined $fileId) {
# calculate out what the destination filename should be here..
# add missing entry into table
($fileId, $destFilename) = $dbh->selectrow_array("select fileId, destFilename from myTable where sourceFilename = '$file'");
print Dumper $destFilename;
}
print Dumper $destFilename;
这将导致:
$VAR1 = "correctfilenamehere"
$VAR1 = undef
我尝试过定义变量,然后再通过selectrow_array调用分配变量。我尝试将以上变量从上述更改为我们的变量。我对为什么要这样做感到困惑。
还要注意,这段代码在另一个块中,因此这些变量已经在该范围内是词法。我以为它们可以在子块中使用,但是据我所知,它实际上并不是那样工作的。
[发现问题,一些代码使一个词法变量具有相同的名称,但我没有注意到,因此将父$ destFilename替换为局部变量。
您发布的代码没有表现出您描述的行为。
$ perl -e'
use strict;
use warnings;
use Data::Dumper qw( Dumper );
sub f { $_[0] ? (4, "abc") : () }
my ($fileId, $destFilename) = f(0);
if (!defined $fileId) {
($fileId, $destFilename) = f(1);
print Dumper $destFilename;
}
print Dumper $destFilename;
'
$VAR1 = 'abc';
$VAR1 = 'abc';
如果您引入了一个具有相同名称的新变量,则可以得到描述的行为。
$ perl -e'
use strict;
use warnings;
use Data::Dumper qw( Dumper );
sub f { $_[0] ? (4, "abc") : () }
my ($fileId, $destFilename) = f(0);
if (!defined $fileId) {
my ($fileId, $destFilename) = f(1);
print Dumper $destFilename;
}
print Dumper $destFilename;
'
$VAR1 = 'abc';
$VAR1 = undef;