Perl / DBI selectrow_array путаница с областью - PullRequest
0 голосов
/ 05 февраля 2020

Итак, у меня есть список файлов, и я проверяю таблицу базы данных, чтобы увидеть, существует ли запись, и вытащить идентификатор и имя файла назначения. Если нет, вставьте запись и повторите запись (обратите внимание, что идентификатор - это автоинкремент, поэтому независимо от того, нужно ли мне делать второй запрос).

Проблема заключается в том, что я повторяю запрос после вставки, переменная, в которую он входит, является лексической (я думаю, что это правильная формулировка), и как только я покидаю область действия блока if (!определенный), он теряет свое значение.

#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. Я попытался изменить выше с моего на наш для этих переменных. Я запутался в том, почему он это делает.

Также отметим, что этот код находится в другом блоке, поэтому эти переменные уже лексичны этой области. Я предполагал, что они будут доступны в дочерних блоках, но, насколько я вижу, это не совсем так.

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Код, который вы опубликовали, не демонстрирует описанного вами поведения.

$ 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;
0 голосов
/ 05 февраля 2020

Обнаружил проблему, часть кода создавала лексическую переменную с тем же именем, и я не заметил, поэтому родительский $ destFilename был заменен на локальный вариант.

...