Итак, у меня есть список файлов, и я проверяю таблицу базы данных, чтобы увидеть, существует ли запись, и вытащить идентификатор и имя файла назначения. Если нет, вставьте запись и повторите запись (обратите внимание, что идентификатор - это автоинкремент, поэтому независимо от того, нужно ли мне делать второй запрос).
Проблема заключается в том, что я повторяю запрос после вставки, переменная, в которую он входит, является лексической (я думаю, что это правильная формулировка), и как только я покидаю область действия блока 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. Я попытался изменить выше с моего на наш для этих переменных. Я запутался в том, почему он это делает.
Также отметим, что этот код находится в другом блоке, поэтому эти переменные уже лексичны этой области. Я предполагал, что они будут доступны в дочерних блоках, но, насколько я вижу, это не совсем так.