小编fri*_*edo的帖子

使用MooseX :: Declare关闭内联构造函数

问候,

作为我之前关于Moose的问题的后续内容,我现在遇到了一个新问题.我有一个Moose类,它使用Recipe 12来扩展非Moose父类.这里是:

package MyApp::CGI;

### TODO: make this work with MooseX::Declare?

use Moose;
extends 'CGI::Application';

sub new { 
    my $class = shift;
    my $obj = $class->SUPER::new( @_ );
    return $class->meta->new_object( __INSTANCE__ => $obj, @_ );
}

sub setup {
    my $self = shift;
    $self->start_mode( 'main' );

    my @methods = map { $_->name } $self->meta->get_all_methods;

    $self->run_modes( map  { /^rm_(.+)$/  => $_ }
                      grep { /^rm_/ }
                      @methods
                    );        
}
Run Code Online (Sandbox Code Playgroud)

这非常有效.我也有这个类的子类使用MooseX::Declare.但是,因为我现在覆盖了默认的Moose构造函数,所以我的子类会发出以下警告:

Not inlining …
Run Code Online (Sandbox Code Playgroud)

oop perl moose mop

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

在Perl中通过网络发送二进制安全数据

我正在实现一个向服务器发送消息的网络客户端.消息是字节流,协议要求我事先发送每个流的长度.

如果我给出的消息(通过使用我的模块的代码)是一个字节字符串,那么长度很容易给出length $string.但如果它是一串字符,我需要按摩它以获得原始字节.我现在正在做的基本上是这样的:

my $msg = shift;   # some message from calling code
my $bytes;
if ( utf8::is_utf8( $msg ) ) { 
    $bytes = Encode::encode( 'utf-8', $msg );
} else { 
    $bytes = $msg;
}

my $length = length $bytes;
Run Code Online (Sandbox Code Playgroud)

这是处理这个问题的正确方法吗?它似乎工作到目前为止,但我还没有做过任何严肃的测试.这种方法有哪些潜在的缺陷?

谢谢

unicode perl network-programming utf-8

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

如何在Perl的DBI中使用占位符来实现可变参数SQL函数?

我不知道"variadic"实际上是否是正确的词,但我在谈论可以采用一系列值的事情,比如IN().如果您已经使用DBI很长时间,您可能尝试这样做:

(注意:为简洁起见,所有示例都非常简化)

my $vals = join ', ', @numbers;
my $sth = $dbh->prepare( "SELECT * FROM mytbl WHERE foo IN( ? )" );
$sth->execute( $vals );     # doesn't work
Run Code Online (Sandbox Code Playgroud)

DBI占位符根本不支持这些类型的恶作剧,?据我所知,它是每个或不需要的单个值.

这导致我最终做了类似的事情:

my $sth = $dbh->prepare( "SELECT * FROM mytbl WHERE foo IN ( $vals )" );
Run Code Online (Sandbox Code Playgroud)

这不是那么可怕,但考虑一个函数,就像我今天写的一样,必须接受一些带有IN子句和值列表的任意SQL

