问候,
作为我之前关于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) 我正在实现一个向服务器发送消息的网络客户端.消息是字节流,协议要求我事先发送每个流的长度.
如果我给出的消息(通过使用我的模块的代码)是一个字节字符串,那么长度很容易给出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)
这是处理这个问题的正确方法吗?它似乎工作到目前为止,但我还没有做过任何严肃的测试.这种方法有哪些潜在的缺陷?
谢谢
我不知道"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) 我正在研究一个与PAR捆绑在一起的大型Perl应用程序,以及一堆支持文件.
当应用程序在PAR中运行时,我可以PAR::read_file用来获取存档中的这些各种文件.但是,在我开发的过程中,我不想每次调整一些代码时都必须对整个应用程序进行重新PAR.
有没有办法告诉我脚本是否在PAR内运行,所以我可以选择从PAR存档或常规文件系统加载文件?
我正在构建一个带有自包含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服务器.
所以我想出了一些可能的策略:
需要在包含代理路径的某处设置环境变量,并将其添加到所有生成的URI之前.这似乎不优雅; 它打破了反向代理提供的封装.
将代理路径放在我的应用程序的配置文件中.与上述相同的反对意见.
在我的应用程序中仅使用相对URI.这可能有点棘手; 我必须计算当前资源和链接的位置之间的路径差异,并添加适当数量的../'es.看起来很乱.另一个问题是有些东西必须生成绝对URI,比如RSS提要和生成的电子邮件.
在前端使用一些hacky Javascript来粘贴文档文本中的URI.从互操作性的角度来看,这似乎是一个非常可怕的想法.
在我的代码中使用单一的URI生成函数,并要求通过我的模板系统运行"静态"文件,如Javascript,CSS等.这是我现在倾向于的想法.
这一定是一个相当普遍的问题.你过去怎么接近它?什么有用,什么使事情变得更加困难?
在布尔比较中,在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) 如果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 似乎没有受到影响.
我现在一直在反对这个问题,现在似乎无法弄清楚是什么弄乱了它.
谢谢.
我知道输出流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一个子问题将是那些"通道"^ _ ^的术语
今天我有点辛苦了:
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 完全类似的东西,但也许我错过了一些东西.
我正在创建自己的twitter版本,我不知道如何让我的后端PHP脚本在输入的文本中选取@membername.包括多个@ membername,例如@billy @joseph,@ tyrone,@ kesha message
要么
@billy打电话给@tyrone他正在责怪@kesha关于你欠他的钱.
有关如何实现此目的的任何脚本?