我刚刚安装了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
所有地方.还有关于这些未来的更多信息吗?怎么有人发现它们"令人困惑?" 这些功能如何变化?是否有计划使用模块实现这些功能?
我试图将一些模块安装到新服务器(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)
你们中的任何人都知道为什么或如何解决这个错误?
在Perl 5和Perl 6之间差异的总结中,注意到该wantarray
功能已经消失:
wantarray()走了
wantarray走了.在Perl 6中,上下文向外流动,这意味着例程不知道它在哪个上下文中.
相反,你应该返回在每个上下文中做正确事情的对象.
有人可以举例说明如何创建这样的对象吗?
我的脚本太长了.如何将我的代码(程序子)拆分为多个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) Cwd::cwd
和Cwd::getcwd
Perl有什么区别,一般来说,不考虑任何特定的平台?为什么Perl都有?什么是预期用途,我应该在哪些场景中使用?(示例用例将受到赞赏.)这有关系吗?(假设我不混合它们.)任何一个的选择是否会以任何方式影响可移植性?哪一个更常用于模块?
即使我解释手册说,除了极端情况cwd
是`pwd`
,并getcwd
只是调用getcwd
从unistd.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. $^O
值MacOS
和darwin
分别为Mac OS和OS X,.谢谢,@ tobyink和@ikegami …
我有很多遗留代码,我想要做的是添加一个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
很重要,因为没有它标量上下文不起作用
我在Simon Cozens的书"Beginning Perl"中读到-w开关警告将会被弃用.这是真的还是继续使用-w而不是"使用警告"仍然可以.
我目前正在学习有关类型和名称空间的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代码之后,我被告知要避免使用间接对象表示法,"因为它有几个副作用".评论引用了这一特定的行:
my $some_object = new Some::Module(FIELD => 'value');
Run Code Online (Sandbox Code Playgroud)
因为这就是我一直以来的做法,为了与时俱进,我因此问:
我正要问这位评论者,但对我而言,这是值得发表的.
perl5 ×10
perl ×9
perl6 ×2
benchmarking ×1
coding-style ×1
fedora-core ×1
getcwd ×1
linux ×1
namespaces ×1
oop ×1
primes ×1
prototype ×1
raku ×1
smartmatch ×1
typeglob ×1