为什么在Perl 5.12中不推荐使用Switch模块?
我知道这是和switch/ case有关elsif,但我不太喜欢.
我基于以下模板/骨架上的Perl脚本占主导地位:
#!/usr/bin/perl -w
use strict;
use utf8;
$| = 1;
binmode(STDOUT, ":utf8");
# my code goes here.
Run Code Online (Sandbox Code Playgroud)
这个模板实现的目标:
-w)use strict)use utf8+ binmode(STDOUT, ":utf8"))$| = 1)我的问题是:
如何改进我的模板以更好地反映Perl最佳实践?
我正在阅读代码完成2,其中一个要点是关于创建子程序,即使对于看起来太简单而无法拥有自己的子程序的操作,以及它如何有用.
我知道我可以使用关键字在C和C++中内联函数inline.但我从未想过在Perl中内联子程序的方法.
有没有办法告诉Perl解释器内联子程序调用(或为什么不)?
我知道Smart :: Comments不应该用在生产代码中,因为它是一个源过滤器.
但是,我一直在使用Smart::Comments我的开发代码,然后在将代码发送到生产之前注释掉"use"行.
鉴于我将在我的开发代码中使用它,我应该特别关注什么?我搜索了互联网,没有找到任何我应该担心的原因,除了源过滤器是"坏主意"或"邪恶"或者它们永远不应该在生产代码中使用.
更新:我现在在vim中使用密钥绑定来实现SinanÜnür的方法:
map <Leader>c <Esc>:!perl -MSmart::Comments %<CR>
Run Code Online (Sandbox Code Playgroud) 我想知道如何运行这样的操作
$T = 25 C;
@specs = (273.15 K, 23 bar, 2.0 mol/s);
Run Code Online (Sandbox Code Playgroud)
并让他们编译.我不会挑剔他们的结果是什么,或者它是如何实现的.我的目标是让传统后缀单元注释的物理量表达式编译为这些单元的perl表达式.
我想我需要使用自定义解析技术,但我更喜欢使用任何现有功能或解析模块,而不仅仅是将regex过滤器应用于我的原始源.
Parse :: Keyword看起来很有希望,但我看不出它是否可以解析postfix操作,并声称它已被弃用.
编辑:我想尽可能避免源过滤器,因为我不想为Perl的语法极端情况编写正则表达式(例如"25(J/K)").
Perl在这里产生的错误告诉我:
perl -E "25 C"
Bareword found where operator expected at -e line 1, near "25 C"
(Missing operator before C?)
Run Code Online (Sandbox Code Playgroud)
看起来我需要挂钩Perl在数字文字之后检测运算符的地方.
可以Devel :: Declare添加后缀运算符吗?如果是这样,怎么样?
我有一个我想测试的值($ field).阅读perl doc(http://perldoc.perl.org/Switch.html#Allowing-fall-through),并认为我已将此钉住了.似乎没有,因为如果我通过'Exposure Bias',就没有输出,尽管'Exposure Bias Value'可以正常工作.它没有抛出任何错误,所以我不知道.
use Switch;
use strict; use warnings;
my $field = 'Exposure Bias';
switch($field){
case 'Exposure Bias' {next;}
case 'Exposure Bias Value' {print "Exp: $field\n";}
}
Run Code Online (Sandbox Code Playgroud)
更新
我似乎假装错了.如果匹配任何一种情况,我想用这个开关做的是打印运行.我认为接下来会将控制权传递给下一个案例的代码,但这是我的错误.
我如何对此进行编码,以便在第一种情况匹配时第二种情况下的代码运行?
工作方案
given($field){
when(['Exposure Bias','Exposure Bias Value']){print "Exp: $field\n";}
}
Run Code Online (Sandbox Code Playgroud) 阅读 Mojolicious minions 文档我发现了以下代码:
use v5.28;
use Mojolicious::Lite;
use experimental qw( signatures );
use Time::HiRes qw( time );
plugin Minion => {
SQLite => 'sqlite:' . app->home->child('minion.db'),
};
# ...
app->start;
Run Code Online (Sandbox Code Playgroud)
他们是如何创建新语法的plugin Minion => {...}?我在经典 Perl 书籍中从未见过它。它是带有哈希参数的函数调用:“Minion”是键,hashref{...}是值吗?
他们还调用app->start-app是一个返回祝福的 hashref 的函数吗?但如果它是一个散列,为什么“start”不包含在大括号中?这个语法对我来说看起来很奇怪。