小编TLP*_*TLP的帖子

为什么要使用严格和警告?

在我看来,如果人们使用以下内容,可以解决Perl标签中的许多问题:

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

我认为有些人认为这些类似于训练轮子或不必要的并发症,这显然不是真的,因为即使是非常熟练的Perl程序员也会使用它们.

似乎大多数精通Perl的人总是使用这两个pragma,而那些从使用它们中获益最多的人很少这样做.所以,我认为这将是一个好主意,有一个问题联系起来,鼓励人们时至use strictwarnings.

那么,为什么一个Perl的开发use strictwarnings

perl

100
推荐指数
4
解决办法
6万
查看次数

为什么括号仅在子声明后可选?

(假设use strict; use warnings;整个问题.)

我正在探索使用sub.

sub bb { print @_; }
bb 'a';
Run Code Online (Sandbox Code Playgroud)

这按预期工作.括号是可选的,就像许多其他函数一样print, open.

但是,这会导致编译错误:

bb 'a';
sub bb { print @_; }

String found where operator expected at t13.pl line 4, near "bb 'a'"
        (Do you need to predeclare bb?)
syntax error at t13.pl line 4, near "bb 'a'"
Execution of t13.pl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)

但这不是:

bb('a');
sub bb { print @_; }
Run Code Online (Sandbox Code Playgroud)

同样,没有args的sub,例如:

