【问题标题】:exempting a piece of perl code from strict pragma从严格的编译指示中免除一段 perl 代码
【发布时间】: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 dbi strict bareword


    【解决方案1】:

    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

    【讨论】:

    • 虽然这确实会停止警告,但该程序将无法运行。请参阅下面的答案。
    • @AndyLester 谢谢,我不知道类型常量。添加注释
    • 使用$db->bind_param(1, $some_blob, {TYPE => "SQL_BLOB"}); 比关闭严格要好。 (当然,正如你提到的,这实际上并不正确。)
    • @ikegami 对。我认为他们无法触及该代码(可能有很多、复杂等)
    • 谢谢大家,这真的很有帮助。
    【解决方案2】:

    虽然您确实可以关闭strict pragma,但这并不能解决您的问题。您只需将值“SQL_BLOB”作为类型传递,但bind_param 不会识别它。

    你需要添加一个导入:

    use DBI qw(:sql_types);
    

    如果您已经useing DBI,则将:sql_types 添加到您从中导入的内容中。

    【讨论】:

      猜你喜欢
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      相关资源
      最近更新 更多