微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Devel::Peek 输出结果为 STDERR

如何解决Devel::Peek 输出结果为 STDERR

我正在尝试弄清楚为什么我的 Devel::Peek::Dump 调试没有显示在我的日志文件中。我这样做只是为了传递 STDERR 输出

use Devel::Peek;
print STDERR "name AFTER encoded: \n";
Dump($add_common->{name});

...然后在我的脚本中:

$add_common->{name}

我在日志文件中得到的只是:

编码后的名称

我知道 minikube start --extra-config=controller-mananger.foo=bar 一个值,所以我对它为什么没有显示有点困惑。我正在尝试查看运行实时脚本的人的一些调试输出

解决方法

Dump 写入 fd 2。STDERR 最初包装 fd 2,所以一定是某些东西改变了 STDERR 以获得您观察到的行为。

如您所见,当 STDERR 与 fd 2 关联时,重定向 STDERR 工作正常:

$ perl -M5.010 -e'
   use Devel::Peek qw( Dump );
   open STDERR,">>","a" or die $!;
   say fileno(STDERR);
   Dump(undef);
'
2

$ cat a
SV = NULL(0x0) at 0x55d63aab13b0
  REFCNT = 2147483637
  FLAGS = (READONLY,PROTECT)

当 STDERR 与 fd 3 相关联时没有那么多:

$ perl -M5.010 -e'
   use Devel::Peek qw( Dump );
   local *STDERR;
   open STDERR,"b" or die $!;
   say fileno(STDERR);
   Dump(undef);
'
3
SV = NULL(0x0) at 0x56050b00b3b0
  REFCNT = 2147483637
  FLAGS = (READONLY,PROTECT)

$ cat b

你可以为 fd 2 创建一个句柄,然后重定向它。

$ perl -M5.010 -e'
   use Devel::Peek qw( Dump );
   open(my $fd2,">&=",2) or die $!;
   say fileno($fd2);
   open $fd2,"c" or die $!;
   say fileno($fd2);
   Dump(undef);
'
2
2

$ cat c
SV = NULL(0x0) at 0x5582af5dc3b0
  REFCNT = 2147483637
  FLAGS = (READONLY,PROTECT)

由于更改了进程的 fd 2,上述解决方法将在 mod_perl 设置中影响 Apache。

听起来您主要对字符串使用的内部存储格式感兴趣。如果是这样,您可以使用

utf8::is_utf8($s)

如果字符串使用“升级”存储格式(设置了 SVf_UTF8 标志),则返回 true。

如果字符串使用“降级”存储格式(SVf_UTF8 标志已清除),则返回 true。据推测,如果标量不包含字符串,它也会返回 false。

但你几乎可以肯定做错了什么。如果您正在尝试解决 XS 模块中的错误,您只需要 utf8::upgrade 和/或 utf8::downgrade

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。