小编Eri*_*rom的帖子

在Perl中,直接全局别名和通过存储的别名之间有什么区别吗?

在Perl中,以下两个结构之间是否存在任何差异:

*main::foo = *main::bar
Run Code Online (Sandbox Code Playgroud)

$main::{foo} = $main::{bar}
Run Code Online (Sandbox Code Playgroud)

它们似乎具有相同的功能(将所有槽中的别名别名*main::foo定义在中*main::bar),但我只是想知道这种等效性是否总是成立.

perl alias typeglob perl-stash

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

匹配多行perl正则表达式

我有这样一个文件:

01 00 01 14 c0 00 01 10 01 00 00 16 00 00 00 64
00 00 00 65 00 00 01 07 40 00 00 22 68 61 6c 2e
6f 70 65 6e 65 74 2e 63 6f 6d 3b 30 30 30 30 30
30 30 30 32 3b 30 00 00 00 00 01 08 40 00 00 1e
68 61 6c 2e 6f 70 65 6e 65 74 2d 74 65 6c 65 …
Run Code Online (Sandbox Code Playgroud)

perl

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

如何告诉CPAN(Perl)有关使用元编程创建的包?

我有几个CPAN模块,它们广泛使用元编程来减少锅炉板并简化重构.

然而,这样做的结果是有许多程序包以编程方式创建,因此package X::Y::Z;CPAN的源代码中永远不会有一行找到(然后用于将命名空间添加到先来保留的命名空间列表中).

所以我的问题是,是否有一种让CPAN了解这些运行时创建的包的首选方法.以下是我目前正在考虑的选项:

  • 手动搜索所有包并pm为CPAN 创建一个虚拟文件以进行索引.
  • 手动搜索然后更新Build.PL以将其包含在provides列表中.
  • 在元编程例程中添加一些代码以跟踪使用的包,并添加一个钩子build dist以更新provides或其他部分META.yaml

最后一个选项目前是我倾向于的.我想知道这种方法是否有任何问题,或者是否有更好的方法可以使用完整的软件包列表更新CPAN.

perl cpan metaprogramming

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

由配置文件引起的XULRunner启动时间非常慢

我有一个应用程序,通过构建一个框架应用程序文件夹结构生成临时XULRunner应用程序,然后启动它:

xulrunner -app /path/to/temporary/application.ini
Run Code Online (Sandbox Code Playgroud)

这一切都有效,但应用程序实际加载需要花费不可接受的时间.我已经将时间接收器隔离到xulrunner生成/使用配置文件信息.

我试过添加-profile /path/to/static/folder,-profile /path/to/temporary/folder但每个仍然有很长的延迟(30 - 60秒,在快速计算机上).我也添加-no-remote但没有效果.

当应用程序启动时,我可以看到配置文件夹缓慢填充文件,一旦所有文件都存在,gui就会很快出现.不幸的是,当为配置文件使用静态文件夹时,这个时间似乎没有消失(它可能正在重新生成某些文件?).

所以我的问题是,是否可以完全禁用xulrunner的配置文件管理?我还能做些什么来提高加载速度吗?

debugging performance configuration xulrunner user-profile

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

如何在Perl中引用数组切片?

如何引用数组切片,以便在修改切片引用的元素时修改原始数组?

以下代码由于@_别名魔法而起作用,但对我来说似乎有点像黑客:

my @a = 1 .. 10;
my $b = sub{\@_}->(@a[2..7]);
@$b[0, -1] = qw/ < > /;
print "@a\n";
# 1 2 < 4 5 6 7 > 9 10
Run Code Online (Sandbox Code Playgroud)

任何人都有更好/更快的方式?

编辑:上面的代码示例只是为了说明@a和$ b之间所需的关系,它决不会反映在生产代码中使用此功能的方式.

arrays syntax perl reference slice

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

Perl的内置`Internals ::`包的文档在哪里?

keys %::用于获取当前加载的根命名空间的列表时Internals::,默认情况下会加载包(以及UNIVERSAL::其他一些).但是,我还没有找到任何有关函数的文档Internals::

keys %{Internals::} 回报 SvREFCNT hv_clear_placeholders hash_seed SvREADONLY HvREHASH rehash_seed

所有这些都可以在Perl的C API文档中查找,但是有没有针对它们的Perl级别文档?包装稳定吗?它被几个核心模块(Hash::Util一个)使用,所以我想它是,但缺乏文档有点令人不安.

我没有Internals.pm在Perl发行版中看到(可能是不同的名字?),而且它不是InternalsCPAN上的模块.