sub example { 
    my $self = shift;
    my ( $sql, @args ) = @_;

    my $vals = join ', ', @args;
    $sql =~ s/XXX/$vals/;    <---- …
Run Code Online (Sandbox Code Playgroud)

sql perl dbi

4
推荐指数
3
解决办法
2278
查看次数

如何检测程序是否在PAR存档中运行?

我正在研究一个与PAR捆绑在一起的大型Perl应用程序,以及一堆支持文件.

当应用程序在PAR中运行时,我可以PAR::read_file用来获取存档中的这些各种文件.但是,在我开发的过程中,我不想每次调整一些代码时都必须对整个应用程序进行重新PAR.

有没有办法告诉我脚本是否在PAR内运行,所以我可以选择从PAR存档或常规文件系统加载文件?

perl zip par

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

构建位于反向代理后面的应用程序时处理URI的策略

我正在构建一个带有自包含HTTP服务器的应用程序,可以直接访问,也可以放在反向代理(如Apache mod_proxy)之后.

所以,假设我的应用程序在端口8080上运行,你就像这样设置你的Apache:

ProxyPass /myapp http://localhost:8080
ProxyPassReverse /myapp http://localhost:8080
Run Code Online (Sandbox Code Playgroud)

这将导致进入主Apache服务器的HTTP请求/myapp/*将代理到我的应用程序.如果请求进来GET /myapp/bar,我的应用程序将会看到GET /bar.这是应该的.

出现的问题是生成必须从我的应用程序的URI空间转换的URI,以便通过代理正常工作(即前置/myapp/).

ProxyPassReverse指令负责处理HTTP头中的URI(重定向等等).但是这不处理由我的应用程序或静态文件和模板生成的HTML中的URI.

我知道像这样的过滤器mod_proxy_html,但这是一个非标准的Apache模块,在任何情况下,这些过滤器可能无法用于其他能够充当反向代理的前端Web服务器.

所以我想出了一些可能的策略:

  1. 需要在包含代理路径的某处设置环境变量,并将其添加到所有生成的URI之前.这似乎不优雅; 它打破了反向代理提供的封装.

  2. 将代理路径放在我的应用程序的配置文件中.与上述相同的反对意见.

  3. 在我的应用程序中仅使用相对URI.这可能有点棘手; 我必须计算当前资源和链接的位置之间的路径差异,并添加适当数量的../'es.看起来很乱.另一个问题是有些东西必须生成绝对URI,比如RSS提要和生成的电子邮件.

  4. 在前端使用一些hacky Javascript来粘贴文档文本中的URI.从互操作性的角度来看,这似乎是一个非常可怕的想法.

  5. 在我的代码中使用单一的URI生成函数,并要求通过我的模板系统运行"静态"文件,如Javascript,CSS等.这是我现在倾向于的想法.

这一定是一个相当普遍的问题.你过去怎么接近它?什么有用,什么使事情变得更加困难?

apache proxy http

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

Perl - 将空字符串用作false是一种好习惯吗?

在布尔比较中,在Perl中使用空字符串作为false是安全/良好的做法吗?

例如:

my $s = '';

if($s) {
 print 'true';
} else {
 print 'false';
}
Run Code Online (Sandbox Code Playgroud)

或者长度函数是更好的方法:

my $s = '';

if(length($s) > 0) {
 print 'true';
} else {
 print 'false';
}
Run Code Online (Sandbox Code Playgroud)

string perl

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

从Moose BUILD方法中呱呱叫

如果BUILD方法失败,我希望我的班级爆炸.但是,如果我croak用来处理错误,则会报告错误Class/MOP/Method.pm,而不是调用者的代码.(也就是说,实例化对象的调用者.)IOW,croak在调用树上没有吠叫.

看吧:

package Test;

use Moose;
use Carp 'croak';

sub BUILD {
    croak 'u r dum';
}

1;
Run Code Online (Sandbox Code Playgroud)

实例化Test结果:

u r dum at /home/friedo/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/Class/MOP/Method.pm line 125
Run Code Online (Sandbox Code Playgroud)

Carp.pm应该注意一个名为变量的包变量@CARP_NOT来知道要避免哪些包,但它似乎只关注列表中的一个项目.例如,如果我将其添加到我的Test.pm:

our @CARP_NOT = ( 'Class::MOP::Method' );
Run Code Online (Sandbox Code Playgroud)

然后结果是:

u r dum at /home/friedo/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/Moose/Object.pm line 59
Run Code Online (Sandbox Code Playgroud)

所以我也应该将添加到数组中,对吧?

our @CARP_NOT = ( 'Class::MOP::Method', 'Moose::Object'  );
Run Code Online (Sandbox Code Playgroud)

然后结果仍然是:

u r dum at /home/friedo/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/Moose/Object.pm line 59
Run Code Online (Sandbox Code Playgroud)

Moose::Object 似乎没有受到影响.

我现在一直在反对这个问题,现在似乎无法弄清楚是什么弄乱了它.

谢谢.

perl moose carp

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

Perl中的输出流:STDERR,STDOUT,

我知道输出流STDOUT和STDERR.每当你打印到STDOUT时,在unix shell中你可以像这样重定向输出......

deviolog@home:~$ perl test_script.pl > output.txt
Run Code Online (Sandbox Code Playgroud)

要么

deviolog@home:~$ perl test_script.pl 1> output.txt
Run Code Online (Sandbox Code Playgroud)

当您打印到STDERR时,它看起来相同,但您切换到"频道"(?)编号2:

deviolog@home:~$ perl test_script.pl 2> output.txt
Run Code Online (Sandbox Code Playgroud)

我可以在output.txt中找到我当时正在打印的错误输出.

我的问题是,我可以以某种方式访问​​"频道"3号吗?有什么像......

 print STDX "Hello World!\n";
Run Code Online (Sandbox Code Playgroud)

...允许重定向,如下所示?

deviolog@home:~$ perl test_script.pl 3> output.txt
Run Code Online (Sandbox Code Playgroud)

ps一个子问题将是那些"通道"^ _ ^的术语

unix io perl

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

设置DOM创建的元素的名称在IE中失败 - 解决方法?

今天我有点辛苦了:

function mk_input( name, val ) {
    var inp = document.createElement( 'input' );
    inp.name = name;
    inp.value = val;
    inp.type = 'hidden';

    return inp;
}
Run Code Online (Sandbox Code Playgroud)

事实证明,设置name通过创建的元素createElement在IE中不起作用.它不会导致错误或任何事情,它只是默默地失败,导致人们思考为什么他们的隐藏字段没有正确填充.

据我所知,没有解决方法.你必须咬住子弹并<input>通过字符串操作创建标签并将其粘贴在其中.innerHTML.

有没有更好的办法?也许像jQuery这样的东西?我做了一个粗略的搜索,并没有找到任何与createElementJQuery 完全类似的东西,但也许我错过了一些东西.

javascript jquery internet-explorer dom

3
推荐指数
1
解决办法
7263
查看次数

使用@符号识别像twitter这样的用户

我正在创建自己的twitter版本,我不知道如何让我的后端PHP脚本在输入的文本中选取@membername.包括多个@ membername,例如@billy @joseph,@ tyrone,@ kesha message

要么

@billy打电话给@tyrone他正在责怪@kesha关于你欠他的钱.

有关如何实现此目的的任何脚本?

php regex twitter

3
推荐指数
1
解决办法
281
查看次数

标签 统计

perl ×7

moose ×2

apache ×1

carp ×1

dbi ×1

dom ×1

http ×1

internet-explorer ×1

io ×1

javascript ×1

jquery ×1

mop ×1

network-programming ×1

oop ×1

par ×1

php ×1

proxy ×1

regex ×1

sql ×1

string ×1

twitter ×1

unicode ×1

unix ×1

utf-8 ×1

zip ×1