【发布时间】:2021-06-20 13:58:53
【问题描述】:
我有一段遗留的 perl 代码,它使用 perl DBI 和类似的结构
$db->bind_param(1, $some_blob, {TYPE => SQL_BLOB});
其中 SQL_BLOB 是一个裸词。我想在同一个文件中使用严格的编译指示,但它会抱怨裸词。 ('在使用“strict subs”时不允许使用裸词“SQL_BLOB”')我能以某种方式免除这一行的严格检查吗?
【问题讨论】:
我有一段遗留的 perl 代码,它使用 perl DBI 和类似的结构
$db->bind_param(1, $some_blob, {TYPE => SQL_BLOB});
其中 SQL_BLOB 是一个裸词。我想在同一个文件中使用严格的编译指示,但它会抱怨裸词。 ('在使用“strict subs”时不允许使用裸词“SQL_BLOB”')我能以某种方式免除这一行的严格检查吗?
【问题讨论】:
strict pragma 是词法
此编译指示的效果仅限于当前文件或范围块。
也可以在范围内关闭。所以
use strict;
...
{
no strict 'subs';
$db->bind_param(1, $some_blob, {TYPE => SQL_BLOB});
}
# strict is back on
编辑
但是,上面只容忍裸词,而bind_param 仍然不知道那是什么(整数常量)。这是通过import-ing 这样的常量解决的,通过使用:sql_types import tag;见DBI Constants。无论如何,这是满足strict 的一种更好的方法。
感谢 Andy Lester 提出这个问题,请参阅他们的 answer
【讨论】:
$db->bind_param(1, $some_blob, {TYPE => "SQL_BLOB"}); 比关闭严格要好。 (当然,正如你提到的,这实际上并不正确。)
虽然您确实可以关闭strict pragma,但这并不能解决您的问题。您只需将值“SQL_BLOB”作为类型传递,但bind_param 不会识别它。
你需要添加一个导入:
use DBI qw(:sql_types);
如果您已经useing DBI,则将:sql_types 添加到您从中导入的内容中。
【讨论】: