我有一堆流量和数据处理应用程序,我偶尔需要监视,这意味着我需要知道他们读取的文件.这主要是为了帮助打包测试用例,但在调试时也很有用.
有没有办法以产生这样一个列表的方式运行可执行文件?
我对此有两点想法:
备选方案#1肯定是更好的选择,但是对于如何更容易地做#2的评论也是受欢迎的.
前段时间,我问过这个关于覆盖构建perl函数的问题.
如何以允许多个覆盖的方式执行此操作?以下代码产生无限递归.
这样做的正确方法是什么?如果我重新定义一个函数,我不想踩到别人的重新定义.
package first;
my $orig_system1;
sub mysystem {
my @args = @_;
print("in first mysystem\n");
return &{$orig_system1}(@args);
}
BEGIN {
if (defined(my $orig = \&CORE::GLOBAL::system)) {
$orig_system1 = $orig;
*CORE::GLOBAL::system = \&first::mysystem;
printf("first defined\n");
} else {
printf("no orig for first\n");
}
}
package main;
system("echo hello world");
Run Code Online (Sandbox Code Playgroud) 我可以使用IxHash来记住哈希的插入顺序.
use Tie::IxHash;
my %hash;
tie(%hash, 'Tie::IxHash');
%hash = (
x => 10,
z => 20,
q => { a1 => 1, a3 => 5, a2=>2,},
y => 30,
);
printf("keys %s\n", join(" ", keys %hash));
=> keys x z q y
Run Code Online (Sandbox Code Playgroud)
嵌套哈希怎么样?
printf("keys %s\n", join(" ", keys %{$hash{q}}));
keys a2 a1 a3
Run Code Online (Sandbox Code Playgroud)
我怀疑答案是否定的,因为q哈希是匿名的,并且在IxHash看到之前订单丢失了.
我知道我可以在$ hash {q}上进行绑定,然后添加元素,但我喜欢使用单一赋值来构建哈希.
有诀窍吗?
当我调用find-file打开一个新文件时,通常会发生我正在寻找的文件位于我已经加载的目录之一.
理想情况下,我想使用向上/向下箭头滚动历史记录.
这样做的问题是,如果我已经从目录中加载了10个文件,我首先必须通过这10个文件,所有文件都在同一个目录中,然后才能看到我的文件所在的新目录.
最后,我经常再次输入目录或从xterm剪切/粘贴它.
在find-file命令中,我可以更改向上/向下箭头的行为来迭代目录而不是文件.
或者,我可以更改文件顺序以匹配最近访问的缓冲区的顺序,而不是我加载文件时的顺序吗?
我有一个运行约30分钟的Perl脚本,所以当然我运行Devel :: NYTProf.伟大的探究者.对于我的很多潜艇,我得到的一些数据对我来说没有意义.
我使用默认的NYTProf设置在Linux上使用perl 5.10.0运行.
在HTML输出中,每个subs都有一个摘要部分,说明在子及其子项中花费了多少时间,然后继续给我行信息.
行统计信息不会累计到函数中的总花费.是什么赋予了?
例如,我有一个报告使用233s(57 + 166)的功能.逐行编号报告有一行使用20s,另一行使用4,一行使用2.其他行<1s且函数不长.
我该怎么做才能解决这种不匹配问题?
我可以转到Perl 5.12,但这需要一些工作来安装依赖项.我很高兴以较慢的模式运行它.有没有办法增加采样频率?在较慢的机器上运行?
点击这里获取样品:我的NYTProf输出.在这种情况下,报告子使用225秒,但添加所有数字产生56秒.此次运行已关闭优化:
setenv NYTPROF optimize=0:file=nytprof.optout
Run Code Online (Sandbox Code Playgroud)
更新我使用findcaller = 1选项标记重新运行Perl 5.12,建议或多或少相同的结果.(我运行了不同的数据集)
更新 Tim B是对的.我已经更改了一些关键子设备来自行缓存,而不是使用memoize,NYTProf结果再次有用.谢谢蒂姆.
我有一堆运行工具流程的脚本.就像Makefile一样但是在Perl中.
作为这些流程的一部分,Perl脚本设置了环境变量,并且它们发生的时间并不总是很容易知道,因此很难重现流程的各个阶段.
有没有办法挂钩%ENV,这样我可以在环境变化时注册一个回调?
我能和它联系吗?%ENV已经表现得像个平局.
后续行动:是的.你只是绑定它.
我正在尝试修复我的代码以使Perl能够通过削弱引用和打破周期来恢复不需要的数据.
我最近问了一个关于如何访问Perl引用计数的问题,答案对我来说效果很好.
对于我的一些对象,引用计数> 1,我不知道为什么.
有没有办法让我添加一个回调或什么来帮助我知道引用计数何时递增?我想知道谁在引用一个对象.
这些问题的过去答案都集中在分叉上:
对于这个问题,我只是询问对'系统'功能的调用.
假设我有一个名为sleep.pl的脚本:
use strict;
use warnings;
sleep(300);
Run Code Online (Sandbox Code Playgroud)
然后我有一个名为kill.pl的脚本
use strict;
use warnings;
system("sleep.pl");
Run Code Online (Sandbox Code Playgroud)
我运行kill.pl并使用ps我找到kill.pl的进程ID并杀死它(不使用kill -9,只是普通的kill)
sleep.pl还在睡觉.
我想我的问题的解决方案涉及一个SIG处理程序,但是我需要将什么内容放入处理程序来杀死子进程?
Tie :: Hash有这些:
sub FIRSTKEY { my $a = scalar keys %{$_[0]}; each %{$_[0]} }
sub NEXTKEY { each %{$_[0]} }
Run Code Online (Sandbox Code Playgroud)
NEXTKEY有两个参数,其中一个是最后一个键,但arg从未被引用过?
除了perltie之外,各种各样的Tie文档并没有说明这一点:
my $a = keys %{$self->{LIST}}; # reset each() iterator
Run Code Online (Sandbox Code Playgroud)
查看每个文档并不会增加这一点.
这是怎么回事?
我想搜索文件的行以查看它们中的任何一个是否匹配一组正则表达式中的一个.
这样的事情:
my @regs = (qr/a/, qr/b/, qr/c/);
foreach my $line (<ARGV>) {
foreach my $reg (@regs) {
if ($line =~ /$reg/) {
printf("matched %s\n", $reg);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这可能很慢.
似乎正则表达式编译器可以提供帮助.有这样的优化:
my $master_reg = join("|", @regs); # this is wrong syntax. what's the right way?
foreach my $line (<ARGV>) {
$line =~ /$master_reg/;
my $matched = special_function();
printf("matched the %sth reg: %s\n", $matched, $regs[$matched]
}
Run Code Online (Sandbox Code Playgroud)
}
其中'special_function'是特殊的酱,告诉我正则表达式的哪一部分匹配.