Perl / DBI selectrow_array范围混淆

问题描述 投票:-1回答:2

所以,我有一个文件列表,正在检查数据库表以查看条目是否存在,并提取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调用分配变量。我尝试将以上变量从上述更改为我们的变量。我对为什么要这样做感到困惑。

还要注意,这段代码在另一个块中,因此这些变量已经在该范围内是词法。我以为它们可以在子块中使用,但是据我所知,它实际上并不是那样工作的。

perl dbi
2个回答
0
投票

[发现问题,一些代码使一个词法变量具有相同的名称,但我没有注意到,因此将父$ destFilename替换为局部变量。


0
投票

您发布的代码没有表现出您描述的行为。

$ 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;
© www.soinside.com 2019 - 2024. All rights reserved.