小编Cha*_*ens的帖子

我需要一个便携,一致的伪随机数生成器

我正在编写一个孩子姐妹加密函数,我需要一个PRNG,它可以在OS上产生一致的结果(所以没有浮点数学,利用硬件或系统级软件).如果PRNG的持续时间超过2 30,这将是一件好事,但并非必要.

我目前正在使用32位Xorshift:

#!/usr/bin/perl

use strict;
use warnings;

{
    use integer; #use integer math
    my $x = 123456789;
    my $y = 362436069;
    my $w = 88675123; 
    my $z = 521288629;

    sub set_random_seed {
        $w = shift;
    }

    sub random { 
        my $t = $x ^ ($x << 11);
        $x = $y;
        $y = $z;
        $z = $w;
        my $rand = $w = ($w ^ ($w >> 19)) ^ ($t ^ ($t >> 8)); 
        return $rand …
Run Code Online (Sandbox Code Playgroud)

perl prng

5
推荐指数
2
解决办法
1464
查看次数

它在文档中的哪个位置说测试readdir的定义性?

另请参阅:readdir的"0"如何在while条件下不是false?.(不重复;只是密切相关.)


它在文档中的哪个位置说测试readdir的定义性?例如,这段代码

#!/usr/bin/perl

use strict;
use warnings;

opendir my $dir, "/tmp" or die "$!";

while (my $file = readdir($dir)) {
        print "$file\n";
}
closedir $dir;
Run Code Online (Sandbox Code Playgroud)

当运行B :: Deparse时:

use warnings;
use strict 'refs';
die "$!" unless opendir my $dir, '/tmp';
while (defined(my $file = readdir $dir)) {
    do {
        print "$file\n"
    };
}
z.pl syntax OK
Run Code Online (Sandbox Code Playgroud)

我期待这种行为,但我找不到它的指定位置.在perlopI/O运算符部分,它说

以下行是等效的:

     while (defined($_ = <STDIN>)) { print; }
     while ($_ = …

perl perldoc

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

在MooseX :: Declare中创建BUILD方法的正确方法是什么?

BUILDMooseX :: Declare中的方法有困难.如果我说:

#!/usr/bin/perl

use MooseX::Declare;

class Foo {
    has foo => (is => "rw", isa => "Str", default => "foo");

    method BUILD {
        print "I was called\n";
    }
}

Foo->new;
Run Code Online (Sandbox Code Playgroud)

我得到以下不是有用的错误消息:

Reference found where even-sized list expected at /Users/cowens/perl5/lib/perl5/MooseX/Method/Signatures/Meta/Method.pm line 335.
Validation failed for 'MooseX::Types::Structured::Tuple[MooseX::Types::Structured::Tuple[Object],MooseX::Types::Structured::Dict[]]' failed with value [ [ Foo=HASH(0x804b20) ], { HASH(0x8049e0) => undef } ], Internal Validation Error is: Validation failed for 'MooseX::Types::Structured::Dict[]' failed with value { HASH(0x8049e0) => undef } at …
Run Code Online (Sandbox Code Playgroud)

perl moose

5
推荐指数
3
解决办法
939
查看次数

Perl如何决定在表达式中评估术语的顺序?

鉴于代码:

my $x = 1;

$x = $x * 5 * ($x += 5);
Run Code Online (Sandbox Code Playgroud)

我希望$x180:

$x = $x * 5 * ($x += 5); #$x = 1
$x = $x * 5 * 6;         #$x = 6
$x = 30 * 6;
$x = 180;
180;
Run Code Online (Sandbox Code Playgroud)

但相反,它是30; 但是,如果我更改条款的顺序:

$x = ($x += 5) * $x * 5;
Run Code Online (Sandbox Code Playgroud)

我明白了180.我感到困惑的原因是perldoc perlop非常清楚地说:

TERM在Perl中具有最高优先级.它们包括变量,引号和类似引号的运算符,括号中的任何表达式,以及其参数为括号的任何函数.

由于($x += 5)在括号中,它应该是一个术语,因此首先执行,而不管表达式的顺序如何.

perl operator-precedence associativity

5
推荐指数
2
解决办法
1096
查看次数

在Perl 5中定义了负操作数的%的行为?

直到最近(即C99),模运算符的行为是在C中定义的实现.由于Perl 5是用C编写的,它是否依赖于用于构建它的C编译器的行为?

perl modulo

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

如何在XML Schema中指定常量属性?

阅读XML Schema规范,我看不到将属性标记为常量的简单方法(例如,<foo bar="baz" />bar属性中必须始终如此baz).到目前为止,我唯一提出的方法是使用只有一个元素的枚举.这是首选方法吗?

xml xsd

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

空列表可以在标量上下文中吗?

有一个谎言,标量上下文中的列表产生列表的最后一个元素.这是一个谎言,因为(俗话说)你不能在标量上下文中有一个列表.看起来像标量上下文中的列表实际上是标量上下文中的逗号运算符,它在标量上下文中具有不同的行为.

但是,在这个逻辑中似乎存在一个循环漏洞:空列表(有时称为空列表).字符()定义为空列表perldoc perlglossary.构造

my $s = ();
Run Code Online (Sandbox Code Playgroud)

是有效的代码,并返回undef$s.这似乎没有在任何地方记录perldoc(我没有检查过Camel),但是很多代码都在它上面,所以我认为它就在这里.

既然序言已经完成,那么问题是:如果我们不能在标量上下文中有一个列表,那么我们在标量上下文中将什么称为空列表,什么是不将其称为列表的理由(因为没有逗号)在标量语境中)?

如果您喜欢这个问题,您可能也喜欢P5P中正在进行讨论.

perl list scalar-context

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

如何在Template :: Toolkits CATCH块中发出警告?

我正在处理的代码在模板中有一堆TRY/ CATCHTemplate::Toolkit.它们看起来像这样:

[% TRY; x = OBJ.method(data); CATCH; "<!-- error: $error -->"; END %]
Run Code Online (Sandbox Code Playgroud)

从两个角度来看这很糟糕.首先,错误被插入到交给用户的HTML中,其次,很难为开发人员找到错误.在我看来,所有错误都应该记录到相同的错误日志中.现在我通过这个warn功能做到了.我已将上面的代码更改为

[% TRY %]
    [% x = OBJ.foo(data) %]
[% CATCH %]
    [% RAWPERL %]
        warn "error calling method foo on a bar object: " . $stash->get("error");
    [% END %]
[% END %]
Run Code Online (Sandbox Code Playgroud)

但这对于应该是一件简单的事情来说过于冗长.有没有更好的方法我不知道这样做?

perl template-toolkit

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

为什么不从@ARGV/@ _映射读取?

没有给出参数列表时,是否有充分的理由map不读取@_(在函数中)或@ARGV(在其他任何地方)?

perl

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

如何创建在不同标量上下文中返回不同值的对象?

我想在字符串上下文和数字上下文中返回不同的值$!.我知道我可以通过wantarray找出我是否在列表或标量上下文中,但是在纯Perl中是否有任何方法来确定我所处的标量上下文?我假设在XS中也有答案,如果在纯Perl中没有办法,我愿意接受这个答案.

perl scalar

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