special_print;
my special_print { print $some_stuff …
Run Code Online (Sandbox Code Playgroud)

perl

29
推荐指数
3
解决办法
5400
查看次数

如何将可选参数传递给Perl函数?

我想将一些参数(其中一个是可选的)传递给一个函数.我知道的唯一方法是使用列表(@)作为参数.因此,它没有内容或1个元素(永远不会是undef),所以我可以使用以下代码:

sub someFunction($$@) {
    my ( $oblig_param1, $oblig_param2, $option_param ) = @_;
    ...
} 
Run Code Online (Sandbox Code Playgroud)

这段代码有效,但我觉得这可能不是最好的解决方法.
有没有其他方法可以做到这一点?
谢谢.

perl subroutine

16
推荐指数
3
解决办法
4万
查看次数

如何在perl中拆分多个模式的字符串?

我想拆分一个包含多个模式的字符串:

恩.

my $string= "10:10:10, 12/1/2011";

my @string = split(/firstpattern/secondpattern/thirdpattern/, $string);

foreach(@string) {
    print "$_\n";
}
Run Code Online (Sandbox Code Playgroud)

我希望得到一个输出:

10
10
10
12
 1
2011
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

regex string perl split

13
推荐指数
2
解决办法
7万
查看次数

散列perl值的数组

是否可以将数组的引用分配为key : valueperl中哈希表对中的值?

arrays perl hash reference

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

探索匿名潜艇的用途

我总是对perl中匿名subs的用途和用法感到有些困惑.我理解这个概念,但寻找这个实践的价值的例子和解释.

要明确:

sub foo { ... }   # <--- named sub
sub { ... }       # <--- anonymous sub
Run Code Online (Sandbox Code Playgroud)

例如:

$ perl -e 'print sub { 1 }'
CODE(0xa4ab6c)
Run Code Online (Sandbox Code Playgroud)

告诉我sub返回一个标量值.所以,我可以这样做:

$ perl -e '$a = sub { 1 }; print $a'
Run Code Online (Sandbox Code Playgroud)

对于与上面相同的输出.这当然适用于所有标量值,因此您可以使用匿名subs加载数组或散列.

问题是,我如何使用这些潜艇?我为什么要使用它们?

而对于一个金星来说,是否有任何问题只能用匿名子解决?

perl

10
推荐指数
4
解决办法
2817
查看次数

如何使用Perl查找与regexp匹配的所有字符串实例?

如何使用Perl查找和打印与正则表达式匹配的所有字符串?

以下仅查找第一场比赛.

$text="?Adsfsadfgaasdf.
?Bafadfdsaadsfadsf.
xcxvfdgfdg";

if($text =~ m/\\?([^\.]+\.)/) {
    print "$1\n";
}
Run Code Online (Sandbox Code Playgroud)

EDIT1:/g不起作用

#!/usr/bin/env perl

$text="?Adsfsadfgaasdf.
?Bafadfdsaadsfadsf.
xcxvfdgfdg";

if($text =~ m/\\?([^\.]+\.)/g) {
    print "$1\n";
}

$ ./test.pl 
?Adsfsadfgaasdf.
Run Code Online (Sandbox Code Playgroud)

regex perl

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

`/regex/o` 的真正含义是什么(曾经有过一次,但现在似乎消失了)?

(抱歉这个标题,但是这个“功能”确实让我困惑)

在学习 Perl 时,我了解到o使用变量的正则表达式的修饰符只会被评估一次,即使变量在初始评估后发生变化。最初看起来没有任何问题,这是明确指定的。

显然,在所使用的变量获得其值之前不能进行初始评估。

现在qr让生活变得更有趣了。考虑以下代码(也在定义其他变量的循环中执行):

{
    my $n = $name;
    $n =~ s/[^\w\.-]/_/g;
    $n = qr:^${n}\@${another_variable}$:o;
    @a = grep { !/$n/ } @a;
}
Run Code Online (Sandbox Code Playgroud)

当直接使用正则表达式时qr,人们可能会争辩说正则表达式只编译一次,即使变量的范围超出范围(超出范围是否被视为变量的更改?)

但是当使用qr构建正则表达式并将其分配给词法变量时,编译的正则表达式将超出范围,因此我期望正则表达式不能重用并且将被重新构建(基本思想是内部的正则表达式grep应该不必为每次迭代而重建)。

由于生活是残酷的,似乎引用的整个正则表达式$n从未被重建,因此使用第一个值直到程序停止。

有趣的是,在 Perl 5.18.2(正在使用的版本)中不再提及修饰符operlre(1)而 Perl 5.26.1 在相应的页面中说:

o - 假装优化你的代码,但实际上引入了错误

那么任何人都可以解释“一次”评估的规则(以及语义在 Perl 的生命周期中是否发生了变化)?

有关的:

regex perl lazy-evaluation

8
推荐指数
2
解决办法
262
查看次数

如何修剪文件 - 删除具有相同值的列

我希望您通过删除具有相同值的列来修剪文件.

# the file I have (tab-delimited, millions of columns)
jack 1 5 9
john 3 5 0
lisa 4 5 7
Run Code Online (Sandbox Code Playgroud)
# the file I want (remove the columns with the same value in all lines)
jack 1 9
john 3 0
lisa 4 7
Run Code Online (Sandbox Code Playgroud)

你能否就这个问题给我任何指示?我更喜欢sed或awk解决方案,或者可能是perl解决方案.

提前致谢.最好,

unix perl awk sed

7
推荐指数
2
解决办法
2453
查看次数

相对绝对路径perl

以下目录设置:

/dira/dirb
/dira/dirb/myprog.pl
Run Code Online (Sandbox Code Playgroud)

/dira/dirb/testa/myfilesdir 包含以下文件

/dira/dirb/testa/myfilesdir/file1.txt
/dira/dirb/testa/myfilesdir/file2.txt
Run Code Online (Sandbox Code Playgroud)

目前的目录:

/dir/dirb

./myprog.pl  -p testa/myfilesdir
Run Code Online (Sandbox Code Playgroud)

循环浏览文件

while (my $file_to_proc = readdir(DIR)) {
...

$file_to_proc = file1.txt
$file_to_proc = file2.txt
Run Code Online (Sandbox Code Playgroud)

我想要的是什么

$myfile = /dira/dirb/testa/myfilesdir/file1.txt
$myfile = /dira/dirb/testa/myfilesdir/file2.txt
Run Code Online (Sandbox Code Playgroud)

尝试了一些不同的perl模块(CWD rel2abs),但它使用的是当前目录.我无法使用当前目录,因为输入可能是相对路径或绝对路径.

perl

7
推荐指数
1
解决办法
2660
查看次数

标签 统计

perl ×10

regex ×3

arrays ×1

awk ×1

hash ×1

lazy-evaluation ×1

reference ×1

sed ×1

split ×1

string ×1

subroutine ×1

unix ×1