在我开始自己编写代码并重新发明轮子之前,如何在不复制hashref的情况下复制散列哈希?
我正在通过Config :: General读取散列哈希值.即,数据结构是:
my %config = ( group => { item1 => { foo => 'value',
bar => 'value',
},
item2 => { foo => 'value',
bar => 'value',
},
item3 => { foo => 'value',
bar => 'value',
},
},
);
Run Code Online (Sandbox Code Playgroud)
然后我通过解除引用来从配置中取出我的组,并在重写配置文件之前在运行时更改内容:
my %group = %{$config{'group'}};
Run Code Online (Sandbox Code Playgroud)
问题是我需要检查是否进行了更改并对系统的文件结构进行了相关更改.我不能通过检查来做到这一点:
if ($group{'item1'}{'foo'} ne $config{'group'}{'item1'}{'foo'}) {
### Stuff!
}
Run Code Online (Sandbox Code Playgroud)
as $group{'item1'}和$config{'group'}{'item1'}都是完全相同的hashref.
现在虽然简单地重新解析配置文件并在保存到磁盘之前将磁盘中已解析的副本与编辑后的版本进行比较应该是微不足道的,但我确信有一种方法可以对复杂数据结构进行嵌套解引用,复制哈希引用的内容,而不是简单地复制引用本身.对CPAN的粗略检查并没有改变任何事情.我错过了什么?
基准
得到了我的答案:
#!/usr/bin/perl
use Benchmark qw(:all) ;
use Storable qw(dclone);
use Clone qw(clone); …Run Code Online (Sandbox Code Playgroud) 我应该如何在VBA中定义大字符串?有没有比编码下面更好的方法?
Dim largeString as String
largeString = "This is a long block of text that I want to fill " & _
"into a form field. I need to make sure I pay attention " & _
"to spacing and carriage return issues while doing so. " & _
"I also have to use quotes liberally, the concatenation " & _
"operator, and the continuance underscore to make sure " & _
"VBA can parse my code." & vbCr & …Run Code Online (Sandbox Code Playgroud) 下面的代码(一个简化的例子,我实际上是迭代对象列表并尝试捕获异常)通过转到for列表中的下一个项来执行错误处理.它有效,但是在catch子例程中使用循环控制语句时会发出警告:
use strict;
use warnings;
use Try::Tiny;
use 5.010;
NUM: for my $num (1 .. 10) {
try {
if ($num == 7) {
die 'ugly number';
}
} catch {
chomp;
say qq/got "$_"/;
next NUM;
};
say qq/number $num/;
}
Run Code Online (Sandbox Code Playgroud)
输出:
number 1
number 2
number 3
number 4
number 5
number 6
got "ugly number at testtry.pl line 9."
Exiting subroutine via next at testtry.pl line 14.
Exiting subroutine via next at testtry.pl line 14.
number 8 …Run Code Online (Sandbox Code Playgroud) 为什么以下代码会发出警告?$ match的范围限定为if块,而不是包含while块.
use strict;
use warnings;
use 5.012;
use IO::All;
my $file = io($ARGV[0])->tie;
my $regex = qr//;
while (my $line = <$file>) {
if (my ($match) = $line =~ $regex) {
...
}
elsif (my ($match) = $line =~ $regex) {
...
}
say $match;
}
Run Code Online (Sandbox Code Playgroud)
C:\>perl testwarn.pl test.log
"my" variable $match masks earlier declaration in same scope at testwarn.pl line 15.
Global symbol "$match" requires explicit package name at testwarn.pl line 18.
Execution of testwarn.pl aborted due to …Run Code Online (Sandbox Code Playgroud) 我注意到Looks_like_number不会像我假设的那样简单地返回true/false,但实际上返回一个字节,指示perl内部说的数字类型存储在标量中.例如:
perl -e'use Scalar::Util qw/looks_like_number/; for (qw/ 1 3 10 34.23 545435.234 2343.0 234 -1423 1sddf -865178652134876152348761253487613254 sdf 24363456345636534563567253765734655 8764325hjkh435 iuh340874 &*^*& 786521948761324876132497821347816.23452345 -8762135487126387432.12435154243 0 nan inf/) { print $_, ": ", looks_like_number($_), "\n" } '
1: 1
3: 1
10: 1
34.23: 5
545435.234: 5
2343.0: 5
234: 1
-1423: 9
1sddf: 0
-865178652134876152348761253487613254: 10
sdf: 0
24363456345636534563567253765734655: 2
8764325hjkh435: 0
iuh340874: 0
&*^*&: 0
786521948761324876132497821347816.23452345: 6
-8762135487126387432.12435154243: 14
0: 1
nan: 36
inf: 20
Run Code Online (Sandbox Code Playgroud)
它实际上没有记录在我可以找到的Scalar :: Util中,只是提到它返回perlapi的look_like_number值,这也不在文档中.一目了然,似乎是:
有没有办法使用Log :: Log4perl创建一个智能自我记录模块,即使没有调用脚本没有初始化Log4perl,它也会将其操作记录到文件中?据我从文档中可以看出,使用Log4perl的唯一方法是从配置中运行脚本初始化它,然后实现Log4perl调用的模块根据调用者的Log4perl配置自行记录.
相反,我希望模块为Log4perl提供默认的初始化配置.这将为模块的类别提供默认文件追加器.然后,我可以通过在调用者中使用不同的配置启动Log4perl来覆盖此行为,如果需要,所有内容都可以正常工作.
这种防御性日志记录行为是否可行,或者我是否需要依赖于在调用我想要记录的模块的每个.pl脚本中启动Log4perl?
我想让模块在运行时管理他们的日志记录,但没有任何东西都指向单个整体配置文件.当处理在不同权限下运行的进程时,我真的不想处理每个需要能够访问系统上每个日志的进程,只需要写入它们的子集.
但是,我没有在Log4perl手册中找到有关如何在运行时从配置文件初始化其他appender的文档.http://metacpan.org/pod/Log::Log4perl::Appender引用了一个add_appender方法,但它适用于实例化的appender对象而不是conf文件.它也没有定义记录器对象和logger-> appender关系.
我尝试从每个软件包初始化每个软件包,但这只是在每次初始化时都会破坏现有的配置.我想做的是:
my $foo = Foo->new() ## Checks Log::Log4perl::initialized(), sees that it
## hasn't been initalized yet, inits Log4perl from foo.conf
my $bar = Bar->new() ## Checks Log::Log4perl::initialized(), sees that it
## has been initalized. Adds appenders and loggers defined
## in bar.conf into the initialized configuration
Run Code Online (Sandbox Code Playgroud)
如何解析并将配置添加到当前配置中?
编辑:使用包变量的Probalem是,这只是各种类所使用的Moose角色,几乎只是MooseX :: Role ::参数化版本的Ether在使用Log :: Log4perl制作自我记录模块时的答案.因此,我的记录器正在编写到使用它的库中,并且我没有可以在每次使用它时使用的全局变量.
虽然..
如果我在MooseX :: Role :: Parameterized角色块之外声明一个全局变量,那么每个使用该角色的类都会使用相同的conf变量吗?
假设我有一个独立的Dancer webapp.我可以通过运行make dist,获取tarball然后通过cpanm或类似方法安装它来将其部署到主机.但是,我似乎无法找到如何控制此部署.当我在应用程序上创建dist时,然后在其他地方安装应用程序,它似乎只是安装应用程序的模块.但是,应用程序脚本,各种html文件和模板,环境配置文件未安装到本地文件系统.
什么是从系统上的webapp开始的正确方法 - > tarball - >系统b上的webapp?
编辑:
对不起,我应该澄清,我明白我可以手动完成所有事情.我很惊讶没有快速方法可以使用几个命令进行安装,或者在应用程序本身中指定感觉各种组件可以安装的地方.
因为我在大多数情况下使用cpanm,这简化了系统B上的操作,因为我可以将其提取到目录,更改为它,运行'cpanm'.它将依赖项和应用程序的模块安装到系统lib中.
但是,这会导致应用程序模块位于<>/lib /以及系统perllib安装路径中.这也意味着用户需要了解一下perl.
我想我只是想知道事情是否发生了变化,因为什么是安装Perl网络应用程序的最佳系统?有人在三年前被问过.随着现代Perl技术发展的所有进步,似乎这就是现在已经处理过的那类问题.
我知道这是可能的,但我在语法上画了一个空白.你如何做有条件的类似以下的事情.5.8,所以没有开关选项:
while ( calculate_result() != 1 ) {
my $result = calculate_result();
print "Result is $result\n";
}
Run Code Online (Sandbox Code Playgroud)
和类似的东西:
while ( my $result = calculate_result() != 1 ) {
print "Result is $result\n";
}
Run Code Online (Sandbox Code Playgroud) 假设我定义了一个抽象的My :: Object和具体的角色实现My :: Object :: TypeA和My :: Object :: TypeB.出于可维护性的原因,我希望没有一个硬编码表来查看对象类型并应用角色.作为一个DWIMmy示例,我在My :: Object中寻找这些行中的内容:
has => 'id' (isa => 'Str', required => 1);
sub BUILD {
my $self = shift;
my $type = $self->lookup_type(); ## Returns 'TypeB'
{"My::Object::$type"}->meta->apply($self);
}
Run Code Online (Sandbox Code Playgroud)
让我通过执行以下操作来应用具有My :: Object :: TypeB角色的My :: Object:
my $obj = My::Object(id = 'foo')
Run Code Online (Sandbox Code Playgroud)
这会做我想做的事情还是在完全错误的轨道上?
编辑:我太简化了; 我不想在实例化对象时知道类型,我希望对象确定其类型并适当地应用正确的角色方法.我编辑了我的问题以使其更清楚.