我正在开发一个项目,它一次从ftp服务器获取文件列表.此时,它返回文件的arrayref,或者如果qr传递了可选的正则表达式引用(即),则使用grep过滤列表.此外,如果它qr有一个捕获组,它会将捕获的部分视为版本号,而是返回一个hashref,其中键是版本,值是文件名(如果没有捕获组,它将作为数组返回).代码看起来像(稍微简化)
sub filter_files {
my ($files, $pattern) = @_;
my @files = @$files;
unless ($pattern) {
return \@files;
}
@files = grep { $_ =~ $pattern } @files;
carp "Could not find any matching files" unless @files;
my %versions =
map {
if ($_ =~ $pattern and defined $1) {
( $1 => $_ )
} else {
()
}
}
@files;
if (scalar keys %versions) {
return \%versions;
} else {
return \@files;
}
} …Run Code Online (Sandbox Code Playgroud) CPAN上的Config :: Namespace中有很多模块,但它们都是以有限的方式限制的.
我目前正在使用Config :: Std,这在大多数情况下很好,但是它会使某些事情变得困难:
解析配置后,Config :: Std会生成一个受祝福的hashref,因此我的所有应用程序都被编码为使用hashref进行配置.我不想改变它.
我正在寻找的是一个通用,轻量级的配置模块,它产生一个hashref.
我的问题是:我应该考虑更换Config :: Std的哪些配置模块?
除了使用视图和手动编写SQL之外,我还没有找到与DBIx :: Class进行联合的方法.这对我来说很奇怪.我觉得应该有一些方法来结合两个ResultSet而不需要额外的工作,因为set加法和减法是SQL的核心部分.有没有更简单的工会方式?如果没有,为什么不呢?
在使用Subversion管理的项目中使用Autoconf时,我会将此代码放入:configure.ac
AC_REVISION($Revision: 1234 $)
Run Code Online (Sandbox Code Playgroud)
使用svn:keywords Revision,AC_REVISION会将修订号configure.ac插入生成的configure脚本中.
如何在使用Git管理的项目中做类似的事情?
Git没有像这样的关键字$Revision$,也没有这样的修订号.但它确实有提交的SHA1,和git describe.我只是不确定如何将其纳入其中configure.ac.
在我的模块中,我有这个代码:
croak("unable to parse file: $!");
Run Code Online (Sandbox Code Playgroud)
然后,在我的测试中,我想检查当我尝试解析不存在的文件时,我得到了正确的错误消息:
like(
exception { HTML::Tree->new_from_file( "t/non_existent.html" ) },
qr!^unable to parse file: No such file !,
"opening missing file failed"
);
Run Code Online (Sandbox Code Playgroud)
只要测试在英语语言环境中运行,这样就可以正常工作.但是,如果您在德语区域设置中运行测试,则会返回错误消息unable to parse file: Datei oder Verzeichnis nicht gefunden并且测试失败.其他语言环境也存在类似问题.
我不敢相信这是第一次出现,但我找不到CPAN上解决这个问题的任何模块.人们根本就不测试$!错误信息的一部分吗?有没有比改变测试只检查更好的解决方案qr!^unable to parse file: !?
注意:这是HTML-Tree中的RT#77823.
error-handling perl unit-testing localization internationalization
我经常fork在也有END { ... }块的程序中使用:
...
END { &some_cleanup_code }
...
my $pid = fork();
if (defined($pid) && $pid==0) {
&run_child_code;
exit 0;
}
Run Code Online (Sandbox Code Playgroud)
子进程在END {}退出时执行块,但通常我不希望发生这种情况.有没有办法阻止子进程END在退出时调用块?除此之外,有没有办法让程序"知道"它是一个子进程,所以我可以说类似的东西
END { unless (i_am_a_child_process()) { &some_cleanup_code } }
Run Code Online (Sandbox Code Playgroud)
?
我正在尝试为这个bug写一个测试.我已经找到了这个bug的解决方案; 我无法理解的是为什么我的测试在发布之前没有发现错误.
Ver: 0当打印时,问题可归结为此命令行打印Ver: 1.00:
perl -Mversion -e 'printf "Ver: %s\n", ("v1.00" =~ /v(.+)/ ? version->parse($1) : "no");'
Run Code Online (Sandbox Code Playgroud)
但是,如果您-MTest::More之前插入-Mversion,则打印Ver: 1.00.
所以我的问题是为什么加载Test :: More会改变我的代码的行为?(对于奖励积分,为什么使用"$1"而不是$1消除错误?)
我正在使用Perl 5.14.2,Test :: More 0.98和0.88版本.
我是一个新的emacs用户,使用emacs进行了很棒的组织模式.我有链接到我页面顶部的所有组织文件,但每次我点击一个链接它会分割我的窗口,所以我只有一半的屏幕空间可用.如何设置它以便emacs不会水平拆分窗口,而是为我的链接打开一个新窗口?
有谁知道是否可以在OS X上直接编辑文件元数据.特别是在perl中.我特意试图改变的参数是kMDItemFSLabel(文件的颜色).我已经进行了搜索,如果不使用Mac :: Glue或外部应用程序(Finder)等模块,我似乎无法找到方法.
我正在使用Perl进行与安全相关的任务,并且想知道何时发表如下声明:
$test = "new value"
执行,是$test在RAM中覆盖创建的旧值?
如果没有,有没有办法强迫这种情况发生?
perl ×8
regex ×2
unit-testing ×2
applescript ×1
autoconf ×1
capture ×1
config ×1
cpan ×1
dbix-class ×1
emacs ×1
fork ×1
git ×1
localization ×1
macos ×1
metadata ×1
org-mode ×1
scalar ×1
sql ×1
variables ×1