Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl Devel::STDERR中的Peek输出结果_Perl_Stderr - Fatal编程技术网

Perl Devel::STDERR中的Peek输出结果

Perl Devel::STDERR中的Peek输出结果,perl,stderr,Perl,Stderr,我正在试图找出为什么我的日志文件中没有显示来自Devel::Peek::Dump的调试。我这样做只是为了传递STDERR输出: …然后在我的脚本中: use Devel::Peek; print STDERR "name AFTER encoded: \n"; Dump($add_common->{name}); 我在日志文件中得到的是: 编码后的名称: 我知道$add_common->{name}有一个值,所以我有点困惑为什么它没有出现。我试图查看运行实时脚本的人的

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

…然后在我的脚本中:

use Devel::Peek;
print STDERR "name AFTER encoded: \n";
Dump($add_common->{name});
我在日志文件中得到的是:

编码后的名称:


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

Dump
写入FD2
STDERR
最初包装fd 2,因此一定有什么东西改变了STDERR以获得您观察到的行为

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

$perl-M5.010-e'
使用Devel::Peek qw(转储);
打开STDERR、“>>”、“a”或die$!;
说文件号(STDERR);
转储(未定义);
'
2.
$cat a
SV=0x55d63aab13b0处的NULL(0x0)
REFCNT=2147483637
标志=(只读,保护)
当STDERR与fd 3关联时,没有太多:

$perl-M5.010-e'
使用Devel::Peek qw(转储);
本地*标准;
打开STDERR、“>>”、“b”或die$!;
说文件号(STDERR);
转储(未定义);
'
3.
SV=0x56050b00b3b0处的NULL(0x0)
REFCNT=2147483637
标志=(只读,保护)
$b类
您可以为fd2创建一个句柄,并重定向它

$perl-M5.010-e'
使用Devel::Peek qw(转储);
打开(我的$fd2,“>&=”,2)或死亡$!;
说不(2美元);
打开$fd2、“>>”、“c”或骰子$!;
说不(2美元);
转储(未定义);
'
2.
2.
$c类
SV=0x5582af5dc3b0处的NULL(0x0)
REFCNT=2147483637
标志=(只读,保护)

因为这改变了进程的fd2,所以上述解决方法将在mod_perl设置中影响整个Apache

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

utf8::is\u utf8($s)
如果字符串使用“升级”存储格式(设置了
SVf\u UTF8
标志),则返回true

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


但你几乎可以保证你做错了什么。如果您试图解决XS模块中的一个bug,那么您所需要的就是
utf8::upgrade
和/或
utf8::grade

Dump
写入fd 2
STDERR
最初包装fd 2,因此一定有什么东西改变了STDERR以获得您观察到的行为

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

$perl-M5.010-e'
使用Devel::Peek qw(转储);
打开STDERR、“>>”、“a”或die$!;
说文件号(STDERR);
转储(未定义);
'
2.
$cat a
SV=0x55d63aab13b0处的NULL(0x0)
REFCNT=2147483637
标志=(只读,保护)
当STDERR与fd 3关联时,没有太多:

$perl-M5.010-e'
使用Devel::Peek qw(转储);
本地*标准;
打开STDERR、“>>”、“b”或die$!;
说文件号(STDERR);
转储(未定义);
'
3.
SV=0x56050b00b3b0处的NULL(0x0)
REFCNT=2147483637
标志=(只读,保护)
$b类
您可以为fd2创建一个句柄,并重定向它

$perl-M5.010-e'
使用Devel::Peek qw(转储);
打开(我的$fd2,“>&=”,2)或死亡$!;
说不(2美元);
打开$fd2、“>>”、“c”或骰子$!;
说不(2美元);
转储(未定义);
'
2.
2.
$c类
SV=0x5582af5dc3b0处的NULL(0x0)
REFCNT=2147483637
标志=(只读,保护)

因为这改变了进程的fd2,所以上述解决方法将在mod_perl设置中影响整个Apache

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

utf8::is\u utf8($s)
如果字符串使用“升级”存储格式(设置了
SVf\u UTF8
标志),则返回true

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


但你几乎可以保证你做错了什么。如果您试图解决XS模块中的一个bug,那么您所需要的只是
utf8::upgrade
和/或
utf8::Degrade

无法复制。顺便说一句——显示的代码有“…before…”,但显示的输出有“…AFTER…”——发布中的错误?还是不?你能发布一个完整的(简短的)演示程序吗?不能复制。顺便说一句——显示的代码有“…before…”,但显示的输出有“…AFTER…”——发布中的错误?还是不?你能发布一个完整的(简短的)程序来演示这个吗?谢谢-我想你是对的,STDERR的输出出了问题。如果我删除我的自定义STDERR文件处理程序(转到我的自定义文件),然后有:
print STDERR“FOO\n”;使用Devel::Peek;垃圾场(“foo”)。。。然后,在正常的Apache日志文件中,没有任何内容被打印到STDERR。我要挖一些。谢谢天哪,我觉得自己像个白痴。。。它正在工作,但我没有重新启动mod_perl!!!!!现在,我重新启动了mod_perl,它按预期工作。我想是今天那种“我应该再喝一杯咖啡”的日子吧嗯,还是不行。它似乎是,现在它不再显示在日志中了。实际上,我只想转储字符串的值(检查utf8标志、字符代码等)。有没有一个模块可以做到这一点,然后将它存储到一个变量中,这样我就可以自己转储它了?添加到回答中。谢谢-这正好超出了我的理解=)不过我想你是对的,STDERR的输出出了问题。如果我删除我的自定义STDERR文件处理程序(转到我的自定义文件),然后有:
print STDERR“FOO\n”;使用Devel::Peek;垃圾场(“foo”)。。。然后,在正常的Apache日志文件中,没有任何内容被打印到STDERR。我会的
use Devel::Peek;
print STDERR "name AFTER encoded: \n";
Dump($add_common->{name});