问题标签 [perl5.10]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
perl - 哪里有一些学习 Perl 5.10 新特性的好资源?
直到最近我才意识到 Perl 5.10 有重要的新特性,我想知道是否有人可以给我一些很好的资源来学习这些特性。我在谷歌上搜索了它们,我发现的只是一些幻灯片和一个快速概述。如果有更多的解释,某些功能(至少对我而言)会很好。
任何链接将不胜感激。
-fREW
perl - Perl 5.10 是否把原型弄乱了?
我知道我想做的这种事情曾经在 5.8 中工作过。难道我做错了什么?有没有办法在 Perl 5.10 中回到那里?
这是模块:
这是脚本:
我所要做的就是取消最后一行的注释,我得到:
它不抱怨本地潜艇,但对进口潜艇失去了理智。最重要的是,尽管测试告诉我我已经导入了“mod_table”,但现在严格感到困惑的是它是一个裸词!
不仅如此,尽管测试告诉我原型是相同的,但我不能%table
作为 hashref 传递给导入的 sub 。即使我使用最后一行所示的常规语法也不行。
我得到的是:
winapi - 帮助解决始终可重复的 mod_perl2 / $SIG{__DIE__} 错误
这是 Apache 2.2 上的 mod_perl2,win32 上的 ActiveState Perl 5.10。
我覆盖$SIG{__DIE__}
并打开 DBI 的 RaiseError 标志,文档中的 AFAICT 应该在数据库调用失败时调用我的覆盖。似乎几乎总是,除了在一种情况下,我不明白为什么。
我的脚本有一个our $page
变量,并且是 mod_perl2,我可以从覆盖中得到这个,如下所示:
这工作正常。现在,在其中$page
,我有一个“允许”错误值的数组引用,当它们从数据库返回时,我想做一些不同的事情。当数据库抛出这些错误之一时,我想将其转换为用户友好的消息,$r->print
即 JSON 格式,并停止执行(行为 A)。出于某种原因,它反而将控制权返回给脚本(行为 B)。
这是我的脚本的主要部分:
如果我注释掉第一行,我会得到一个正常的错误(处理意外的事情)(行为 C),这是我所期望的,因为我没有将发生的错误添加到允许的错误列表中。真正奇怪的是,如果我剪切第一行并将其粘贴到我的$SIG{__DIE__}
覆盖中,它会起作用:JSON 响应被覆盖、打印,并且在{test}
分配之前执行停止(行为 A)。更奇怪的是,我可以设置{allowed}
为任何一组数字,只要它特别包含“22007”,我就会得到行为 B。如果没有,我会得到行为 C。更奇怪的是,我实际上可以填充我的覆盖有任何东西(警告,呼吁CORE::die
等——只要它编译),我仍然得到行为 B——即使覆盖不再包含任何使其成为可能的代码!此外,我没有得到对warn
and的调用的任何预期结果CORE::die
,只是在日志中保持沉默,所以我什至无法尝试通过我的覆盖手动跟踪执行路径。
我在每个脚本保存之间重新启动了 Apache2.2。我什至将覆盖移到与脚本本身相同的脚本文件中,移出它通常所在的模块,并注释掉覆盖通常所在的整个模块文件,然后重新启动。
如果我取出第一行,或者从中取出“22007”,我可以warn
手动die
调试我喜欢的所有内容,并且一切都按预期工作。尽管服务器重置,它从不输出任何不同的“22007”是什么?除了翻译图,整个项目的其他任何地方都没有对“22007”的引用,我可以将它从该文件中完全删除并重新启动,结果没有什么不同。它的行为就好像它已经缓存了我当天早些时候的覆盖并且永远不会忘记。这也不是浏览器缓存问题,因为我可以添加随机查询字符串,结果没有什么不同。
这是我有过的最奇怪和最令人沮丧的 mod_perl2 体验,而且我已经没有想法了。有人有任何提示吗?我唯一能想到的是这是一个缓存问题,但我已经无数次重启了服务。
由于这是一天的结束,我想我会尝试完全重新启动服务器计算机,但它仍然没有改变任何东西。{state}
我什至在重新启动服务器之前更改了分配给它的唯一行:
然而,之后的输出为“22007”,只有在我完好无损{test}
的情况下才应该是这样。= $errno
即使它是进行缓存的反向代理,这种情况对我来说也没有意义,因为请求可能不同。在完全重新启动服务器后,它如何仍然分配一个不再存在于代码中的值,即$SIG{__DIE__}
,当它不再存在于任何文件中时,它如何在完全重新启动后使用我的旧覆盖?
更新: 我还尝试将允许的错误更改为 '42601' 并将 db 调用更改为'select'
,这会产生该错误代码,但没有将其添加到翻译映射中。它仍然给我行为 B,设置{state}
为“42601”,所以它不是特定于“22007”。放入的任何错误代码{allowed}
,如果确实发生了该错误,则它正在运行旧版本的覆盖。导致不存在的错误,{allowed}
它运行当前版本。但是,在覆盖之前,它如何知道当前错误是否在 中{allowed}
,或者这是否意味着什么?{allowed}
(因为覆盖是当前错误的唯一位置。)
perl - 如果在 5.6.x 中开发,安装 Perl 5.8.x 或 5.10.x 会对我的代码运行方式产生重大影响吗?
在 Perl 5.6.1 中开发代码但在 Perl 5.8.x 或 5.10.x 中运行代码有什么影响(如果有的话)?
我正在使用这些模块:
(对于 Windows)
perl - 在 Perl 中可以未初始化但仍定义值吗?
在 win32 上运行 ActiveState Perl 5.10.1。
这段代码是怎么回事:
...死了1
,而改变同一行来这样说:
......死了Use of uninitialized value in die
?
defined
还好吗uninitialized
?我认为未初始化意味着未定义。
perl - 为什么 Perl 文件 glob() 不能在标量上下文中的循环之外工作?
根据有关文件通配符的 Perl 文档,当在标量上下文中使用 <*> 运算符或 glob() 函数时,应遍历与指定模式匹配的文件列表,每次调用时返回下一个文件名或当没有更多文件时使用undef。
但是,迭代过程似乎只能在循环中工作。如果它不在循环中,那么它似乎在读取所有值之前立即重新开始。
来自 Perl 文档:
在标量上下文中,glob 遍历此类文件名扩展,当列表用尽时返回 undef。
http://perldoc.perl.org/functions/glob.html
但是,在标量上下文中,运算符在每次调用时返回下一个值,或者在列表用完时返回 undef。
http://perldoc.perl.org/perlop.html#I/O-Operators
示例代码:
在包含 3 个文件的目录中...file1.txt、file2.txt 和 file3.txt,上面的代码将输出:
注意:实际的 perl 脚本应该在 test 目录之外,否则您也会在输出中看到脚本的文件名。
我在这里做错了什么,还是它应该如何工作?
perl - 我可以确保在 5.10+ 上编写的 Perl 代码可以在 5.8 上运行吗?
Perl 5.10 和 5.12 的一些新特性,例如“say”,被定义为特性,您可以使用“feature”编译指示显式启用或禁止这些特性。但是其他添加,例如命名的正则表达式捕获组,是隐含的。
当我使用 5.10+ 解释器编写 Perl,但希望它也能在 5.8 上运行时,我可以让 Perl 抱怨使用 5.8 中没有的任何东西吗?显然,在您打算运行的所有主要版本上测试您的代码是一种很好的做法,但是让 Perl 自动警告我仍然很好。
perl - Perl 5.10+ 中词法 $_ 的优缺点
从 Perl 5.10 开始,现在可以对上下文变量进行词法范围$_
,无论是显式地作为my $_;
还是在given / when
构造中。
有没有人发现词汇的好用处$_
?它是否使任何构造更简单/更安全/更快?
让情况变得更复杂的情况呢?词法是否在$_
您的代码中引入了任何错误?(因为写入的控制结构$_
将使用词法版本,如果它在范围内,如果它包含任何子例程调用(由于失去动态范围),这可能会改变代码的行为)
最后,我想构建一个列表,以阐明何时$_
用作词法、全局或根本无关紧要。
注意:这些实验性perl5-5.24
功能不再是 perl 的一部分。
perl - O=Deparse 是如何工作的,Perl 有和折叠常量数组吗?
我想知道,是否-MO=Deparse
向您展示了所有 Perl 优化,为什么不将其折叠到 Perl 5.10 中?
IRC 上的一些人认为这O=Deparse
可能没有显示全部,但它肯定显示了一些不断的折叠。
如果我显式编写常量 sub,结果相同。constant.pm
虽然可以预测,但其中的文档让您创建一个常量列表而不是一个常量数组也很有趣。我假设这不仅不像标量常量那样折叠,而且它需要在每次调用时创建一个新数组的开销。
我能得出的唯一结论-MO=Deparse
是显示所有折叠,而常量数组只是没有在 Perl 中优化?是这样吗?有技术原因吗?
perl - mac下perl怎么刷文件?
我有perl, v5.10.0 built for darwin-thread-multi-2level
远程 iMac。我想运行一些 perl 脚本,它打印出一些数据并在每行输出后刷新。
- $file_handle->flush();
- 自动刷新 $file_handle;
我已经在文件顶部尝试了这两个版本use IO::Handle;
,但我得到的结果是Can't locate object method "autoflush" via package "FileHandle"
.