小编Jac*_*lin的帖子

如何在 macos 上安装 perl 模块?

线程perl how can I append STDOUT of list form system call of perl script to a file导致以下解决方案:use IPC::Run qw( run );。在我的 macos 10.14.6 上运行 perl 5.18.4,这引发了一个错误:Can't locate IPC/Run.pm in @INC (you may need to install the IPC::Run module)。因此,安装缺少的 Perl 模块最简单的方法是什么?,我做了

> cpan IPC::Run
<snip: 403 lines later>
Appending installation info to /Users/BNW/perl5/lib/perl5/darwin-thread-multi-2level/perllocal.pod
  TODDR/IPC-Run-20180523.0.tar.gz
  /usr/bin/make install  -- OK
Run Code Online (Sandbox Code Playgroud)

并重新启动了我的 MacBookPro。我编辑了我的 perl 脚本,bosswrap.pl开始

#!/usr/bin/perl
use strict; use warnings;
use IPC::Run qw( run …
Run Code Online (Sandbox Code Playgroud)

macos perl cpan module

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

为什么带有 /mg 修饰符的 Perl 正则表达式会匹配行尾之后的内容?

这与 perl 多行正则表达式有关,用于分隔段落内的注释,但仅关注正则表达式语法的单个问题。

根据perlre: Modifiers/m正则表达式修饰符意味着

将匹配的字符串视为多行。也就是说,将“^”和“$”从匹配字符串第一行的开头和最后一行的结尾更改为匹配字符串中每一行的开头和结尾。

因此,使用以下代码:

#!/usr/bin/perl
use strict; use warnings;
$/ = ''; # one paragraph at a time
while(<DATA>)
{
    print "original:\n";
    print; 
    s/^([^B]*)(B.*?)$/>$1|$2</mg;
    print "\n\nafter substitution:\n";
    print; 
}

__DATA__
aaaaBaBaBB
bbbbBbadbe
cccc
dddd
eeeeBeeeee
ffff
gggg

Run Code Online (Sandbox Code Playgroud)

我期望正则表达式引擎的行为如下。

第 1 行:匹配,因为它会找到该行开头和结尾之间的两种模式。

第 2 行:同上。

第 3 行:匹配。第一个正则表达式组(在第一组括号中)匹配。但是当我们到达该行的末尾时,我们仍在寻找B,以开始第二个正则表达式组。由于我们已经指定了/m,因此该特定行的末尾意味着我们已到达$但未满足整个模式。

第 4 行:我们开始一个新行,因此我们遇到一个新的^. 再次,没有匹配。

第 5 行:匹配。两个正则表达式组都位于行的开头和结尾之间,即在^和 之间$,完全按照指定。

因此我希望看到

>aaaa|BaBaBB< …
Run Code Online (Sandbox Code Playgroud)

regex perl multiline regex-group

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

在单个 Perl 脚本中,我可以关闭并重新打开 STDIN 吗?

我想编写 perl 脚本,它可以读取在调用脚本时给出的 STDIN,读完它,然后以交互方式提示用户输入一行 STDIN。这一单行 STDIN 将告诉脚本如何继续。

在实际应用中,我希望脚本创建一个临时文件,报告临时文件的大小,然后询问用户是否真的要将整个临时文件打印到 STDOUT,还是要给出文件名这将被临时文件的内容破坏。

如果我将 STDIN 作为文件名提供,以下脚本将按预期运行,但如果我通过管道将 STDIN 传递给脚本,则该脚本不起作用。

#! /usr/bin/perl
use strict; use warnings; 
my $count = 0;
while(<>)
{
    $count++;
}
print "you counted $count lines. Now do you want to proceed?";
my $answer = <STDIN>;
chomp $answer;
print STDERR "answer=$answer\n";
if ( $answer eq "yes" )
{
    print STDERR "you said $answer so we do something affirmative\n";
}
else
{
    print STDERR "you said $answer which is not \"yes\" so we do …
Run Code Online (Sandbox Code Playgroud)

perl stdin

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

perl eval“...传播”在哪里记录

在以下代码中,eval检查表达式是否有效。它捕获一个异常,并且我的代码打印出异常,而代码不会在此时死亡。到现在为止还挺好。

但是当die;随后遇到一个表达式时,异常文本会再次打印出来,没有我的要求,并添加了一条...propagated消息,给出了die;命令的行号。但在这一点上,例外文本是不合适和混乱的。似乎 perl 会保留eval错误消息或异常消息,直到我们到达die;.

下面发布的代码下方是两种解决方法,其中任何一种都会使行为消失。

这种特殊行为记录在哪里?背后的想法是什么?

#!/usr/bin/perl
use strict; use warnings;
my $str=q/(d/;
my $rgx;
eval{$rgx=qr/$str/};
if(length $@)
{
   print join('', 'qr/', $str, '/ does not compile: ',"\n", $@, );
}
print "Got past eval. But next, at 'die;', it will print an error message that no longer pertains.\n";
die;
Run Code Online (Sandbox Code Playgroud)

解决方法 (1)。给出die;一个非空字符串:

#!/usr/bin/perl
use strict; use warnings;
my $str=q/(d/;
my $rgx;
eval{$rgx=qr/$str/};
if(length $@) …
Run Code Online (Sandbox Code Playgroud)

perl eval exception die

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

in perl, why does sprintf(Dumper \%hash) throw a warning when the hash contains a long string?

I have been using syntax like the following for months, without triggering a warning:

die join('', sprintf(Dumper [@stack]), sprintf(Dumper {%oprAtnNOW}), 'opt tojudge not specified');
Run Code Online (Sandbox Code Playgroud)

That is, I have used sprintf with Dumper, without specifying a format.

In the following code, we see that this works fine, but only up to a point. When %oprAtnNOW contains a long string, a warning is triggered. (In all cases the string compiles as a regex; but before compilation, it is nothing but a …

perl data-dumper

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

有没有办法在 perl 中本地更改输入记录分隔符?

将变量的范围限制$x 为特定的代码块或子例程,通过my $x将编码员从“全局变量”引起的混乱世界中解救出来。

但是当涉及到输入记录分隔符时$/,显然它的范围是不能被限制的。我在这方面正确吗?

因此,如果我忘记在循环结束时或在子例程内重置输入记录分隔符,则调用子例程下方的代码可能会产生意想不到的结果。以下示例演示了这一点。

#!/usr/bin/perl
use strict; use warnings;
my $count_records; my $infile = $ARGV[0]; my $HANDLEinfile;

open $HANDLEinfile, '<', $infile or die "cannot open $infile for reading";
$count_records = 0;
while(<$HANDLEinfile>)
{
    $count_records++; 
    print "$count_records:\n";
    print;
}
close $HANDLEinfile;

look_through_other_file();

print "\nNOW, after invoking look_through_other_file:\n";
open $HANDLEinfile, '<', $infile or die "cannot open $infile for reading";
$count_records = 0;
while(<$HANDLEinfile>)
{
    $count_records++; 
    print "$count_records:\n";
    print;
}
close $HANDLEinfile;

sub look_through_other_file
{ …
Run Code Online (Sandbox Code Playgroud)

perl file-io parsing text-processing

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

在 perl 中,为什么 push 会导致 qr 创建的正则表达式在未放入双引号时发生更改?

我在脚本中定义正则表达式,使用qr并将它们推送到数组上。但现在看来,如果我不将正则表达式放在双引号内,将它推到数组上的操作会改变它。例子:

#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper qw(Dumper);
use Data::Dumper::Concise;
my @regexes;
my $rgx = 'dog'; my $mdf = 'i';
$rgx = join ( '', '(?', $mdf, ')', $rgx ) if ($mdf); # in production, $mdf could be empty
eval { $rgx = qr/$rgx/ };
if ($@) # catch illegitimate regex modifier, such as 'g'
{
   die "rgx==$rgx; mdf==$mdf; qr throws an error";
}
push @regexes, $rgx;
push @regexes, "$rgx";
print "first try just printing \$rgx\n";
print …
Run Code Online (Sandbox Code Playgroud)

regex arrays perl push

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

查找过去一小时内修改的文件的最简单方法是什么?

这个问题是“在perl中,查找给定时间间隔内修改的文件的最简单方法是什么?”的特例。下面的解决方案可以很容易地推广。在 bash 中,我们可以输入

> find . -mtime -1h
Run Code Online (Sandbox Code Playgroud)

但我想用纯 Perl 来做到这一点。下面的代码执行此操作。stat它明确地在每个文件上运行。

有什么办法可以让它变得更简单或更优雅吗?当然,这比 bash 命令慢;我并不是想与 bash 竞争效率。我只是想纯粹用 Perl 来做这件事。

#!/usr/bin/env perl 
use strict; use warnings;
use File::Find;
my $invocation_seconds=time;
my $interval_left =  $invocation_seconds - (60 * 60); # one hour ago
my $count_all=0;
my @selected;
find(
    sub
    {
        $count_all++;
        my $mtime_seconds=(stat($_))[9];
        return unless defined $mtime_seconds; # if we edit files while running current script, this can be undef on occasion 
        return unless ($mtime_seconds>$interval_left);
        push@selected,$File::Find::name;
    }
    ,
    '.', # current …
Run Code Online (Sandbox Code Playgroud)

perl find

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