Perl 如何在保留API的同时不推荐行为?

Perl 如何在保留API的同时不推荐行为?,perl,Perl,我有一个API,我想改变它的行为。我最初提出的方法是“成功”,意思是“绿灯”,但“红灯”并不例外,它仍然意味着灯工作正常。现在,我希望is_success仅在出现建议时为false,并在我的API中添加了is_green和is_red(注意:还有状态“yellow”和“purple”),以补充特定的检查(目前黄色和紫色抛出异常,但稍后可能会得到状态检查) 有没有什么好方法可以从代码中发出行为正在更改的警告?还是改变了?如果用户知道,允许关闭这些警告?(注意:您已经在更改日志中添加了弃用通知)是的

我有一个API,我想改变它的行为。我最初提出的方法是“成功”,意思是“绿灯”,但“红灯”并不例外,它仍然意味着灯工作正常。现在,我希望
is_success
仅在出现建议时为false,并在我的API中添加了
is_green
is_red
(注意:还有状态“yellow”和“purple”),以补充特定的检查(目前黄色和紫色抛出异常,但稍后可能会得到状态检查)


有没有什么好方法可以从代码中发出行为正在更改的警告?还是改变了?如果用户知道,允许关闭这些警告?(注意:您已经在更改日志中添加了弃用通知)

是的,您可以使用warn命令。它将显示警告,但也可以通过为$SIG{'WARN'}指定一个空子项来捕获警告,这将阻止显示的消息

# warnings are thrown out with this BEGIN block in your code.
BEGIN {
  $SIG{'__WARN__'} = sub {  }
}

# prints the warning to STDOUT, if $SIG{'__WARN__'} is set to the default
warn "uh oh, this is deprecated!";

有关更多信息和其他示例,请参见perdocs。是的,您可以使用warn命令。它将显示警告,但也可以通过为$SIG{'WARN'}指定一个空子项来捕获警告,这将阻止显示的消息

# warnings are thrown out with this BEGIN block in your code.
BEGIN {
  $SIG{'__WARN__'} = sub {  }
}

# prints the warning to STDOUT, if $SIG{'__WARN__'} is set to the default
warn "uh oh, this is deprecated!";

有关更多信息和其他示例,请参阅perdocs。

我一直认为该方法非常有用且有趣

此方法已被弃用。有关完整原因,请参阅MIME::Parser中的“decode_headers”。如果您绝对必须使用它,并且不喜欢警告,请提供一个强制:

“我需要解决这个问题” 闭嘴,去做吧。不推荐。 仅为那些需要保持旧脚本正常运行的用户提供

“我知道我在做什么” 闭嘴,去做吧。不推荐。 提供给那些真正知道自己在做什么的人


我们的想法是,只有通过提供一个神奇的参数来记录为什么要取消警告,才能取消弃用警告。

我一直认为,用户使用的方法既有用又有趣

此方法已被弃用。有关完整原因,请参阅MIME::Parser中的“decode_headers”。如果您绝对必须使用它,并且不喜欢警告,请提供一个强制:

“我需要解决这个问题” 闭嘴,去做吧。不推荐。 仅为那些需要保持旧脚本正常运行的用户提供

“我知道我在做什么” 闭嘴,去做吧。不推荐。 提供给那些真正知道自己在做什么的人


其思想是,只有通过提供一个神奇的参数来记录为什么要抑制警告,才能抑制不推荐警告。

您可以使用Perl的词汇警告类别。存在已弃用的
类别,或者您可以将包/模块注册为警告类别

{
    package My::Foo;
    use warnings;

    sub method {
        (@_ <= 2) or warnings::warnif('deprecated', 'invoking ->method with ... ')
    }
}

{
    package My::Bar;
    use warnings;
    use warnings::register;

    sub method {
        (@_ <= 2) or warnings::warnif('invoking ->method with ... ')
    }
}

{
    use warnings;
    My::Foo->method(1);
    My::Foo->method(1, 2);
    My::Bar->method(1, 2);
}

{
    no warnings 'deprecated';
    My::Foo->method(1, 2);
    no warnings 'My::Bar';
    My::Bar->method(1, 2);
}
{
包My::Foo;
使用警告;
子方法{
(@方法(1);
My::Foo->method(1,2);
My::Bar->method(1,2);
}
{
没有“不推荐”的警告;
My::Foo->method(1,2);
“我的::酒吧”没有警告;
My::Bar->method(1,2);
}

请参阅和

您可以使用Perl的词汇警告类别。有一个
已弃用的
类别,或者您可以将包/模块注册为警告类别

{
    package My::Foo;
    use warnings;

    sub method {
        (@_ <= 2) or warnings::warnif('deprecated', 'invoking ->method with ... ')
    }
}

{
    package My::Bar;
    use warnings;
    use warnings::register;

    sub method {
        (@_ <= 2) or warnings::warnif('invoking ->method with ... ')
    }
}

{
    use warnings;
    My::Foo->method(1);
    My::Foo->method(1, 2);
    My::Bar->method(1, 2);
}

{
    no warnings 'deprecated';
    My::Foo->method(1, 2);
    no warnings 'My::Bar';
    My::Bar->method(1, 2);
}
{
包My::Foo;
使用警告;
子方法{
(@方法(1);
My::Foo->method(1,2);
My::Bar->method(1,2);
}
{
没有“不推荐”的警告;
My::Foo->method(1,2);
“我的::酒吧”没有警告;
My::Bar->method(1,2);
}

看到和

奇怪的是,我没有想到警告可以被禁用……我一直在使用
carp
进行其他的弃用。这一次只是不同,因为我不打算删除API,我计划以一种可能不被注意的方式更改行为。
$SIG{uu\uu WARN\uu}
处理程序功能强大,但很容易被滥用。这将抑制所有警告,即使是那些重要的和与弃用无关的警告。它也可能会被破坏,或者被另一个对
$SIG{'''uu WARN}的更改破坏
handler。奇怪的是,我没有想到警告可以被禁用……我一直在使用
carp
进行其他的弃用。这一次只是不同,因为我不打算删除API,我计划以一种可能不被注意的方式更改行为。
$SIG{uu\uu WARN\uu}
处理程序功能强大,但很容易被滥用。这将抑制所有警告,即使是那些重要的和与弃用无关的警告。它也可能会被破坏,或者被另一个对
$SIG{'''uu WARN}
处理程序的更改所破坏。