我经常发现能够在离开当前范围时安排执行代码很有用.在我以前的TCL生活中,一位朋友创建了一个名为defer的函数.
它启用了代码:set fp [open"x"] defer("close $ fp");
当前范围退出时调用的.主要的好处是无论我如何/在何处留下范围,它总是被调用.
所以我在Perl中实现了类似的东西,但似乎有一种更简单的方法.评论批评欢迎.
我在Perl中的方式:
实际代码如下.
有一个更好的方法吗?似乎这将是一项常用的功能.
use strict;
package tiescalar;
sub TIESCALAR {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
sub FETCH {
my $self = shift;
return $self->{VAL};
}
sub STORE {
my $self = shift;
my $value = shift;
if (defined($self->{VAL}) && defined($value)) {
foreach my $s (@{$self->{VAL}}) { &$s; }
}
$self->{VAL} = $value;
}
1;
package main;
our $h;
tie($h, 'tiescalar'); …Run Code Online (Sandbox Code Playgroud) 我在Linux上,nfs,涉及多台机器.
我正在尝试使用fcntl来实现文件锁定.我一直在使用flock,直到我发现它只能在同一台机器上的进程之间工作.
现在当我用F_SETLKW调用fcntl时,perl警报(用于添加超时)不像以前那样工作.这通常没问题,但是ctrl-c也没有用.
我相信正在发生的事情是,fcntl每隔30秒左右只检查一次信号.警报最终会回来.ctrl-c最终被抓住了.
有什么办法可以调整fcntl检查这些信号的频率吗?
我有一个脚本,用于在调用csh shell中设置一些env var。其中一些变量取决于脚本的位置。
如果该文件是正确的csh脚本,则可以使用$ 0进行访问,__FILE__但是如果使用源代码运行该脚本,它只会告诉我csh或tcsh。
由于我使用此方法在父shell中设置var,因此必须使用source。
该怎么办?
看起来这是常见的事情,但我无法找到.
我有一个带有大量文本的QTextEdit或QPlainTextEdit小部件.足够滚动是必要的.
我想要另一个小部件来提供有关当前可见文本的一些信息.要做到这一点,我需要知道
我看到QPlainTextEdit的方法是firstVisibleBlock,但它受到保护.这告诉我,这不是我应该在我的应用程序中使用的东西.否则我不需要从编辑窗口子类化.
我也看到有信号updateRequest,但我不清楚我对QRect做了什么.
我该怎么做或在哪里找到提示?
我正在尝试维护相同内容的两个并行版本.偶尔,我花一些时间将它们彼此同步.
我发现这样做的一种方法是在每对文件之间进行区分并查看差异.
问题是我知道有很多不同之处.他们将继续不同.我正在寻找其他的东西.
有没有一个diff工具可以让我标记特定的差异已知/忽略?
我在使用SVN的linux环境中.我使用基于Windows的实用程序很好.
我有一个Perl程序,它读入一堆数据,然后输出,然后输出几种不同的文件格式.我想让Perl成为这些格式之一(以.pm包的形式),并允许人们在他们自己的Perl脚本中使用munged数据.
使用Data :: Dump :: pp可以轻松打印出数据.
我还想在生成的包中打印一些辅助函数.
在没有变量替换的情况下打印多行字符串的简单方法是什么?
我希望能够做到:
print <<EOL;
sub xyz {
my $var = shift;
}
EOL
Run Code Online (Sandbox Code Playgroud)
但后来我不得不逃避所有的$.
有一个简单的方法吗?也许我可以创建一个实际的子和一些神奇的漂亮打印机打印内容?打印的代码不必与输入匹配,甚至不清晰.
我使用tcsh和emacs.在emacs中,我习惯于使用ctrl-left bindkey将一个单词向左移动.我想在我的tcsh终端做同样的事情.
我可以做ctrl-b,但我只是不习惯它.
我从bindkey manpath中不清楚如何指定ctrl-left键组合.
我该怎么做?
我有一些代码要求应用程序在执行之前完全加载和编译.
有没有办法检查我的Perl程序是否仍处于编译阶段?
我有一些有用的东西,但必须有一个更好的方法:
sub check_compile {
printf("checking\n");
foreach my $depth (0..10) {
my ($package, $filename, $line, $subroutine) = caller($depth);
last unless (defined($package));
printf(" %s %s %s %s %s\n", $depth, $package, $filename, $line, $subroutine);
if ($subroutine =~ /::BEGIN$/) {
printf("in compile\n");
return 1;
}
}
printf("not in compile\n");
return 0;
}
BEGIN {
check_compile();
}
use subpkg;
check_compile();
Run Code Online (Sandbox Code Playgroud)
和subpkg.pm包含:
package subpkg;
use strict;
use warnings;
printf("initing subpkg\n");
main::check_compile();
1; # successfully loaded
Run Code Online (Sandbox Code Playgroud) 我的应用程序读取和写入大量中型到大型文件.我想以压缩格式存储这些内容.节省磁盘空间和网络时间.
一种方法是这样做:
sub fopen {
my $mode = shift;
my $filename = shift;
if ($filename =~ /\.gz$/) {
if ($mode eq "<") {
open(my $fp, "-|", "/usr/bin/gzcat $filename");
#my $fp = gzopen($filename, "rb") ;
return $fp;
}
if ($mode eq ">") {
open(my $fp, "|-", "/usr/bin/gzip > $filename");
#my $fp = gzopen($filename, "wb") ;
return $fp;
}
} else {
open(my $fp, $mode, $filename);
return $fp;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我可以通过将调用交换为open来更改现有代码.
从函数中可以明显看出,我还想过使用zlib/compress库.问题是结果不能作为文件指针传递.
有没有办法做到这一点,不涉及创建一堆额外的进程?
我经常编写小的perl脚本来解决探索perl行为的各种问题.
我使用.pl文件的模板很好.它将基础知识自动填充到我的缓冲区中.
一个小烦恼是每当我这样做,在运行之前,我必须chmod ugo + x
我能否自动获取emacs(基于文件扩展名)?