只是想知道这是否有用:
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....
我猜有更好的方法吗?
答案 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;