该网站http://openbook.etoro.com/#/main/有一个实时源,由javascript通过XHR保持活动请求生成,并从服务器获取gzip压缩JSON字符串的答案.
我想将Feed捕获到文件中.
通常的方式(WWW :: Mech ..)(可能)不可行,因为需要在页面中设计所有Javascripts并模拟浏览器是非常艰巨的任务,因此,寻找替代解决方案.
我的想法是使用中间人战术,所以broswser将完成他的工作,我想通过perl代理捕获通信 - 专门用于此任务.
我能够抓住最初的沟通,但不是饲料本身.代理工作正常,因为在浏览器中,Feed只运行我的文件管理器不起作用.
use HTTP::Proxy;
use HTTP::Proxy::HeaderFilter::simple;
use HTTP::Proxy::BodyFilter::simple;
use Data::Dumper;
use strict;
use warnings;
my $proxy = HTTP::Proxy->new(
port => 3128, max_clients => 100, max_keep_alive_requests => 100
);
my $hfilter = HTTP::Proxy::HeaderFilter::simple->new(
sub {
my ( $self, $headers, $message ) = @_;
print STDERR "headers", Dumper($headers);
}
);
my $bfilter = HTTP::Proxy::BodyFilter::simple->new(
filter => sub {
my ( $self, $dataref, $message, $protocol, $buffer ) = @_;
print STDERR "dataref", Dumper($dataref); …Run Code Online (Sandbox Code Playgroud) 该perlre说:
p
保留匹配的字符串,以便匹配后可以使用$ {^ PREMATCH},$ {^ MATCH}和$ {^ POSTMATCH}.
在Perl 5.20及更高版本中,这将被忽略.由于新的写时复制机制,无论修饰符如何,匹配后$ {^ PREMATCH},$ {^ MATCH}和$ {^ POSTMATCH}都可用.
也是perlvar
$ {^ MATCH}这类似于$&($ MATCH),除了它不会导致与该变量相关的性能损失.
在Perl v5.18及更早版本中,只保证在使用/ p修饰符编译或执行模式时返回定义的值.在Perl v5.20中,/ p修饰符不执行任何操作,因此$ {^ MATCH}与$ MATCH完全相同.
测试:
echo 'Lorem ipsum dolor sit ut dicta qui dolores.' |\
perl -nE 'say ${^MATCH} while m/dolor/g'
Run Code Online (Sandbox Code Playgroud)
输出:两个空行(2x \n)
但是:
echo 'Lorem ipsum dolor sit ut dicta qui dolores.' |\
perl -nE 'say ${^MATCH} while m/dolor/gp'
Run Code Online (Sandbox Code Playgroud)
输出:
dolor
dolor
Run Code Online (Sandbox Code Playgroud)
我的perl:
$ perl -v
This is perl …Run Code Online (Sandbox Code Playgroud) 当我做:
use strict; use warnings;
my $regex = qr/[[:upper:]]/;
my $line = MyModule::get_my_line_from_external_source(); #file, db, etc...
print "upper here\n" if( $line =~ $regex );
Run Code Online (Sandbox Code Playgroud)
Perl如何知道它何时必须匹配ascii uppercase以及何时匹配utf8 uppercase?它是一个预编译的正则表达式 - 所以有些perl必须知道,什么是大写.取决于区域设置?如果是,如何将"C"语言环境中的utf8大写与预编译的正则表达式匹配?
根据tchrist的评论更新:
use strict; use warnings; use Encode;
my $regex = qr/[[:upper:]]/;
my $line = XXX::line();
print "$line: upper1 ", ($line =~ $regex) ? "YES" : "NO", "\n";
my $uline = Encode::decode_utf8($line);
print "$uline: upper2 ", ($uline =~ $regex) ? "YES" : "NO", "\n";
package XXX;
sub line …Run Code Online (Sandbox Code Playgroud) 我有这个简单的PSGI应用程序(app.psgi).
use strict;
use warnings;
my $app = sub {
my $mem = `ps -o rss= -p $$`;
$mem =~ s/^\s*|\s*$//gs;
return [ 200, [ 'Content-Type' => 'text/text' ], [ $mem ]];
};
Run Code Online (Sandbox Code Playgroud)
我被要求上述1000次并增加了内存使用量.根据启动服务器的方式,得到:
plackup - 内存使用量在前3个请求中提高,并在接下来的997个请求中保持不变
plackup -r - 内存使用量随机增加(不是每次请求)4k.
starman - 如上所述,内存使用量随机增加4k,但速度较慢
问题是:
如果有人想测试这个 - 这是我的获取脚本:
use strict;
use warnings;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => 'http://localhost:5000');
my $old_mem = 0;
print "req#\tmem\n";
foreach my $i (1..1000) …Run Code Online (Sandbox Code Playgroud) 寻找perl one-liner什么会找到下一个模式的所有单词:
X(not_X_chrs)X(not_X_chrs)X e.g. cyclic
Run Code Online (Sandbox Code Playgroud)
对于一个角色,它很容易,例如'a'
perl -nle 'print if /^a[^a]+a[^a]+a$/' < /usr/share/dict/web2
Run Code Online (Sandbox Code Playgroud)
但是我想搜索任何一个字符,所以,寻找一个正则表达式来查找所有单词,如:
azalea #repeating a
baobab #repeating b
cyclic #c
Run Code Online (Sandbox Code Playgroud)
等等..
试过这个:
perl -nle 'print if m/^([a-z])[^$1]+$1[^$1]+$1$/i' </usr/share/dict/web2
Run Code Online (Sandbox Code Playgroud)
但不行.
在这个问题中,我看到了两个不同的答案,如何直接调用用C++编写的函数
我只是浏览了SO标签[perl] [swig]中的几乎所有问题,以便找到下一个问题的答案:
在我考虑它时,使用SWIG对于其他用途更为普遍,就像在这个问题中提到的那样,Inline :: CPP是perl特定的.但是,从perl的角度来看,这里有一些(任何)重大差异吗?
有下一个代码:
use strict;
use warnings;
use Devel::Peek;
use YAML;
my $s = {a=>'b'};
print Dump($s);
Run Code Online (Sandbox Code Playgroud)
它打印YAML输出:
---
a: b
Run Code Online (Sandbox Code Playgroud)
现在改变模块的顺序.
use strict;
use warnings;
use YAML;
use Devel::Peek;
my $s = {a=>'b'};
print Dump($s);
Run Code Online (Sandbox Code Playgroud)
它打印:
SV = IV(0x7ff5d2829308) at 0x7ff5d2829318
REFCNT = 1
FLAGS = (PADMY,ROK)
RV = 0x7ff5d2803438
SV = PVHV(0x7ff5d2808d20) at 0x7ff5d2803438
REFCNT = 1
FLAGS = (SHAREKEYS)
ARRAY = 0x7ff5d243acf0 (0:7, 1:1)
hash quality = 100.0%
KEYS = 1
FILL = 1
MAX = 7
Elt "a" …Run Code Online (Sandbox Code Playgroud) 现在有:
has 'id' => (
is => 'rw',
isa => 'Str',
default => sub { "id" . int(rand(1000))+1 }
);
Run Code Online (Sandbox Code Playgroud)
工作正常,:
PKG->new(id => 'some'); #the id is "some"
PKG->new() #the id is #id<random_number>
Run Code Online (Sandbox Code Playgroud)
在下一个场景中:
my $value = undef;
PKG->new(id => $value);
Run Code Online (Sandbox Code Playgroud)
(当然)有一个错误:
Attribute (id) does not pass the type constraint because: Validation failed for 'Str' with value undef at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-thread-multi-2level/Moose/Exception.pm line 37
Run Code Online (Sandbox Code Playgroud)
问题是:
如何在设置为undef之后更改值(并且仅当它是$ undef时)?所以,
has 'id' => (
is => 'rw',
isa => 'Str|Undef', #added undef to acceptable Type …Run Code Online (Sandbox Code Playgroud) 在模块中,我需要一些Imager :: Search操作的图像数据(BMP).以下作品,
my $pattern = Imager::Search::Pattern->new(
driver => 'Imager::Search::Driver::BMP24',
file => 'test.bmp', #load the image from a file
);
Run Code Online (Sandbox Code Playgroud)
该图像(test.bmp)对我来说是恒定的,所以想直接在源代码作为其存储
my $image = ... the image data ... ;
Run Code Online (Sandbox Code Playgroud)
或在该__DATA__部分.
什么是存储二进制数据(如此test.bmp)的推荐方法__DATA__?(2.3kb的).
在挖掘一些旧的源代码时,我看到了以下内容:
my $module = $some{module};
eval "require $module";
die "Bad module\n$@" if $@;
Run Code Online (Sandbox Code Playgroud)
当我理解代码的作用时,它会尝试"需要"一个模块并在它不成功时死掉 - perlcritic抱怨它
第31栏第13栏"eval"的表达形式.参见PBP第161页.(严重程度:5)
不幸的是我没有PBP书,所以想知道上面的正确方法是什么...
此外,在相同的来源发现:
sub test_repo_file {
my($self, $repo, $test) = @_;
my $abspath = repo_abs_path($repo);
return "eval -$test $abspath";
}
Run Code Online (Sandbox Code Playgroud)
这里不明白什么解决了"eval",并且perlcritic再次抱怨"字符串评估"......
有人可以解释关于"字符串评估"的基本要点以及如何正确编写上述内容吗?