小编kob*_*ame的帖子

Perl - HTTP :: Proxy捕获XHR/JSON通信

该网站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)

perl forex

6
推荐指数
1
解决办法
998
查看次数

perl v24中的$ {^ MATCH}和/ p修饰符

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)

perl

6
推荐指数
1
解决办法
109
查看次数

Perl预编译正则表达式 - utf8

当我做:

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)

regex unicode perl utf-8

5
推荐指数
1
解决办法
728
查看次数

为什么要提高plackup(或starman)的内存使用率?

我有这个简单的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,但速度较慢

问题是:

  • 为什么提高内存使用率?泄漏在哪里,以及如何实现恒定的内存使用(特别是在starman上),因为我不想长期耗尽内存.(好的,可以定义例如--max-requests 100),但它不是内存使用的答案.
  • 或者 - 我的例子有什么问题?

如果有人想测试这个 - 这是我的获取脚本:

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 plack psgi

5
推荐指数
1
解决办法
1625
查看次数

搜索具有任何重复字符的单词

寻找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)

但不行.

regex perl

5
推荐指数
1
解决办法
247
查看次数

使用Inline :: CPP与SWIG - 何时?

这个问题中,我看到了两个不同的答案,如何直接调用用C++编写的函数

  1. 内联:: CPP(以及更多内容,如Inline :: C,Inline :: Lua等...)
  2. 痛饮
  3. 手工制作(如daxim所说 - 大多数模块都是手写的)

我只是浏览了SO标签[perl] [swig]中的几乎所有问题,以便找到下一个问题的答案:

  • 使用(选择)SWIG和Inline :: CPP或手写的主要区别是什么?
  • 何时是"良好做法" - 推荐使用Inline :: CPP(或内联:C),何时推荐使用SWIG或手写?

在我考虑它时,使用SWIG对于其他用途更为普遍,就像在这个问题中提到的那样,Inline :: CPP是perl特定的.但是,从perl的角度来看,这里有一些(任何)重大差异吗?

perl swig

5
推荐指数
1
解决办法
699
查看次数

如何检测导出的子覆盖?

有下一个代码:

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)

perl

5
推荐指数
1
解决办法
100
查看次数

Moose如何仅在$ undef时更改属性值?

现在有:

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)

perl moose

4
推荐指数
1
解决办法
1130
查看次数

在__DATA__句柄中存储二进制数据

在模块中,我需要一些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的).

perl

4
推荐指数
1
解决办法
601
查看次数

perlcritic:eval"require $ module";

在挖掘一些旧的源代码时,我看到了以下内容:

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再次抱怨"字符串评估"......

有人可以解释关于"字符串评估"的基本要点以及如何正确编写上述内容吗?

perl perl-critic

4
推荐指数
2
解决办法
1327
查看次数

标签 统计

perl ×10

regex ×2

forex ×1

moose ×1

perl-critic ×1

plack ×1

psgi ×1

swig ×1

unicode ×1

utf-8 ×1