注意:我完全理解其中的功能是Internals::有潜在危险的,我没有任何特别的用途.我正在阅读Hash::Util它的来源并遇到它.

perl module internals

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

如何在Perl的上部作用域中本地化变量?

在开发使用AUTOLOAD或其他子例程调度技术的Perl模块时,我已经多次运行以下模式:

sub AUTOLOAD {
    my $self = $_[0];

    my $code = $self->figure_out_code_ref( $AUTOLOAD );

    goto &$code;
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,并caller看到正确的范围.

现在我想做的是在执行期间本地设置$_相等.这将是这样的:$self&$code

sub AUTOLOAD {
    my $self = $_[0];

    my $code = $self->figure_out_code_ref( $AUTOLOAD );

    local *_ = \$self;

    # and now the question is how to call &$code

    # goto &$code;  # wont work since local scope changes will 
                    # be unrolled before the goto

    # &$code;  # will preserve the local, but caller …
Run Code Online (Sandbox Code Playgroud)

perl goto local uplevel

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

如何在Perl中连接别名数组?

如何在Perl中连接别名数组,以便生成的数组还包含别名?

我想出的解决方案是:

my ($x, $y, $z) = 1 .. 3;

my $a1 = sub {\@_}->($x);

my $a2 = sub {\@_}->($y, $z);

my $a3 = sub {\@_}->(@$a1, @$a2);

say "@$a3";  # 1 2 3

$_++ for $x, $y, $z;

say "@$a3";  # 2 3 4
Run Code Online (Sandbox Code Playgroud)

什么我不是疯狂的是,创建$a3我必须完全解压$a1$a2.对于短数组,这不是问题,但随着数据变大,这意味着对别名数组的所有数组操作都O(n)包括传统的O(1)操作,如pushunshift.

Data::Alias可以提供帮助,但它不适用于最新版本的Perl. Array::RefElem包含包装器的API原语av_storeav_push可用于实现这一功能.所以像这样的东西可以工作:

sub alias_push (\@@) {
    if (eval {require Array::RefElem}) {
       &Array::RefElem::av_push($_[0], $_) for @_[1 …
Run Code Online (Sandbox Code Playgroud)

arrays perl alias

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

编写涉及随机性的Perl测试时,最佳做法是什么?

在对我的模块List :: Gen进行一些更新时,我决定添加一个->pick(num)方法,该方法num将从其源返回一个大小的随机元素列表.为了测试这个,我习惯srand为随机数生成器播种,并对表单进行了几次测试:

srand 1234;
is $src->pick(5)->str, '3 6 1 7 9';
Run Code Online (Sandbox Code Playgroud)

这一切都在我当时使用的Windows机器上运行良好.然而,当我将项目移动到Mac工作站时,所有随机性测试都失败了,因为尽管有相同的随机种子,rand但产生了不同的结果.我收集的是来自不同的底层C实现rand().

所以问题是,测试这些功能的最佳跨平台方法是什么?我应该rand用自己的功能重载功能吗?我应该在rand用于启用产生可预测输出的"测试"模式的函数中构建钩子吗?还有其他方法吗?

我更喜欢包含核心Perl技术的答案,因为我试图保持模块的依赖树很小.

Test :: RandomTest :: MockRandom似乎是CPAN的建议,有没有人有这些模块的经验?

testing random perl srand

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

Perl 5中的惰性评估技术示例?

我发现Haskell和Perl6最有趣的特性之一是能够推迟计算值,直到实际需要它们为止.

另一方面,Perl5喜欢立即做所有事情,但据我所知,它包含了懒惰评估的所有必要原语.那些是:

  • 采取参考@_的子程序创建一个别名在其参数列表中的标识符数组引用,即使其中的一些标识符不包含值呢.
  • \@_内部保存的子例程返回重载/绑定对象,然后在需要时取消引用它.(并且有各种CPAN模块可以抽象出领带/过载细节)

我一直在Perl中尝试各种惰性编程技术(我在工作中有一个模块,在Perl5中实现了一些Haskell Prelude(像共同递归:$_ = list 0, 1, zipWith {&sum} $_, tail $_ for my $fibs;定义Fibonacci序列已经在工作)).但我感觉代码中隐藏着一些微妙的错误,这些错误可能在函数用于较大的表达式/程序时显现出来.

所以我想知道是否有任何好的例子(CPAN /博客/书籍),任何人都知道,在Perl5中使用Haskell/Perl6就像懒惰一样?特别是,我想阅读使用这种类型的懒惰的任何重要大小的代码.

我也有兴趣知道是否有任何人遇到任何关于在Perl 5中实现延迟评估的问题或难以处理的问题.

perl haskell lazy-evaluation

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