标签: perl5

Perl 5.20和智能匹配的命运何时?

我刚刚安装了Perl 5.18,我收到很多这样的警告,

given is experimental at .\[...].pl line [...].
when is experimental at .\[...].pl line [...].
Smartmatch is experimental at C:/strawberry/perl/site/lib/[...] line [...].
Run Code Online (Sandbox Code Playgroud)

看看这些警告 - 我从未在任何地方听到过这些警告 - 我只能在两个地方找到这个警告,

Perl Delta仍然能够最大限度地提及这些功能正在发生的事情,它被埋在吊舱中的一半,

在v5.10.0中添加并在v5.10.1中进行了重大修订的智能匹配一直是一个常见的投诉点.尽管有许多方法可用,但它也证明了Perl的用户和实现者都存在问题和困惑.关于如何最好地解决问题,已经提出了许多建议.很明显,smartmatch几乎肯定会在将来改变或消失.不建议依赖其当前行为.现在,当解析器看到〜,给定或何时发出警告.

我对过去10年中Perl最显着的变化如何被拉动感到困惑.我已经开始使用given,when以及smartmatch所有地方.还有关于这些未来的更多信息吗?怎么有人发现它们"令人困惑?" 这些功能如何变化?是否有计划使用模块实现这些功能?

perl perl5 smartmatch

63
推荐指数
3
解决办法
1万
查看次数

无法在@INC中找到CPAN.pm(@INC包含:/ usr/local/lib/perl5/usr/local/share/perl5

我试图将一些模块安装到新服务器(fedora core 18),但我打赌这个错误:

Can't locate CPAN.pm in @INC (@INC contains: /usr/local/lib/perl5 /usr/local/share/perl5 /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5 /usr/share/perl5 .).
BEGIN failed--compilation aborted.
Run Code Online (Sandbox Code Playgroud)

我需要安装的模块是:XML/Writer.pm

因为我收到了这个错误:

Can't locate XML/Writer.pm in @INC (@INC contains: /usr/local/lib/perl5 /usr/local/share/perl5 /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5 /usr/share/perl5 .
Run Code Online (Sandbox Code Playgroud)

你们中的任何人都知道为什么或如何解决这个错误?

linux perl fedora-core perl5

14
推荐指数
1
解决办法
3万
查看次数

如何在Perl 6中返回上下文敏感的返回值?

在Perl 5和Perl 6之间差异的总结中,注意到该wantarray功能已经消失:

wantarray()走了

wantarray走了.在Perl 6中,上下文向外流动,这意味着例程不知道它在哪个上下文中.

相反,你应该返回在每个上下文中做正确事情的对象.

有人可以举例说明如何创建这样的对象吗?

perl perl6 perl5 raku

13
推荐指数
1
解决办法
419
查看次数

如何在多个文件中拆分Perl代码?

我的脚本太长了.如何将我的代码(程序子)拆分为多个Perl文件并告诉解释器理解它们?

有一些像:

# -> main.pl

#include "foo.pl"
say_hello();
Run Code Online (Sandbox Code Playgroud)

和:

# -> foo.pl
sub say_hello {print "hello!"}
Run Code Online (Sandbox Code Playgroud)

perl perl5

13
推荐指数
1
解决办法
6816
查看次数

Perl Cwd :: cwd和Cwd :: getcwd函数有何不同?

这个问题

Cwd::cwdCwd::getcwdPerl有什么区别,一般来说,不考虑任何特定的平台?为什么Perl都有?什么是预期用途,我应该在哪些场景中使用?(示例用例将受到赞赏.)这有关系吗?(假设我不混合它们.)任何一个的选择是否会以任何方式影响可移植性?哪一个更常用于模块?

即使我解释手册说,除了极端情况cwd`pwd`,并getcwd只是调用getcwdunistd.h,有什么实际的区别?无论如何,这仅适用于POSIX系统.

我总是可以阅读实现,但这并没有告诉我这些函数的含义.实施细节可能会发生变化,而非定义的含义.(否则会发生重大变化,这是一项严肃的事情.)

手册说了什么

引用Perl的Cwd模块手册页:

这些函数中的每一个都不带参数调用,并返回当前工作目录的绝对路径.

  • GETCWD

    my $cwd = getcwd();

    返回当前工作目录.

    暴露POSIX函数getcwd(3)或重新实现它(如果它不可用).

  • CWD

    my $cwd = cwd();

    cwd()是当前架构最自然的形式.对于大多数系统,它与`pwd`相同(但没有尾随行终止符).

在Notes部分:

  • 事实上,在Mac OS上的getcwd(),fastgetcwd()fastcwd()功能都为所有别名cwd()功能,其中,在Mac OS,调用`pwd`.同样,该abs_path()函数是别名fast_abs_path()

好的,我知道在Mac OS 1上没有区别getcwd(),cwd()因为两者实际上归结为`pwd`.但是在其他平台上呢?(我对Debian Linux特别感兴趣.)


1经典的Mac OS,而不是OS X. $^OMacOSdarwin分别为Mac OS和OS X,.谢谢,@ tobyink@ikegami …

perl working-directory getcwd perl5

11
推荐指数
1
解决办法
2496
查看次数

重新定义或重载反引号

我有很多遗留代码,我想要做的是添加一个require或最小的代码更改,以使反引号做一些不同的事情,例如打印而不是运行代码

我尝试使用,use subs但我无法接受反击或qx(我重新定义系统,这是一个不用担心的事情)

我也尝试制作一个包:

package thingmbob;
use Data::Dumper;
use overload    '``'    => sub { CORE::print "things!:\t", Dumper \@_};
#this works for some reason
$thingmbob::{'(``'}('ls');
#this does the standard backtick operation
`ls`
Run Code Online (Sandbox Code Playgroud)

不可思议的是,我没有OOP perl的经验,而且我的google-fu技能让我失望,有人能指出我正确的方向吗?

警告:我在一个预装了几个cpan模块的封闭系统中,可能是因为我没有安装任何花哨的模块,我绝对无法获得新的模块

我正在使用perl5.14

编辑:

为了完整起见,我想添加我的(大部分)最终产品

BEGIN {
    *CORE::GLOBAL::readpipe = sub {
        print Dumper(\@_);
        @internal = readpipe(@_);
        if(wantarray){
            return @internal;
        }else{
            return join('',@internal);
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

我想让它打印出即将运行的内容,然后运行它.这wantarray很重要,因为没有它标量上下文不起作用

perl perl5

9
推荐指数
1
解决办法
143
查看次数

在5.6.x之后,Perl的-w警告开关是否已弃用?

我在Simon Cozens的书"Beginning Perl"中读到-w开关警告将会被弃用.这是真的还是继续使用-w而不是"使用警告"仍然可以.

perl perl5

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

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
查看次数