Я не могу воспроизвести вашу ошибку. Однако в вашем коде много ошибок, поэтому позвольте мне их просмотреть, и, надеюсь, это поможет вам найти вашу реальную ошибку.
Во-первых, переменные должны быть определены в наименьшей возможной области видимости: если переменная используется только внутри функции, она должна быть определена внутри этой функции. Если переменная используется только в цикле for
, она должна быть определена в этом цикле. В этом духе вы должны удалить
my $i;
my $j;
в начале вашего кода. Также имейте в виду, что my
объявляет лексическую переменную, видимую только в текущей области (то есть , т.е. вы можете использовать ее только в текущем блоке). Например,
else {
my $X_branch=$X2;
my $Y_branch=$Y2;
my $Z_branch=$Z2;
}
объявляет 3 переменные, которые не существуют после блока else
.
Во-вторых, my
объявляет новую переменную и поэтому должна использоваться только один раз для каждой переменной. Если вы напишите
my $x = 5;
return my $x;
В первой строке будет объявлена переменная $x
и задано значение 5
. Вторая строка объявляет новую переменную $x
(таким образом, затеняя старую) со значением undef
и возвращает ее. Вместо этого вы хотите написать:
my $x = 5;
return $x;
Теперь позвольте мне пройтись по вашему коду, чтобы указать на несколько ошибок / улучшений:
[1114 ] должно быть $X_list[$j]
(согласно началу этого ответа).
Еще в find_branch
у вас есть проблема с областью действия определенных вами переменных (см. Начало моего ответа). У вас должно быть что-то вроде:
my ($X_branch, $Y_branch, $Z_branch);
if (abs($Z1-$Z2) < $rXY) {
$Z_branch=($Z1+$Z2-$rXY)/2;
my $a=($Z1-$Z_branch)/$rXY;
$X_branch=(1-$a)*$X1+$a*$X2;
$Y_branch=(1-$a)*$Y1+$a*$Y2;
}
elsif ($Z1 < $Z2) {
$X_branch=$X1;
$Y_branch=$Y1;
$Z_branch=$Z1;
}
else {
$X_branch=$X2;
$Y_branch=$Y2;
$Z_branch=$Z2;
}
return ($X_branch,$Y_branch,$Z_branch);
Эти два исправления должны заглушать каждое предупреждение. Тем не менее, я подозреваю, что в вашем коде есть и другие проблемы.
В find_min_dist
вы должны писать не my $I = $i
и my $J = $j
, а, скорее, $I = $i
и $J = $j
(все еще та же проблема с областями видимости).
Ваш подчиненный branch
ничего не делает: вы вычисляете некоторые $rho
, $theta
и $phi
, но вы не возвращаете их (и вы также не изменяете аргументы) . [+1169]
В Я не могу воспроизвести вашу ошибку. Однако в вашем коде много ошибок, поэтому позвольте мне их просмотреть, и, надеюсь, это поможет вам найти вашу реальную ошибку. Во-первых, переменные должны быть определены в наименьшей возможной области видимости: если переменная используется только внутри функции, она должна быть определена внутри этой функции. Если переменная используется только в цикле [116], она должна быть определена в этом цикле. В этом духе вы должны удалить в начале вашего кода. Также имейте в виду, что [117] объявляет лексическую переменную, видимую только в текущей области (то есть , т.е. вы можете использовать ее только в текущем блоке). Например, объявляет 3 переменные, которые не существуют после блока [118]. Во-вторых, [119] объявляет новую переменную и поэтому должна использоваться только один раз для каждой переменной. Если вы напишите В первой строке будет объявлена переменная [1110] и задано значение [1111]. Вторая строка объявляет новую переменную [1112] (таким образом, затеняя старую) со значением [1113] и возвращает ее. Вместо этого вы хотите написать: Теперь позвольте мне пройтись по вашему коду, чтобы указать на несколько ошибок / улучшений: [1114 ] должно быть [1115] (согласно началу этого ответа). Еще в [1116] у вас есть проблема с областью действия определенных вами переменных (см. Начало моего ответа). У вас должно быть что-то вроде: Эти два исправления должны заглушать каждое предупреждение. Тем не менее, я подозреваю, что в вашем коде есть и другие проблемы. В [1117] вы должны писать не [1118] и [1119], а, скорее, [1120] и [1121] (все еще та же проблема с областями видимости). Ваш подчиненный [1122] ничего не делает: вы вычисляете некоторые [1123], [1124] и [1125], но вы не возвращаете их (и вы также не изменяете аргументы) . [+1169] В [1126], [1127], [1128], [1129], [1130] все они должны быть локально объявлены с [1131]. Кроме того, вы можете инициализировать [1132] с помощью [1133] (то же самое для Вы должны поместить свой код в функции или блоки кода ( Не используйте Кроме того, просто для ясности, в вашем подпункте Я довольно убежден, что есть другие проблемы с вашим кодом. Пожалуйста, расскажите нам, что вы пытаетесь сделать и что должна делать каждая функция, если вам нужна дополнительная помощь. Я не могу воспроизвести вашу ошибку. Однако в вашем коде много ошибок, поэтому позвольте мне их просмотреть, и, надеюсь, это поможет вам найти вашу реальную ошибку. Во-первых, переменные должны быть определены в наименьшей возможной области видимости: если переменная используется только внутри функции, она должна быть определена внутри этой функции. Если переменная используется только в цикле [116], она должна быть определена в этом цикле. В этом духе вы должны удалить в начале вашего кода. Также имейте в виду, что [117] объявляет лексическую переменную, видимую только в текущей области (то есть , т.е. вы можете использовать ее только в текущем блоке). Например, объявляет 3 переменные, которые не существуют после блока [118]. Во-вторых, [119] объявляет новую переменную и поэтому должна использоваться только один раз для каждой переменной. Если вы напишите В первой строке будет объявлена переменная [1110] и задано значение [1111]. Вторая строка объявляет новую переменную [1112] (таким образом, затеняя старую) со значением [1113] и возвращает ее. Вместо этого вы хотите написать: Теперь позвольте мне пройтись по вашему коду, чтобы указать на несколько ошибок / улучшений: [1114 ] должно быть [1115] (согласно началу этого ответа). Еще в [1116] у вас есть проблема с областью действия определенных вами переменных (см. Начало моего ответа). У вас должно быть что-то вроде: Эти два исправления должны заглушать каждое предупреждение. Тем не менее, я подозреваю, что в вашем коде есть и другие проблемы. В [1117] вы должны писать не [1118] и [1119], а, скорее, [1120] и [1121] (все еще та же проблема с областями видимости). Ваш подчиненный [1122] ничего не делает: вы вычисляете некоторые [1123], [1124] и [1125], но вы не возвращаете их (и вы также не изменяете аргументы) . [+1169] В [1126], [1127], [1128], [1129], [1130] все они должны быть локально объявлены с [1131]. Кроме того, вы можете инициализировать [1132] с помощью [1133] (то же самое для Вы должны поместить свой код в функции или блоки кода ( Не используйте Кроме того, просто для ясности, в вашем подпункте Я довольно убежден, что есть другие проблемы с вашим кодом. Пожалуйста, расскажите нам, что вы пытаетесь сделать и что должна делать каждая функция, если вам нужна дополнительная помощь. Я не могу воспроизвести вашу ошибку. Однако в вашем коде много ошибок, поэтому позвольте мне их просмотреть, и, надеюсь, это поможет вам найти вашу реальную ошибку. Во-первых, переменные должны быть определены в наименьшей возможной области видимости: если переменная используется только внутри функции, она должна быть определена внутри этой функции. Если переменная используется только в цикле [116], она должна быть определена в этом цикле. В этом духе вы должны удалить в начале вашего кода. Также имейте в виду, что [117] объявляет лексическую переменную, видимую только в текущей области (то есть , т.е. вы можете использовать ее только в текущем блоке). Например, объявляет 3 переменные, которые не существуют после блока [118]. Во-вторых, [119] объявляет новую переменную и поэтому должна использоваться только один раз для каждой переменной. Если вы напишите В первой строке будет объявлена переменная [1110] и задано значение [1111]. Вторая строка объявляет новую переменную [1112] (таким образом, затеняя старую) со значением [1113] и возвращает ее. Вместо этого вы хотите написать: Теперь позвольте мне пройтись по вашему коду, чтобы указать на несколько ошибок / улучшений: [1114 ] должно быть [1115] (согласно началу этого ответа). Еще в [1116] у вас есть проблема с областью действия определенных вами переменных (см. Начало моего ответа). У вас должно быть что-то вроде: Эти два исправления должны заглушать каждое предупреждение. Тем не менее, я подозреваю, что в вашем коде есть и другие проблемы. В [1117] вы должны писать не [1118] и [1119], а, скорее, [1120] и [1121] (все еще та же проблема с областями видимости). Ваш подчиненный [1122] ничего не делает: вы вычисляете некоторые [1123], [1124] и [1125], но вы не возвращаете их (и вы также не изменяете аргументы) . [+1169] В [1126], [1127], [1128], [1129], [1130] все они должны быть локально объявлены с [1131]. Кроме того, вы можете инициализировать [1132] с помощью [1133] (то же самое для Вы должны поместить свой код в функции или блоки кода ( Не используйте Кроме того, просто для ясности, в вашем подпункте Я довольно убежден, что есть другие проблемы с вашим кодом. Пожалуйста, расскажите нам, что вы пытаетесь сделать и что должна делать каждая функция, если вам нужна дополнительная помощь. generate_pillars_shape
, @X_values
, @Y_values
, @X
, @Y
все они должны быть локально объявлены с my
. Кроме того, вы можете инициализировать @X_values
с помощью @X_values = grep {
(то же самое для @Y_values
), что я считаю более читабельным, чем то, что вы написали. { ... }
), чтобы использовать правильную область видимости: хотя может иметь смысл иметь $min_X
, $max_X
, $min_Y
, $max_Y
и $distance
как глобальные переменные, вы определенно не хотите, чтобы $min_radian
или $b
определялись везде в вашем файле. $a
или $b
(это специальные переменные, используемые sort
; вы не хотите связываться с ними (см., Например, этот вопрос ) )). [1 172] find_branch
вы можете быть немного более компактными, чтобы получить аргументы: my ($X1, $Y1, $Z1, $X2, $Y2, $Z2) = @_;
@Y_values
), что я считаю более читабельным, чем то, что вы написали. { ... }
), чтобы использовать правильную область видимости: хотя может иметь смысл иметь $min_X
, $max_X
, $min_Y
, $max_Y
и $distance
как глобальные переменные, вы определенно не хотите, чтобы $min_radian
или $b
определялись везде в вашем файле. $a
или $b
(это специальные переменные, используемые sort
; вы не хотите связываться с ними (см., Например, этот вопрос ) )). [1 172] find_branch
вы можете быть немного более компактными, чтобы получить аргументы: @Y_values
), что я считаю более читабельным, чем то, что вы написали. { ... }
), чтобы использовать правильную область видимости: хотя может иметь смысл иметь $min_X
, $max_X
, $min_Y
, $max_Y
и $distance
как глобальные переменные, вы определенно не хотите, чтобы $min_radian
или $b
определялись везде в вашем файле. $a
или $b
(это специальные переменные, используемые sort
; вы не хотите связываться с ними (см., Например, этот вопрос ) )). [1 172] find_branch
вы можете быть немного более компактными, чтобы получить аргументы: @Y_values
), что я считаю более читабельным, чем то, что вы написали.
Вы должны поместить свой код в функции или блоки кода ({ ... }
), чтобы использовать правильную область видимости: хотя может иметь смысл иметь $min_X
, $max_X
, $min_Y
, $max_Y
и $distance
как глобальные переменные, вы определенно не хотите, чтобы $min_radian
или $b
определялись везде в вашем файле.
Не используйте $a
или $b
(это специальные переменные, используемые sort
; вы не хотите связываться с ними (см., Например, этот вопрос ) )). [1 172]
Кроме того, просто для ясности, в вашем подпункте find_branch
вы можете быть немного более компактными, чтобы получить аргументы:
Я довольно убежден, что есть другие проблемы с вашим кодом. Пожалуйста, расскажите нам, что вы пытаетесь сделать и что должна делать каждая функция, если вам нужна дополнительная помощь.
MySQL (и впоследствии SQLite) также поддерживает ЗАМЕНУ В синтаксис:
REPLACE INTO my_table (pk_id, col1) VALUES (5, '123');
Это автоматически определяет первичный ключ и находит, что строка соответствия обновляет, вставляя новую, если ни один не найден.
Поддержки SQLite, заменяющие строку, если это уже существует:
INSERT OR REPLACE INTO [...blah...]
Можно сократить это к
REPLACE INTO [...blah...]
Этот ярлык был добавлен, чтобы быть совместимым с MySQL REPLACE INTO
выражение.
Я сделал бы что-то как следующее:
INSERT INTO cache VALUES (key, generation)
ON DUPLICATE KEY UPDATE (key = key, generation = generation + 1);
Устанавливание значения поколения к 0 в коде или в sql, но использовании НА DUP... для постепенного увеличения значения. Я думаю, что это - синтаксис так или иначе.
Я не знаю, что Вы собираетесь найти независимое от платформы решение.
Это обычно называют "UPSERT".
Посмотрите некоторые связанные обсуждения:
НА ДУБЛИРУЮЩЕМСЯ пункте ОБНОВЛЕНИЯ КЛЮЧА лучшее решение потому что: ЗАМЕНА делает УДАЛЕНИЕ, сопровождаемое ВСТАВКОЙ так в течение очень небольшого периода, запись удалена, создав очень небольшую возможность, что запрос мог возвратиться пропускавший это, если бы страница была просмотрена во время запроса ЗАМЕНЫ.
Я предпочитаю, ВСТАВЛЯЮТ... НА ДУБЛИРУЮЩЕМСЯ ОБНОВЛЕНИИ... по этой причине.
решение jmoz является лучшим: хотя я предпочитаю синтаксис НАБОРА круглым скобкам
INSERT INTO cache
SET key = 'key', generation = 'generation'
ON DUPLICATE KEY
UPDATE key = 'key', generation = (generation + 1)
;
В PostgreSQL нет никакой команды слияния и на самом деле записи, что это не тривиально - существуют на самом деле странные пограничные случаи, которые делают задачу "интересной".
Лучшее (как в: работа в самых возможных условиях) подход, должен использовать функцию - такой как один показанный в руководстве (merge_db).
Если Вы не хотите использовать функцию, можно обычно сходить с рук:
updated = db.execute(UPDATE ... RETURNING 1)
if (!updated)
db.execute(INSERT...)
Просто помните, что это не доказательство отказа, и это перестанет работать в конечном счете.
Стандартный SQL обеспечивает оператор MERGE для этой задачи. Не вся поддержка DBMS оператор MERGE.
Если у Вас нет распространенного способа атомарно обновить или вставить (например, через транзакцию) затем Вы можете нейтрализация к другой схеме блокировки. 0-байтовый файл, системное взаимное исключение, именованный канал, и т.д...
Вы могли использовать триггер вставки? Если это перестало работать, сделайте обновление.