相关疑难解决方法(0)

18
推荐指数
2
解决办法
1万
查看次数

我应该在我的Perl程序的入门模板中添加什么?

我基于以下模板/骨架上的Perl脚本占主导地位:

#!/usr/bin/perl -w

use strict;
use utf8;

$| = 1;
binmode(STDOUT, ":utf8");

# my code goes here.
Run Code Online (Sandbox Code Playgroud)

这个模板实现的目标:

  1. 启用警告(-w)
  2. 启用严格模式(use strict)
  3. 走纯UTF-8(use utf8+ binmode(STDOUT, ":utf8"))
  4. 禁用缓冲($| = 1)

我的问题是:

如何改进我的模板以更好地反映Perl最佳实践?

perl

10
推荐指数
3
解决办法
934
查看次数

我如何内联Perl子程序?

我正在阅读代码完成2,其中一个要点是关于创建子程序,即使对于看起来太简单而无法拥有自己的子程序的操作,以及它如何有用.

我知道我可以使用关键字在C和C++中内联函数inline.但我从未想过在Perl中内联子程序的方法.

有没有办法告诉Perl解释器内联子程序调用(或为什么不)?

perl inline subroutine

9
推荐指数
2
解决办法
6817
查看次数

如果我在开发代码中使用Smart :: Comments,我应该有什么顾虑?

我知道Smart :: Comments不应该用在生产代码中,因为它是一个源过滤器.

但是,我一直在使用Smart::Comments我的开发代码,然后在将代码发送到生产之前注释掉"use"行.

鉴于我将在我的开发代码中使用它,我应该特别关注什么?我搜索了互联网,没有找到任何我应该担心的原因,除了源过滤器是"坏主意"或"邪恶"或者它们永远不应该在生产代码中使用.

更新:我现在在vim中使用密钥绑定来实现SinanÜnür的方法:

map <Leader>c <Esc>:!perl -MSmart::Comments %<CR>
Run Code Online (Sandbox Code Playgroud)

perl source-filter

5
推荐指数
3
解决办法
396
查看次数

Perl自定义后缀或自定义后缀运算符的语法

我想知道如何运行这样的操作

$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添加后缀运算符吗?如果是这样,怎么样?

perl parsing postfix-operator

5
推荐指数
1
解决办法
155
查看次数

Perl开关没有正常掉落?

我有一个我想测试的值($ 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)

perl switch-statement

4
推荐指数
2
解决办法
780
查看次数

Mojolicious 如何修改 Perl 语法

阅读 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”不包含在大括号中?这个语法对我来说看起来很奇怪。

syntax perl mojolicious

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