示例:my $pattern = "mkdir a &"
正如您所看到的,我的模式是命令,我想为“& + EOL”进行模式匹配,以区分此命令是否在后台运行。
我尝试使用/&$/
,/&\$/
,但失败了。
有什么问题?你对这种模式匹配的建议是什么?
45: if ($command =~ /&$/) {
DB<2> p $command
mkdir a &
DB<3> s
54: print $_;print "\n";
答案 0 :(得分:2)
你的模式运作良好
use strict;
use warnings 'all';
use feature 'say';
my $pattern = 'mkdir a &';
say $pattern =~ /&$/ ? 'match' : 'no match';
match
从你的问题中无法判断,但你可能在你想要匹配的字符串末尾有一些空格。也许你在那里有一个空格或换行符,或者你正在处理一个源自Windows的文件而你只删除了LF,留下了终止CR。
您可以通过在正则表达式模式的末尾添加可选的空格来解决此问题,例如
say $pattern =~ /&\s*$/ ? 'match' : 'no match';
您可以使用Data::Dumper
准确查看字符串包含的内容,例如
use Data::Dumper;
$Data::Dumper::Useqq = 1;
print Dumper $pattern;
在这种情况下,它会生成$VAR1 = "mkdir a &";
,您将能够看到&
之后是否有任何多余的字符。
答案 1 :(得分:0)
尝试使用此:/&\n|&$/
。
$
匹配字符串的结尾,因此如果您的命令都在同一个字符串中,则该模式将不起作用。
\n
匹配换行符。