我在Windows 7上运行ActiveState的32位ActivePerl 5.14.2.我想用Git预提交钩子来检测正在检查的语法错误的程序.(不知怎的,我只是设法做了这么糟糕的提交.)所以作为一个测试程序,我随机记下了这个:
use strict;
use warnings;
Syntax error!
exit 0;
Run Code Online (Sandbox Code Playgroud)
但是,它在没有警告的情况下编译和执行,退出时errorlevel为零.这个有效的语法怎么样?
我想测试批处理文件中副本的成功/失败,但是我找不到任何关于返回错误级别代码的文档.例如
copy x y
if %errorlevel%. equ 1. (
echo Copy x y failed due to ...
exit /B
) else (
if %errorlevel% equ 2. (
echo Copy x y failed due to ...
exit /B
)
... etc ...
)
Run Code Online (Sandbox Code Playgroud) 我试图对函数的结果进行排序,因为sort func();并且因为没有返回而被烧毁.我猜Perl认为函数调用是一个排序例程,后面没有数据.
Perldoc说第二个参数可以是子程序名称或代码块.我将func()视为调用,而不是名称.我认为这根本不是DWIMMY.
为了进一步探索这是如何工作的,我写道:
use strict;
use warnings;
sub func {
return qw/ c b a /;
}
my @a;
@a = sort func();
print "1. sort func(): @a\n";
@a = sort &func;
print "2. sort &func: @a\n";
@a = sort +func();
print "3. sort +func(): @a\n";
@a = sort (func());
print "4. sort (func()): @a\n";
@a = sort func;
print "5. sort func: @a\n";
Run Code Online (Sandbox Code Playgroud)
输出没有生成警告:
1. sort func():
2. sort &func: a b c
3. sort +func(): …Run Code Online (Sandbox Code Playgroud) 我刚刚收到警告"Scalars泄露:1次"9次.
我猜它来自一个线程上传程序,它使用9个线程与模块线程,threads :: shared和Thread :: Queue.这是在WinXP,活动状态5.8.8.
知道这意味着什么吗?这个程序运行了一段时间没有这样的警告,我用相同的(轻)工作重新启动程序,导致警告,但这次没有警告.
我不是试图在编译时启动线程,除非这是Thread :: Queue在内部执行的操作.我的第一个线程调用是在Getopt :: Long处理之后.
在Windows XP上使用ActiveState 5.8.8 ,我想安装一个更新的Perl用于测试/迁移.
我正在编写一个搜索例程,其中undefined和zero都是有效的结果.我正在返回一个两元素数组,($result, $answer)因为我没有"未定义但真实"的值.它工作正常,但有点klutzy.一堂课似乎有点矫枉过正.
这样的事情是否存在或者可以以某种方式伪造?我正在考虑诸如0E0技巧之类的东西等.
更多细节.这是我想要的用户界面.当前例程返回两个值,结果(无论是否找到键)和值(如果是).
my $result = search_struct($key, $complex_data_structure);
if ($result) {
print "A result was found for $key! Value is: ", $result // "Undefined!", "\n";
}
else {
print "Sorry, no result was found for $key.\n";
}
Run Code Online (Sandbox Code Playgroud) 如果在Moose的构造函数调用中有额外的参数而不是属性,有没有办法死?例如,这个:
package Shoe;
use Moose;
has 'size' => (is => 'ro', isa => 'Num');
has 'color' => (is => 'ro', isa => 'Str', default => 'brown');
1;
Run Code Online (Sandbox Code Playgroud)
会死的
my $sneaker = Shoe->new(size => 11, colour => 'white');
Run Code Online (Sandbox Code Playgroud)
因为colour不属于Shoe.
我可以发誓我已经看过一个模块或其他什么来做这个但我找不到它.
B :: Lint不喜欢while (<>) {do stuff},docs显示令人讨厌的注入攻击,因为它内部使用了邪恶的2参数打开.有一种简单的方法可以使这种用法更安全吗?我有很多使用它的小脚本.
在perl中使用引用词时,是否可以在列表中包含undef值?
my @ number_array = qw( 1 2 3 4 5 6 7 8 9 10 )
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以在该列表中添加一个undef值,使其包含11个值而不是10个值?
我正在尝试启动一个催化剂应用程序,但它一直在启动失败,因为它说它找不到我使用的模块HTML :: FormHandler :: Field :: TextArea.这是它给我的错误:
Can't locate HTML/FormHandler/Field/Textarea.pm in @INC (@INC contains:
/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/
x86_64-linux-thread-multi
/usr/lib/perl5/5.8.8 .)
Run Code Online (Sandbox Code Playgroud)
但是,我查看了我的文件系统,我知道该模块位于的事实/usr/lib/perl5/site_perl/5.8.8/HTML/FormHandler/Field/TextArea.pm.正如您在上面所看到的,@INC确实包含了此文件的路径.有谁知道脚本为什么找不到它?谢谢!
我的脚本中有以下代码.
if($description =~ /\'/) {
print "I am here\n";
$description =~ s/\'/'/g;
}
print "description = $description\n";
Run Code Online (Sandbox Code Playgroud)
当我运行这个脚本时,"I am here\n"由于比较失败,我没有得到输出.
但是,当$description字符串确实包含撇号时.
$description = "The baseball player’s spiritual redemption and recovery from drug addiction.";
上下文:我正在解析从调用nytimes bestsellers api(以json格式返回)获得的字符串,并且此字符串存储在$description字符串中.
我要做这样的事情:
my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time);
Run Code Online (Sandbox Code Playgroud)
但我不需要所有这些变量(只需要$ min,$ hour,$ mon,$ year).
是否有一个简单的解决方案只在perl中声明必填字段?
对我来说一个简单的解决方案就是这个,但它不是真正的"性感":
my @day = localtime(time);
my $min = $day[1];
my $hour = $day[2];
my $day = $day[3];
...
Run Code Online (Sandbox Code Playgroud)
提前感谢任何能够给我一些想法的人:)
perl ×11
windows ×2
arrays ×1
batch-file ×1
constructor ×1
moose ×1
parameters ×1
perlbrew ×1
require ×1
subset ×1