Devel::Peek 以 STDERR 格式输出结果
Devel::Peek output results in STDERR
我正在尝试找出为什么我从 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});
我在日志文件中得到的是:
name AFTER encoded:
我知道 $add_common->{name}
有一个值,所以我有点困惑为什么它没有出现。我正在尝试查看某人 运行 实时脚本的一些调试输出。
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
标志),则 returns 为真。
如果字符串使用“降级”存储格式(SVf_UTF8
标志已清除),则 returns 为真。据推测,如果标量不包含字符串,它也会 returns false。
但你几乎可以保证做错了什么。如果您正在尝试解决 XS 模块中的错误,您只需要 utf8::upgrade
and/or utf8::downgrade
.
我正在尝试找出为什么我从 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});
我在日志文件中得到的是:
name AFTER encoded:
我知道 $add_common->{name}
有一个值,所以我有点困惑为什么它没有出现。我正在尝试查看某人 运行 实时脚本的一些调试输出。
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
标志),则 returns 为真。
如果字符串使用“降级”存储格式(SVf_UTF8
标志已清除),则 returns 为真。据推测,如果标量不包含字符串,它也会 returns false。
但你几乎可以保证做错了什么。如果您正在尝试解决 XS 模块中的错误,您只需要 utf8::upgrade
and/or utf8::downgrade
.