我目前正在学习有关类型和名称空间的Perls系统.所以我写了一个模块,它接受一个常量的值和名称两个参数,并将常量输出到调用者.$ package变量等于caller [2].
*{"$package::$name"} = sub () { return $value; };
Run Code Online (Sandbox Code Playgroud)
上面的代码完成了将匿名子例程导出到调用者符号表中的工作.因为我的目标是构建我自己的常量实现,子例程有一个空原型,这意味着它是一个只读子程序.
但这是我的问题:原型不起作用.所以
print &TestConst; #works well
print TestConst(); #works well
print TestConst; #Name "main::TestConst" used only once: possible typo at testscript.pl line 7.
Run Code Online (Sandbox Code Playgroud)
我的想法有什么问题吗?还有另一种方法吗?
标题几乎总结了,但无论如何这里是长版本.
在发布了一小段perl代码之后,我被告知要避免使用间接对象表示法,"因为它有几个副作用".评论引用了这一特定的行:
my $some_object = new Some::Module(FIELD => 'value');
Run Code Online (Sandbox Code Playgroud)
因为这就是我一直以来的做法,为了与时俱进,我因此问:
我正要问这位评论者,但对我而言,这是值得发表的.
我偶尔会看到Perl5i被提及.它看起来很棒,让事情变得更容易.一些问题:
该模块是否与其他模块兼容,例如Dancer,Mojolicious,XML :: RSS等?
它与Moose兼容,还是具有更好的OO功能?
它包装了最好的CPAN模块,如果我的脚本使用这些...
use strict;
use utf8::all;
use XML::RSS::JavaScript;
use DateTime::Format::Mail;
Run Code Online (Sandbox Code Playgroud)
......我应该用以下代替它:
use perl5i::2;
use XML::RSS::JavaScript;
use DateTime::Format::Mail;
Run Code Online (Sandbox Code Playgroud)任何经验,好的和坏的,请分享.
我想检查a $thing是否是一个受祝福的对象(例如__PACKAGE__).一个想法是:
use Scalar::Util qw(blessed);
defined blessed $thing && blessed $thing eq __PACKAGE__
Run Code Online (Sandbox Code Playgroud)
是否有更好和/或更优雅的方法,以避免检查是否blessed定义了返回值?
另一种方法是(blessed $thing or '') eq __PACKAGE__,但我不确定包装是否可以合法地为空.
另外,基于Perl Monks,UNIVERSAL::isa($thing, __PACKAGE__)是另一种方式,但这种方法允许更多的东西.
我正在尝试做这样的事情
$SIG{ALRM} = sub {
print $line_number_when_alarm_went_off;
};
alarm 10;
# rest of the script
Run Code Online (Sandbox Code Playgroud)
我正在使用ALRM一个例子,我将最终使用不同的信号从外部杀死以触发它.这种操作有一种巧妙的方法吗?
我有一些慢脚本,有时我想给他们一个信号,知道那时代码在哪里.
我希望尽可能不引人注目,这样我就可以打包并将其添加到遗留代码中.
几个小时了,我正在打击Perl程序中的一个错误.我不确定我是做错了还是解释器做了什么,但代码是非确定性的,而它应该是确定性的,IMO.此外,它在古代Debian Lenny(Perl 5.10.0)和刚刚升级到Debian Wheezy(Perl 5.14.2)的服务器上表现出相同的行为.它归结为这段Perl代码:
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";
my $c = "";
open C, ">:utf8", \$c;
print C "š";
close C;
die "Does not happen\n" if utf8::is_utf8($c);
print utf8::decode($c) ? "Decoded\n" : "Undecoded\n";
Run Code Online (Sandbox Code Playgroud)
它在严格模式下初始化Perl 5解释器并启用警告,使用字符串(而不是字节字符串)和以UTF8编码的命名标准流(UTF-8的内部概念,但非常接近;更改为完整的UTF-8没有区别).然后它打开一个"内存文件"(标量变量)的文件句柄,在其中打印一个双字节UTF-8字符,并在关闭时检查该变量.
标量变量现在总是将UTF8位翻转掉.但是它有时包含一个字节字符串(转换为字符串via utf8::decode()),有时还需要一个只需要翻转其UTF8位(Encode::_utf8_on())的字符串.
当我重复执行我的代码(1000次,通过Bash)时,它打印Undecoded并Decoded具有大致相同的频率.当我更改我写入"文件"的字符串时,例如在其末尾添加换行符,Undecoded消失.当utf8::decode成功,我尝试了在一个循环中相同的原始字符串,它不断在翻译的同一个实例成功; 但是,如果它失败了,它会一直失败.
对观察到的行为有什么解释?如何将文件句柄与字符串一起用于标量变量?
巴什游乐场:
for i in {1..1000}; do perl -we 'use strict; use utf8; binmode STDOUT, ":utf8"; binmode STDERR, ":utf8"; my …Run Code Online (Sandbox Code Playgroud) 我正在使用mojolicious构建一个Web应用程序.注销功能仅在本地计算机上运行应用程序时有效.当我尝试注销服务器上运行的应用程序时,会话不会过期,我仍然保持登录状态.
当我们通过POST请求更改注销而不是get时,就会发生这种情况.
我们调用logout的方式是来自前端的AJAX调用:
function do_logout() {
$.post( "<%= url_for('on_logout') %>", function() {});
}
Run Code Online (Sandbox Code Playgroud)
退出路线:
$if_login->post('/logout')->name('on_logout')->to('user#on_logout');
Run Code Online (Sandbox Code Playgroud)
注销控制器:
sub on_logout {
my $self = shift;
$self->session(expires => 1);
return $self->redirect_to('home');
}
Run Code Online (Sandbox Code Playgroud)
将会话设置为过期的行被调用,但在重定向之后,会话仍包含登录的用户名.
注意:这个问题中的闭包只是一个方便的例子; 我实际使用的那个比这复杂得多.IOW,请忽略这个关闭的细节; 重要的是AFAICT,它指的是父范围内的词汇变量.
我想重新定义foo下面的sub ,以便调用中的第一个参数List::Util::reduce替换为对嵌套闭包的引用.
use strict;
use warnings FATAL => 'all';
use List::Util;
sub foo {
my ( $x, $y ) = @_;
return List::Util::reduce { $y->[ $b ]{ $x } ? $a + ( 1 << $b ) : $a } 0, 0 .. $#$y;
}
Run Code Online (Sandbox Code Playgroud)
我的第一次尝试是这样的:
sub foo {
my ( $x, $y ) = @_;
sub z {
our ( $a, $b );
return exists $y->[ $b ]{ $x } ? $a …Run Code Online (Sandbox Code Playgroud) 我有一个像阵列("值a","VALUEB","valueC","价值")等.我要循环的数组的值从(例如)"valueC"的第一个实例开始.应该忽略值"valueC"的第一个实例之前的数组中的所有内容; 所以在这种情况下,循环只处理"valueC"和"valueD".
我可以在我的循环中放置一个条件,但是有一种更简洁的方式来表达使用perl的想法吗?
perl5 ×10
perl ×8
arrays ×1
benchmarking ×1
bless ×1
closures ×1
coding-style ×1
interrupt ×1
loops ×1
mojolicious ×1
namespaces ×1
oop ×1
perl-io ×1
perl5i ×1
perl6 ×1
primes ×1
prototype ×1
session ×1
typeglob ×1
utf-8 ×1