标签: perl

为什么这个正则表达式会变慢?

m/.+?(\d{4})<\/i>\)/s

当我在一些正常大小的HTML页面上运行时,上面的正则表达式很慢?为什么?我不认为它应该慢慢运行.

编辑:这是一个代码示例,演示了这个问题:

use WWW::Mechanize;
my $mech = new WWW::Mechanize;
$mech->get("http://www.elaws.gov.bw/desplaysubsidiary.php?m=SUBSIDIARY&v=I&vp=&id=904");
$page = $mech->content();
$page =~ m/.+?(\d{4})<\/i>\)/s;
Run Code Online (Sandbox Code Playgroud)

正则表达式线需要永远.如果我删除.+?没有延迟.

regex perl backtracking

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

Perl - 逗号上的拆分字符串.忽略空格

我有这个字符串:

$str="     a, b,    c>d:e,  f,    g ";
Run Code Online (Sandbox Code Playgroud)

在此字符串中可能有空格和/或制表符

我在perl中拆分了字符串:

my (@COLUMNS) = split(/[\s\t,]+/, $str));
Run Code Online (Sandbox Code Playgroud)

但这会在位置[0]中创建一个领先的空间.

@COLUMNS=[

    a
    b
    c>d:e
    f
    g
]
Run Code Online (Sandbox Code Playgroud)

我要这个:

@COLUMNS=[
    a
    b
    c>d:e
    f
    g
]
Run Code Online (Sandbox Code Playgroud)

regex perl whitespace split comma

3
推荐指数
2
解决办法
2302
查看次数

编码模块和引号

我正在抓取一个网页,并从中提取一个特定的部分.该部分包括引号(,字符146).我正在尝试将提取的数据打印到文本文件中,但是它给了我’而不是反转的逗号.我尝试过以下方法:

  • $content =~ s/’/'/g;
  • my $invComma = chr 146; $content =~ s/$invComma/'/g;
  • $content =~ s/\x{0092}/'/g;

它都没有奏效.我不能,decode('UTF-8', $content)因为它有广泛的人物.当我尝试encode('UTF-8', $content)’改变’来代替.我已经尝试use utf8过,没有效果.

我知道我的文本文件查看器可以显示引号,因为我将一个打印到测试文件并打开它.因此问题在我的脚本中.

我做错了什么,我该如何解决?

更新:我能够$content =~ s/’/'/g用简单的撇号替换它,但我仍然不知道为什么没有其他工作.我也想要一个能够解决问题的解决方案,而不仅仅是解决其中一个症状.

更新2:我被hobbs告知,这个角色实际上已经U+2019 RIGHT SINGLE QUOTATION MARK改变了我的正则表达式chr 0x2019,现在可以使用了.

perl encoding utf-8

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

Perl - 为什么有必要指定使用'state'功能?

在学习Perl时,我试图创建一个记住以前值的函数时遇到了这个问题.

代码:

use strict;
use warnings;

sub running_sum {
    state $sum;
    state (@numbers);

    foreach my $number (@_) {
        push @numbers, $number;
        $sum += $number;
    }

    $sum;
}

print running_sum(1..2);
print running_sum(3..5);
Run Code Online (Sandbox Code Playgroud)

当我尝试运行它时,我收到以下错误:

