我在进行Perl编码时遇到的一个小烦恼就是必须记住选择从输入中读取的行.是的,经过多年的编码,它几乎是自动记住这样做,但仍然很烦人.
Perl中是否存在任何编译指示,模块或其他任何内容(强烈优选的核心模块),它们会自动选择使用<>运算符读取的每一行?
CORE文档向我展示了如何快乐地模拟各种构建的Perl函数.但是,我不确定如何替换'-d'和c.用我的方法.所以这实际上只是一个关于如何在CORE :: GLOBAL中用短划线替换函数的问题.
手动参考会很好.
package Testing::MockDir;
use strict;
use warnings;
use Exporter();
use Symbol 'qualify_to_ref';
*import = \&Exporter::import;
our @EXPORT_OK = qw(SetMockDir UnsetMockDir);
our %EXPORT_TAGS = (
'all' => \@EXPORT_OK,
);
my %path2List = ();
my %handle2List = ();
BEGIN {
*CORE::GLOBAL::opendir = \&Testing::MockDir::opendir;
*CORE::GLOBAL::readdir = \&Testing::MockDir::readdir;
*CORE::GLOBAL::closedir = \&Testing::MockDir::closedir;
######################### the "-" is really the problem here
*CORE::GLOBAL::-d = \&Testing::MockDir::mock_d; # This does not work <<<<<
}
sub mock_d ($) {
die 'It worked';
}
sub SetMockDir {
my …Run Code Online (Sandbox Code Playgroud) Perl对readline函数(以及等效的<>I/O运算符)进行了一些特殊处理,它处理表达式
while (<HANDLE>)
while (readline(HANDLE))
Run Code Online (Sandbox Code Playgroud)
相当于
while (defined($_ = <HANDLE>))
Run Code Online (Sandbox Code Playgroud)
比照
$ perl -MO=Deparse -e 'f($_) while <>'
f($_) while defined($_ = <ARGV>); <--- implicitly sets $_
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
但是如果你劫持这个readline功能,这种自动分配似乎不会发生:
$ perl -MO=Deparse -e 'BEGIN {
> *CORE::GLOBAL::readline = sub { }
> }
> f($_) while <>'
sub BEGIN {
*CORE::GLOBAL::readline = sub {
};
}
f($_) while readline(ARGV); <--- doesn't set $_ !
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
当然,这会使自定义readline函数对许多遗留代码的工作不正确.这段代码的输出是"foo"BEGIN块, …
按照这个例子,
我试图print用自己的方式覆盖:
BEGIN {*CORE::GLOBAL::print = sub {print 1};}
print 2;
Run Code Online (Sandbox Code Playgroud)
但事实证明它不起作用,2仍然是打印而不是1.
为什么?
有以下内容:
use 5.014;
use warnings;
BEGIN {
use subs qw(int);
sub int {
print STDERR "\tthe int got: $_[0]\n";
my $res = CORE::int($_[0]);
print STDERR "\tCORE::int: $res\n";
return $res;
}
}
my $x;
$x = 1.1 ; say "result of int($x) is: ", int($x);
$x = 6.6 ; say "result of int($x) is: ", int($x);
Run Code Online (Sandbox Code Playgroud)
它打印
the int got: 1.1
CORE::int: 1
result of int(1.1) is: 1
the int got: 6.6
CORE::int: 6
result of int(6.6) is: 6
Run Code Online (Sandbox Code Playgroud)
该int …
我非常喜欢使用Firebug来调试我的JavaScript代码,HTML DOM和网络加载,即:客户端关于Web开发的所有内容.
服务器端的情况并不那么明亮.我正在使用的应用程序使用Perl和强制性标准模块,如CGI和DBI.我知道标准的故障排除技术,但似乎没有跟踪例如数据库查询或函数调用的调试工具,并给我很好的输出.
输出必须特别不仅仅是在STDOUT(想象Content-Type: application/json)或STDERR(通过错误日志进行捣乱非常不舒服)被拉动,并且该工具不应该要求我手动将填充物填充到核心模块中或者use Data::Dumper; print '<pre>',Dumper($foo),'</pre>'在整个代码中喷洒.
长话短说:是否有一个工具可以让Perl/CGI的服务器端调试像Firebug在客户端那样有趣?
我是Perl的新手.我正在编写一些脚本,并希望定义我自己的打印调用myprint(),它将根据一些标志打印传递给它的东西(详细/调试标志)
open(FD, "> /tmp/abc.txt") or die "Cannot create abc.txt file";
print FD "---Production Data---\n";
myprint "Hello - This is only a comment - debug data";
Run Code Online (Sandbox Code Playgroud)
有人可以帮我提供一些示例代码来实现myprint()功能吗?