Perl正则表达式 - 存储对变量中正则表达式捕获的引用

时间:2014-04-21 21:52:22

标签: regex perl variables

只是想知道这是否有用:

my $capture = qr/perl pattern( is.*)/; 
my $string = "perl pattern is complicated";
my $print_it = "Printing test: $1\n";

if($string =~ m/$capture/){
print $print_it; 
} 

我尝试过以不同的方式引用$ print_it(qw,qr,'',“”),但是当我创建模式字符串并且没有在运行时设置时它是未初始化的。

其他方式,我敢肯定,但这很方便。

编辑: 这就是我想要完成的事情。我希望用户提供一个参数来定义如何格式化输入字符串。喜欢, - 格式1 输入字符串: “user = username Resources_used_cput = 20:00:01 Resources_used_walltime = 10:00” 假设我想根据命令行中的标志来提取walltime或cputime和用户名。我正在考虑定义一组格式化选项,例如0表示仅用户名,1表示用户名和cputime,2表示用户名和walltime。使用3可以很容易地使用暴力,只需为匹配定义一些if / then语句或大小写。随着这种扩展我更喜欢一个数组到一个大的if / / case列表。

$formats = (
qr/user=(\S+)/,
qr/user=(\S+).*Resources_used_cput=(\d+):(\d+):(\d+)/,
qr/user=(\S+).*Resources_used_walltime=(\d+):(\d+)/);
# These are wrong for reasons stated in answers:
$responses = (
"username is $1",
"user $1 used $4 seconds, $3 minutes and $2 hours of cputime"
"user $1 used $2 hours $3 minutes of walltime");

vs

if(m/user=(\S+).*Resources_used_cput=(\d+):(\d+):(\d+).*Resources_used_walltime=(\d+):(\d+)/){
$user=$1;
$wall="$5:$6";
$cpu="$2:$3:$4";
}
if($format == 0){
print "username is $user"
}
elsif....

我猜有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

你根本不需要引用$ capture;见下文。

my $capture = qr/perl pattern( is.*)/;
my $string = "perl pattern is complicated";
my $print_it = "Printing test: $1\n";

if($string =~ $capture){
   print $print_it;
   print "Printing test: $1\n";
}

但问题是在第3行的字符串中计算$ 1,而不是在打印它时。在上面的代码中,第二个“打印测试”将起作用,但第一个不会。

Printing test: 
Printing test:  is complicated

答案 1 :(得分:1)

$print_it变为代码参考。

my $print_it = sub { "Printing test: $1\n" };
...
print $print_it->();  # or print &$print_it;