我发现Haskell和Perl6最有趣的特性之一是能够推迟计算值,直到实际需要它们为止.
另一方面,Perl5喜欢立即做所有事情,但据我所知,它包含了懒惰评估的所有必要原语.那些是:
@_的子程序创建一个别名在其参数列表中的标识符数组引用,即使其中的一些标识符不包含值呢.\@_内部保存的子例程返回重载/绑定对象,然后在需要时取消引用它.(并且有各种CPAN模块可以抽象出领带/过载细节)我一直在Perl中尝试各种惰性编程技术(我在工作中有一个模块,在Perl5中实现了一些Haskell Prelude(像共同递归:$_ = list 0, 1, zipWith {&sum} $_, tail $_ for my $fibs;定义Fibonacci序列已经在工作)).但我感觉代码中隐藏着一些微妙的错误,这些错误可能在函数用于较大的表达式/程序时显现出来.
所以我想知道是否有任何好的例子(CPAN /博客/书籍),任何人都知道,在Perl5中使用Haskell/Perl6就像懒惰一样?特别是,我想阅读使用这种类型的懒惰的任何重要大小的代码.
我也有兴趣知道是否有任何人遇到任何关于在Perl 5中实现延迟评估的问题或难以处理的问题.
有没有更好的方法在数组中的每个元素上使用tr ///而不是以下方法:
foreach (@list) {
tr/abc/xyz/;
}
Run Code Online (Sandbox Code Playgroud)
我正在玩一些东西而且我无法理解它看起来不太正确/最佳.也许我只想到条件可以如何以后缀形式使用.有人知道是否有办法使用后缀形式tr ///或s ///?
我已经看到了代码,其中只有两个相当静态的元素被映射,例如具有开始和结束日期的时间间隔,但是map()正在使用而不是用于映射的显式代码,例如
{ map { ... } qw(start end) } # vs.
{ start => ..., end => ... }
Run Code Online (Sandbox Code Playgroud)
哪种方式更受欢迎,为什么?
该map形态可能不那么简洁,但看起来更多的功能(如函数式编程),所以我想这就是为什么它可能优于明确的代码也许是更加干燥.
但是,它对我来说看起来不太清晰,因为后面有更多的逻辑,并且映射也应该效率较低,因为它调用a调用并包含更多的原子操作.
编辑
在编程中存在一个相互矛盾的目标:KISS(保持它{选择2来自:小,简单,愚蠢}).使用map稍微复杂的代码.
我在脚本中碰到这个代码来了,能否请您解释一下map,并grep在这里呢?
open FILE, '<', $file or die "Can't open file $file: $!\n";
my @sets = map {
chomp;
$_ =~ m/use (\w+)/;
$1;
}
grep /^use/, ( <FILE> );
close FILE;
Run Code Online (Sandbox Code Playgroud)
指向的文件$file有:
use set_marvel;
use set_caprion;
and so on...
Run Code Online (Sandbox Code Playgroud)