有人在Perl中为懒惰评估的列表找到了一个很好的解决方案吗?我已经尝试了很多方法来改变类似的东西
for my $item ( map { ... } @list ) {
}
Run Code Online (Sandbox Code Playgroud)
例如,通过绑定@list进入懒惰的评估.我试图避免分解和编写源过滤器来执行此操作,因为它们会影响您调试代码的能力.有没有人取得任何成功.或者你只需要分解并使用while循环?
注意:我想我应该提一下,我有点迷上了有时用于功能转换列表的长grep-map链.所以它不是foreach循环或while循环.这就是地图表达式倾向于将更多功能打包到同一垂直空间中.
以下是Perl 5.12上的调试会话.这有意义吗?是否UNIVERSAL缓存版本的@ISA变量,如果永远采用随后上.回到之前Class::ISA不推荐使用,我曾经打电话Class::ISA::self_and_super_path让内部人员重新看一下@ISA阵列.既然现在认为没必要,你如何让perl审核其内部记录?
DB<34> p $papa
Papushka=HASH(0x16bc0300)
DB<35> p $papa->isa('Nanushka')
DB<36> p $papa->isa('Babushka')
1
DB<37> x @Papushka::ISA
0 'Nanushka'
1 'Babushka'
Run Code Online (Sandbox Code Playgroud)
这是测试代码(显然).它获得相同的结果,运行平稳,作为测试运行或在调试中运行.我应该告诉你,在此之前@ISA = qw<Babushka>,我表演了
splice( @ISA, 0, 0, 'Nanushka' );
Run Code Online (Sandbox Code Playgroud)
那是问题吗?如果你永远只能push到@ISA?
如果执行CPU密集型任务,我认为每个核心有一个线程是最佳的.如果你有一个4核CPU,你可以运行4个CPU密集子程序实例而不会受到任何惩罚.例如,我曾经在四核CPU上实验性地运行了四个CPU密集型算法实例.每个过程最多四次没有减少.在第五个实例中,所有实例都需要更长
阻止操作的情况如何?假设我有一个包含1,000个网址的列表.我一直在做以下事情:
(请不要介意任何语法错误,我只是嘲笑这个)
my @threads;
foreach my $url (@urlList) {
push @threads, async {
my $response = $ua->get($url);
return $response->content;
}
}
foreach my $thread (@threads) {
my $response = $thread->join;
do_stuff($response);
}
Run Code Online (Sandbox Code Playgroud)
我基本上开始了与URL列表中的URL一样多的线程.如果有一百万个网址,则会启动一百万个主题.这是最优的,如果不是最佳线程数吗?对于可以等待的任何阻塞I/O操作(读取文件,数据库查询等),使用线程是一种很好的做法吗?
相关奖金问题
出于好奇,Perl线程的工作方式与Python相同,而且它是GIL吗?使用python来获得多线程的好处,并将所有内核用于CPU密集型任务,您必须使用多处理.
我刚刚开始使用驼鹿.
我正在创建一个简单的通知对象,并希望检查输入是否为"电子邮件"类型.(暂时忽略简单的正则表达式匹配).
从文档中我相信它应该类似于以下代码:
# --- contents of message.pl --- #
package Message;
use Moose;
subtype 'Email' => as 'Str' => where { /.*@.*/ } ;
has 'subject' => ( isa => 'Str', is => 'rw',);
has 'to' => ( isa => 'Email', is => 'rw',);
no Moose; 1;
#############################
package main;
my $msg = Message->new(
subject => 'Hello, World!',
to => 'coolkids@example.com'
);
print $msg->{to} . "\n";
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
String found where operator expected at message.pl line 5, near …
我是Perl的新手,我有一个非常简单的问题,但在查阅我的Perl书时我找不到答案.
打印结果时
Dumper($request);
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
$VAR1 = bless( {
'_protocol' => 'HTTP/1.1',
'_content' => '',
'_uri' => bless( do{\(my $o = 'http://myawesomeserver.org:8081/counter/')}, 'URI::http' ),
'_headers' => bless( {
'user-agent' => 'Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.4) Gecko/20080528 Epiphany/2.22 Firefox/3.0',
'connection' => 'keep-alive',
'cache-control' => 'max-age=0',
'keep-alive' => '300',
'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'accept-language' => 'en-us,en;q=0.5',
'accept-encoding' => 'gzip,deflate',
'host' => 'localhost:8081',
'accept-charset' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7'
}, 'HTTP::Headers' ),
'_method' => 'GET',
'_handle' => bless( \*Symbol::GEN0, 'FileHandle' )
}, 'HTTP::Server::Simple::Dispatched::Request' );
Run Code Online (Sandbox Code Playgroud)
如何访问'_method'('GET')或'host'('localhost:8081')的值.
我知道这是一个简单的问题,但Perl在开始时有点神秘.
我是Perl的新手,我正试图递归地构建一个哈希并且无处可去.我尝试搜索动态构建哈希的教程,但我能找到的只是关于哈希的介绍性文章.如果你指出我正确的方向或建议一篇好文章/教程,我将不胜感激.
我试图从一个文件中读取具有路径的文件
one/two/three
four
five/six/seven/eight
Run Code Online (Sandbox Code Playgroud)
我想建立像哈希一样的哈希
VAR = {
one : {
two : {
three : ""
}
}
four : ""
five : {
six : {
seven : {
eight : ""
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我目前使用的脚本是:
my $finalhash = {};
my @input = <>;
sub constructHash {
my ($hashrf, $line) = @_;
@elements = split(/\//, $line);
if(@elements > 1) {
$hashrf->{shift @elements} = constructHash($hashrf->{$elements[0]}, @elements );
} else {
$hashrf->{shift @elements} = "";
}
return $hashrf; …Run Code Online (Sandbox Code Playgroud) 基于我目前对Perl中哈希的理解,我希望这段代码可以打印出"hello world".它没有打印任何东西.
%a=();
%b=();
$b{str} = "hello";
$a{1}=%b;
$b=();
$b{str} = "world";
$a{2}=%b;
print "$a{1}{str} $a{2}{str}";
Run Code Online (Sandbox Code Playgroud)
我假设散列就像一个数组,为什么我不能让散列包含另一个?
最近有人告诉我,我们可以在Python中打印变量,就像Perl一样.
代替:
print("%s, %s, %s" % (foo, bar, baz))
Run Code Online (Sandbox Code Playgroud)
我们可以这样做:
print("%(foo)s, %(bar)s, %(baz)s" % locals())
Run Code Online (Sandbox Code Playgroud)
像在Perl中那样,在Python中打印变量的方式是不是很简单?我认为第二个解决方案实际上看起来非常好并且使代码更具可读性,但是那里的locals()让它看起来像是一种令人费解的方式.
我想将die消息重定向到一个单独的文件,以便我可以稍后比较该文件以确定出错的地方.
但是这段代码给了我错误:
$ cat test.pl
use strict;
use warnings;
my $log = "msglog.log";
die $log "DEAD$!";
$ perl test.pl
Missing comma after first argument to die function at test.pl line 5, near ""DEAD$!";"
Execution of test.pl aborted due to compilation errors.
$
Run Code Online (Sandbox Code Playgroud)
我不想2>从来电者那里做一个.有没有办法从脚本中重定向它们?