通过自学Moose的方式,我正在研究一个与特定硬件接口的Moose对象.所述硬件采用许多不同的命令来设置硬件的各种属性,设置PROPERTYNAME=VALUE器的所有形式以及PROPERTYNAME?吸气器(注意这些"设置器"和"吸气器"在硬件的网络接口上).我想要做的是创建一个对象,其中硬件的所有这些属性都使用类似属性的接口实现.由于获取和设置各种属性对所有属性采用相同的形式,是否有办法从这些属性的列表中自动生成setter和getter?
IE:而不是这个:
Package MyHardware;
use Moose;
has property1 => (
'is' => 'rw',
'reader' => 'set_property1',
'writer' => 'get_property1',
);
has property2 => (
'is' => 'rw',
'reader' => 'set_property2',
'writer' => 'get_property2',
);
# ...
has propertyN => (
'is' => 'rw',
'reader' => 'set_propertyN',
'writer' => 'get_propertyN',
);
Run Code Online (Sandbox Code Playgroud)
有什么我可以这样做:
Package MyHardware;
use Moose;
attributes => (
'is' => 'rw',
'names' => [qw/property1 property2 ... propertyN/],
'reader' => sub {
my $self = shift;
my …Run Code Online (Sandbox Code Playgroud) 我有一个需要在Windows和Linux上运行的Perl脚本.问题是我需要use一个仅适用于Windows的Perl模块.
我试过下面的,但它仍然包括你的WindowsStuff包.
use strict;
if ($^O eq 'MSWin32' ){
use My::WindowsStuff;
}
use File::Basename;
use Getopt::Long;
...
...
Run Code Online (Sandbox Code Playgroud) 在Windows上,我想只在脚本死亡时执行某些操作.下面的块没有帮助; 我认为这是因为Windows不支持信号.
$SIG{__DIE__} = sub {
qx(taskkill /F /IM telnet.exe);
CORE::die @_;
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试了这个:
END {
qx(taskkill /F /IM telnet.exe);
exit $exit_code;
}
Run Code Online (Sandbox Code Playgroud)
它执行了taskkill,但退出了退出代码0.我需要传播,exit_code因为我们基于它进行进一步处理.
我想转换一个字符串,以便所有数字子序列都包含在{... }对中.
例如:
input_string = "APPL[E]5XXXX"
output_string = "APPL[E]{5}XXXX"
Run Code Online (Sandbox Code Playgroud)
例如,每个字符串可以包含一个或多个数字,BASIC76XXXXX98ZZZZ输出应该是BASIC{76}XXXXX{98}zzzz
不确定这是否可能实现.任何帮助将非常感谢.
我不明白为什么下面的例子失败了(测试2).为什么我无法从*bb glob访问变量bb?
use Test::More tests => 4;
$aa = 1;
my $bb = 2; # HERE!
local $cc = 3;
our $dd = 4;
is(${*aa}, 1, "$ \*aa should be 1");
is(${*bb}, 2, "$ \*bb (my) should be 2");
is(${*cc}, 3, "$ \*cc (local) should be 3");
is(${*dd}, 4, "$ \*dd (our) should be 4");
Run Code Online (Sandbox Code Playgroud)
输出是
1..4
ok 1 - *aa should be 1
# Failed test '*bb (my) should be 2'
# at untitled line 10.
# got: undef …Run Code Online (Sandbox Code Playgroud) 在Perl 5中,我可以说
my $meth = 'halt_and_catch_fire';
my $result = $obj->$meth();
Run Code Online (Sandbox Code Playgroud)
这对于迭代方法名称列表来执行操作非常方便.我已经设法搞清楚在Perl 6中我不能只说
my $result = $obj.$meth();
Run Code Online (Sandbox Code Playgroud)
有一件事做的工作
my $result = $obj.^can($meth)[0]($obj);
Run Code Online (Sandbox Code Playgroud)
但这似乎完全可怕.我该怎么办呢?
我试图根据我想要回去的周数来确定计算上一个日期的好方法.今天是2011年7月19日,所以如果我想回到5周,那么确定那个日期的最佳方法是什么?
Perl noob在这里 - 我有以下脚本
if(substr($pc, 3,1)!=" "){
$newpc = substr($pc, 0, 4) . " " . substr($pc, 4);
}
Run Code Online (Sandbox Code Playgroud)
它被设计为在邮政编码中放置一个空格,例如NN141NJ变成NN14 1NJ......但是对于NN102DE它没有做任何事情的邮政编码,Perl是否识别" "并且"0"同样如此?0作为第四个字母,我怎样才能使用perl而不是忽略字符串?
假设我有一个Perl模块My::Module:
package My::Module;
sub foo {
return $module_name;
}
Run Code Online (Sandbox Code Playgroud)
我会怎么替换$module_name用得到My::Module?
这听起来比我的意思更模糊,但是在类中测试方法时正确的过程是什么。
例如,客户类将设置密码的 md5 哈希值保存到数据库,而不是实际密码。客户类中的私有方法计算出要保存的 md5 哈希值。
public class Customer() {
public void setPassword(String password){
this.password = hashPassword(password);
}
private String hashPassword(String password){
..do stuff..
}
.. other methods ..
}
Run Code Online (Sandbox Code Playgroud)
现在这只是一个例子,我不想知道如何计算 md5 哈希值等。这是关于测试的。这是我能想到的选择: