小编Dav*_*ner的帖子

Perl正则表达式不够贪心

我在perl中编写一个正则表达式来匹配perl代码,该代码启动perl子例程的定义.这是我的正则表达式:

my $regex = '\s*sub\s+([a-zA-Z_]\w*)(\s*#.*\n)*\s*\{';
Run Code Online (Sandbox Code Playgroud)

$ regex匹配启动子例程的代码.我还试图在$ 1中捕获子程序的名称以及子程序名称和$ 2中的初始开括号之间的任何空格和注释.这是2美元给我一个问题.

请考虑以下perl代码:

my $x = 1;

sub zz
# This is comment 1.
# This is comment 2.
# This is comment 3.
{
    $x = 2;
    return;
}
Run Code Online (Sandbox Code Playgroud)

当我将这个perl代码放入一个字符串并将其与$ regex匹配时,$ 2是"#This is comment 3. \n",而不是我想要的三行注释.我认为正则表达式会贪婪地将所有三行注释放入$ 2,但似乎并非如此.

我想了解为什么$ regex不起作用并设计一个简单的替代品.正如下面的程序所示,我有一个更复杂的替代品($ re3).但我认为理解为什么$ regex不起作用对我很重要.

use strict;
use English;

my $code_string = <<END_CODE;
my \$x = 1;

sub zz
# This is comment 1.
# This is comment 2.
# This is comment 3.
{
    \$x …
Run Code Online (Sandbox Code Playgroud)

regex perl regex-greedy

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

在perl中,可以在哈希初始化中使用HEREIS表示法吗?

我试图初始化这样的哈希:

use strict;

my %hash =
(
    key => <<END;
abc
def
END
    ,
    another_key => 17
);
Run Code Online (Sandbox Code Playgroud)

当我在这段代码上运行perl -cw时,我在hash-initialize-test.pl第5行,";"附近得到错误'语法错误.

有没有办法<<END;在哈希初始化中使用HEREIS表示法(如)?如果没有,为什么不呢?

有几个简单的解决方法,但我喜欢将HEREIS表示法用于多行字符串,因为它很优雅并且避免引入不必要的变量.

perl hash initialization

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

标签 统计

perl ×2

hash ×1

initialization ×1

regex ×1

regex-greedy ×1