标签: perl5

Perl:匿名子程序中的原型

我目前正在学习有关类型和名称空间的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 prototype namespaces typeglob perl5

8
推荐指数
1
解决办法
251
查看次数

什么是间接对象表示法,为什么它不好,以及如何避免它?

标题几乎总结了,但无论如何这里是长版本.

在发布了一小段perl代码之后,我被告知要避免使用间接对象表示法,"因为它有几个副作用".评论引用了这一特定的行:

my $some_object = new Some::Module(FIELD => 'value');
Run Code Online (Sandbox Code Playgroud)

因为这就是我一直以来的做法,为了与时俱进,我因此问:

  • 这有什么不好的?(特别)
  • 潜在的(可能是负面的)副作用是什么?
  • 应该如何重写该行?

我正要问这位评论者,但对我而言,这是值得发表的.

oop perl coding-style perl5

8
推荐指数
3
解决办法
356
查看次数

Perl6 vs Perl5使用素数进行基准测试

这是一个讨论从这个HN线程移到这里,关于Perl6与Perl5与其他语言的基准测试,使用一种算法来实现SundaramSieve用于查找素数.

这是原始主题中的原始代码:

perl5 0m0.156s

perl6 0m6.615s

问题是与Perl5实现相比,Perl6版本需要很长时间才能找到素数.部分原因是使用float作为输入,但仍然太慢了.

目标不一定是优化算法,而是确定为什么Perl6与其他语言相比如此之慢.

benchmarking primes perl6 perl5

8
推荐指数
2
解决办法
768
查看次数

有没有人有Perl5i的经验?

我偶尔会看到Perl5i被提及.它看起来很棒,让事情变得更容易.一些问题:

  1. 该模块是否与其他模块兼容,例如Dancer,Mojolicious,XML :: RSS等?

  2. 它与Moose兼容,还是具有更好的OO功能?

  3. 它包装了最好的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)

任何经验,好的和坏的,请分享.

perl perl5 perl5i

7
推荐指数
1
解决办法
319
查看次数

Perl:优雅的方式来检查某些东西是否像包裹一样被祝福?

我想检查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__)是另一种方式,但这种方法允许更多的东西.

perl bless perl5

7
推荐指数
1
解决办法
2348
查看次数

如何知道收到信号时正在执行哪一行代码

我正在尝试做这样的事情

$SIG{ALRM} = sub {
    print $line_number_when_alarm_went_off;
};

alarm 10;

# rest of the script
Run Code Online (Sandbox Code Playgroud)

我正在使用ALRM一个例子,我将最终使用不同的信号从外部杀死以触发它.这种操作有一种巧妙的方法吗?

我有一些慢脚本,有时我想给他们一个信号,知道那时代码在哪里.

我希望尽可能不引人注目,这样我就可以打包并将其添加到遗留代码中.

perl interrupt perl5

7
推荐指数
1
解决办法
123
查看次数

在Perl中使用带有标量和I/O层的open()时的编码非确定性

几个小时了,我正在打击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)时,它打印UndecodedDecoded具有大致相同的频率.当我更改我写入"文件"的字符串时,例如在其末尾添加换行符,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)

perl utf-8 character-encoding perl-io perl5

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

Mojolicious会话不会过期

我正在使用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)

将会话设置为过期的行被调用,但在重定向之后,会话仍包含登录的用户名.

session mojolicious perl5

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

如何使用嵌套闭包作为List :: Util :: reduce的第一个参数?

注意:这个问题中的闭包只是一个方便的例子; 我实际使用的那个比这复杂得多.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)

perl closures perl5

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

如何使用perl从第一次出现具有特定值的元素循环数组?

我有一个像阵列("值a","VALUEB","valueC","价值")等.我要循环的数组的值从(例如)"valueC"的第一个实例开始.应该忽略值"valueC"的第一个实例之前的数组中的所有内容; 所以在这种情况下,循环只处理"valueC"和"valueD".

我可以在我的循环中放置一个条件,但是有一种更简洁的方式来表达使用perl的想法吗?

arrays perl loops perl5

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