我有这个使用perl 5.10的特殊代码(用于类似交换的操作),但需要让它在5.8上运行。 为5.8写这个是什么另一种方式?一种首选的方式/技术?
for my $detail ($Details1, $Details2) {
for (keys %$detail) {
when ('file') {
print " File: $detail->{file}{path}\n";
print "Bytes: $detail->{file}{size}\n";
}
when ('directory') {
given (ref $result->{directory}) {
when ('ARRAY') {
for my $entry (@{$detail->{directory}}) {
print "Directory: $entry->{path}\n";
}
}
when ('HASH') {
print "Directory: $detail->{directory}{path}\n";
}
}
}
}
}
答案 0 :(得分:7)
只需用given
/ when
替换if
/ elsif
即可。
for my $detail ( $Details1, $Details2 ) {
for ( keys %$detail ) {
if ( $_ eq 'file' ) {
print " File: $detail->{file}{path}\n";
print "Bytes: $detail->{file}{size}\n";
}
elsif ( $_ eq 'directory' ) {
if ( ref $result->{directory} eq 'ARRAY' ) {
for my $entry ( @{$detail->{directory}} ) {
print "Directory: $entry->{path}\n";
}
}
if ( ref $result->{directory} eq 'HASH' ) {
print "Directory: $detail->{directory}{path}\n";
}
}
}
}
但我很想用调度表将其重写为匿名潜艇。
答案 1 :(得分:3)
我认为简单的if-elsif足以替换那里的类似交换机的代码。
CPAN Switch是一个源过滤器,因此我猜它会生成与if-elsif类似的代码。当你在eval中使用它时它有一些限制: "由于源过滤器在Perl中的工作方式,您无法在字符串eval中使用Switch。" http://perldoc.perl.org/5.8.9/Switch.html
答案 2 :(得分:2)
我个人的偏好是使用for
,正则表达式和do
块:
for my $detail ($Details1, $Details2) {
for (keys %$detail) {
/^file$/ && do {
print " File: $detail->{file}{path}\n";
print "Bytes: $detail->{file}{size}\n";
};
/^directory$/ && do {
for (ref $result->{directory}) {
/^ARRAY$/ && do {
for my $entry (@{$detail->{directory}}) {
print "Directory: $entry->{path}\n";
}
};
/^HASH$/ && do {
print "Directory: $detail->{directory}{path}\n";
};
}
};
}
}
每个;
阻止后不要忘记do
。
编辑:如果您不想涉及下一个案例,请不要忘记使用next
或last
。