【问题标题】:Devel::Peek output results in STDERRDevel::Peek 在 STDERR 中输出结果
【发布时间】:2021-05-11 08:53:45
【问题描述】:

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

open (STDERR, ">>/home/chambres/web/foo.org/public_html/cgi-bin/links/admin/stripe-booking.log") || die $!;

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

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

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

编码后的名称:

我知道$add_common->{name} 有一个值,所以我有点困惑为什么它没有出现。我正在尝试查看运行实时脚本的人的一些调试输出。

【问题讨论】:

  • 无法复制。顺便说一句——显示的代码有“... before ...”,但显示的输出有“... AFTER ...”——发布错误?或不?你能发布一个完整的(简短的)程序来演示这个吗?

标签: perl stderr


【解决方案1】:

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

【讨论】:

  • 谢谢 - 这让我大吃一惊 =) 我认为你是对的,但 STDERR 的输出有些混乱。如果我删除了我的自定义 STDERR 文件处理程序(转到我的自定义文件),然后有:print STDERR "FOO\n"; use Devel::Peek; Dump("foo"); ... 那么在普通的 Apache 日志文件中什么都不会打印到 STDERR。我会做一些挖掘工作。谢谢!
  • 天哪,我觉得自己像个白痴……它工作正常,但我没有重新启动 mod_perl !!!!!!现在我重新启动了 mod_perl,它按预期工作。我想今天是那种“我应该再喝一杯咖啡”的日子! ;)
  • 嗯,还是不行。它似乎是,现在它不再显示在日志中。从字面上看,我想做的就是转储字符串的值(以检查 utf8 标志、字符代码等)。是否有一个模块可以做到这一点,并将其存储到一个变量中,以便我自己转储它?
  • 添加回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 2020-08-30
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多