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)
正则表达式线需要永远.如果我删除.+?没有延迟.
我有这个字符串:
$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) 我正在抓取一个网页,并从中提取一个特定的部分.该部分包括引号(’,字符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时,我试图创建一个记住以前值的函数时遇到了这个问题.
代码:
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中是否可以在不实现构造函数的情况下创建子类?我不需要任何特定于子类的构造函数行为,所以我想从父类继承.
在这个例子中,我有一个基类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方法被执行(我假设它是因为对象Base在Base.pm构造函数中得到了祝福). …
我想理解,因为如果我运行这段代码
#!/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) 我有以下代码:
$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编程(V 5.20.2在Debian 8)真正的初学者,我期待实现"调试"与Perl的执行时间上的开销时,我并不需要调试的方法.
在C中,我们可以使用assert和-Dgcc选项(通常,您可以通过使用与您自己的定义constante相同的方式来执行自己的断言MY_DEBUG).
好吧,首先想法只是设置一个全局变量debug并再次测试它,但是当我不想处于调试模式时它会产生一堆无用的测试.
有像断言或Carp :: Assert这样的CPAN模块,但似乎即使我不想调试也会有if测试.
是否有一种Perl方式可以根据"某些东西"停用代码部分?
额外的问题:我想制作一个具有相同功能的Perl模块,所以如果有办法说"启用/禁用调试",那么use MyModule,我将是一个快乐的Perl开发人员.
我想使用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
我有一个1,00,000行的JSON文本文件.手动提取不公平.我编写了一个Perl程序来读取文件的每一行,满足我的需求.
这是一个示例文本文件
"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代码:
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: …
perl ×10
regex ×3
backtracking ×1
comma ×1
encoding ×1
sleep ×1
split ×1
ssl ×1
utf-8 ×1
verification ×1
whitespace ×1