在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),但我只是想知道这种等效性是否总是成立.
我有这样一个文件:
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) 我有几个CPAN模块,它们广泛使用元编程来减少锅炉板并简化重构.
然而,这样做的结果是有许多程序包以编程方式创建,因此package X::Y::Z;CPAN的源代码中永远不会有一行找到(然后用于将命名空间添加到先来保留的命名空间列表中).
所以我的问题是,是否有一种让CPAN了解这些运行时创建的包的首选方法.以下是我目前正在考虑的选项:
pm为CPAN 创建一个虚拟文件以进行索引.provides列表中.build dist以更新provides或其他部分META.yaml最后一个选项目前是我倾向于的.我想知道这种方法是否有任何问题,或者是否有更好的方法可以使用完整的软件包列表更新CPAN.
我有一个应用程序,通过构建一个框架应用程序文件夹结构生成临时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的配置文件管理?我还能做些什么来提高加载速度吗?
如何引用数组切片,以便在修改切片引用的元素时修改原始数组?
以下代码由于@_别名魔法而起作用,但对我来说似乎有点像黑客:
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之间所需的关系,它决不会反映在生产代码中使用此功能的方式.
当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它的来源并遇到它.
在开发使用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中连接别名数组,以便生成的数组还包含别名?
我想出的解决方案是:
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)操作,如push或unshift.
Data::Alias可以提供帮助,但它不适用于最新版本的Perl. Array::RefElem包含包装器的API原语av_store和av_push可用于实现这一功能.所以像这样的东西可以工作:
sub alias_push (\@@) {
if (eval {require Array::RefElem}) {
&Array::RefElem::av_push($_[0], $_) for @_[1 …Run Code Online (Sandbox Code Playgroud) 在对我的模块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 :: Random和Test :: MockRandom似乎是CPAN的建议,有没有人有这些模块的经验?
我发现Haskell和Perl6最有趣的特性之一是能够推迟计算值,直到实际需要它们为止.
另一方面,Perl5喜欢立即做所有事情,但据我所知,它包含了懒惰评估的所有必要原语.那些是:
@_的子程序创建一个别名在其参数列表中的标识符数组引用,即使其中的一些标识符不包含值呢.\@_内部保存的子例程返回重载/绑定对象,然后在需要时取消引用它.(并且有各种CPAN模块可以抽象出领带/过载细节)我一直在Perl中尝试各种惰性编程技术(我在工作中有一个模块,在Perl5中实现了一些Haskell Prelude(像共同递归:$_ = list 0, 1, zipWith {&sum} $_, tail $_ for my $fibs;定义Fibonacci序列已经在工作)).但我感觉代码中隐藏着一些微妙的错误,这些错误可能在函数用于较大的表达式/程序时显现出来.
所以我想知道是否有任何好的例子(CPAN /博客/书籍),任何人都知道,在Perl5中使用Haskell/Perl6就像懒惰一样?特别是,我想阅读使用这种类型的懒惰的任何重要大小的代码.
我也有兴趣知道是否有任何人遇到任何关于在Perl 5中实现延迟评估的问题或难以处理的问题.