Global symbol "$sum" requires explicit package name (did you forget to declare "my $sum"?) at ../tmp.pl line 12.
Global symbol "@numbers" requires explicit package name (did you forget to declare "my @numbers"?) at ../tmp.pl line 13.
Global symbol "@numbers" requires explicit package name (did you forget to declare …
Run Code Online (Sandbox Code Playgroud)

perl

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

我可以在不实现子构造函数的情况下创建Perl子类吗?

在Perl中是否可以在不实现构造函数的情况下创建子类?我不需要任何特定于子类的构造函数行为,所以我想从父类继承.

在这个例子中,我有一个基类Base.pm和一个子类Child.pm.该Child班应该简单地覆盖在其父的方法之一:

# test.pl
use strict;
use warnings;
use Child;

my $o = Child->new();
$o->exec();
Run Code Online (Sandbox Code Playgroud)

-

# Base.pm
package Base;

sub new{
    my $self = {};

    bless $self;
    return $self;
}

sub exec{
    my $self = shift;
    die "I'm in the Base class\n";
}

1;
Run Code Online (Sandbox Code Playgroud)

-

# Child.pm
package Child;

use Base;
@ISA = ('Base');

sub exec{
    my $self = shift;

    die "OVERRIDE in child\n";
}

1;
Run Code Online (Sandbox Code Playgroud)

当我运行test.pl时,Base类的 exec方法被执行(我假设它是因为对象BaseBase.pm构造函数中得到了祝福). …

perl

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

Perl线程中断睡眠不起作用

我想理解,因为如果我运行这段代码

#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';

use threads;
use threads::shared;

sub mythread {
    my $end = 0; # Thread termination variable

    while(!$end) {
        eval {
            local $SIG{'ALRM'} = sub {
                print "SIGALARM received\n";
                $end = 1;
                die "Alarm!\n";
            };

            sleep(5); # Wait
        };
        die $@ unless $@ eq "Alarm!\n";
    }
}

my $end = 0; # Main termination variable
$SIG{'INT'} = sub {
    $end = 1; # Set Main termination variable
};

my $thr = threads->create( \&mythread …
Run Code Online (Sandbox Code Playgroud)

perl multithreading sleep

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

Perl中的日期格式问题

我有以下代码:

    $epoc = $rs->{'lastlogin'};
    $date = localtime($epoc);
Run Code Online (Sandbox Code Playgroud)

lastlogin 是一个Unix时间戳.

输出如下: Tue Jul 5 13:46:43 2016

我在找Tue Jul 5 2016 13:46:43.如您所见,年份移至左侧一个位置.

我也是一个新手,所以我从这里尝试了一些匹配:Perl中的日期和时间函数,但我找不到来自Unix时间戳的日期格式匹配.

perl

3
推荐指数
2
解决办法
164
查看次数

执行/忽略代码的Perl方式(如C中的assert)

我在Perl编程(V 5.20.2在Debian 8)真正的初学者,我期待实现"调试"与Perl的执行时间上的开销时,我并不需要调试的方法.

在C中,我们可以使用assert-Dgcc选项(通常,您可以通过使用与您自己的定义constante相同的方式来执行自己的断言MY_DEBUG).

好吧,首先想法只是设置一个全局变量debug并再次测试它,但是当我不想处于调试模式时它会产生一堆无用的测试.

有像断言Carp :: Assert这样的CPAN模块,但似乎即使我不想调试也会有if测试.

是否有一种Perl方式可以根据"某些东西"停用代码部分?

额外的问题:我想制作一个具有相同功能的Perl模块,所以如果有办法说"启用/禁用调试",那么use MyModule,我将是一个快乐的Perl开发人员.

perl

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

带有IO :: Socket :: SSL的SSL_ca_path不使用目录中的证书

我想使用SSL_ca_pathssl选项,因为它更可靠.问题是它不使用给定目录中的证书.

此代码有效:

  local $NET::HTTPS::SSL_SOCKET_CLASS = 'IO::Socket::SSL';
  my $ua = LWP::UserAgent->new(ssl_opts => {
    SSL_ca_file => "/etc/pki/tls/certs/ca-bundle.crt",
  #  SSL_ca_path => "/etc/pki/tls/certs/",
  });
Run Code Online (Sandbox Code Playgroud)

但使用SSL_ca_path而不是SSL_ca_file打破脚本.

不工作

  local $NET::HTTPS::SSL_SOCKET_CLASS = 'IO::Socket::SSL';
  my $ua = LWP::UserAgent->new(ssl_opts => {
  #  SSL_ca_file => "/etc/pki/tls/certs/ca-bundle.crt",
    SSL_ca_path => "/etc/pki/tls/certs/",
  });
Run Code Online (Sandbox Code Playgroud)

既不将证书重命名为*.pem也不删除/路径中的尾部都可以解决问题.

目录和文件的权限和所有者是相同的(770)

完整的脚本:https://github.com/Benedikt1992/nagios-jenkins-plugin/blob/master/check_jenkins_job_extended.pl#L71-L75

verification perl ssl lwp-useragent

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

从类似JSON的数据中删除":"

我有一个1,00,000行的JSON文本文件.手动提取不公平.我编写了一个Perl程序来读取文件的每一行,满足我的需求.

这是一个示例文本文件

Sample.txt的

  "key": "Programming",
  "doc_count": 1

  "key": "Base",
  "doc_count": 1,

  "key": "Experience",
  "doc_count": 1

  "key": "Electrophoresis",
  "doc_count": 1
Run Code Online (Sandbox Code Playgroud)

我想把键值单独用双括号分隔,比如编程,基础,经验和电泳.

这是我尝试过的Perl代码:

ExtractKeyValue.pl

use strict;
use warnings;

my $file = $ARGV[0];
open my $info, $file or die "Could not open $file: $!";

while ( my $line = <$info> ) {
    if ( $line =~ /"key(.*)",/ ) {
        print $1;
        print "\n";
    }
}

close $info;
Run Code Online (Sandbox Code Playgroud)

通过使用它,我得到这个输出

": "Programming
": "Base
": "Experience
": "Electrophoresis
Run Code Online (Sandbox Code Playgroud)

我不想要领先的冒号和空间.

我试过了$line =~ /"key: …

regex perl

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