如何在Perl中的$ 1,$ 2和$ 3变量中匹配和存储此字符串中的各行?
$string = "This is a line 1.\nThis is line 2.\nThis is line 3.\n";
我知道我必须使用/ m修饰符,但到目前为止我的尝试都没有成功。
我试过
$string =~ m/^(.*?)$.^(.*?)$.^(.*?)$/sm;
和其他组合无济于事。我想保持简单,所以任何指出错误的答案都会有所帮助。我想只尝试使用/ s和/ m修饰符。
答案 0 :(得分:6)
为什么要使用$
和^
来匹配中间换行符?
$string =~ m/^(.*)\n(.*)\n(.*)/ ;
既没有/ m也没有/ s。甚至只是
($a,$b,$c) = split /\n/,$string ;
答案 1 :(得分:4)
正在进行的是$.
被解析为一个变量(它是那些特殊的变量之一;输入文件中的行号):
$. = "foo";
print "matched" if ("foo" =~ m/$./);
解决方法是使用更多语法强制将$
解析为(?:$)
的正则表达式。但那很难看。我只是直接匹配新行(或使用拆分):
$string =~ m/^(.*)\n(.*)\n(.*)$/;
答案 2 :(得分:2)
我修复了你的正则表达式:
$string =~ m/^(.*?)\n(.*?)\n(.*?)$/sm;
'$'。被视为变量(警告use warnings; use strict;
)
BTW - 将它们分配给一个数组:
my @list = $string =~ m/^(.*?)\n(.*?)\n(.*?)$/sm;
答案 3 :(得分:1)
my ( $first_line, $second_line, $third_line, $rest_if_any )
= split( /\n/m, $string, 4 )
;
答案 4 :(得分:0)
好的,我找到了。被视为变量的$.
是线索。我用过:
$string =~ m/^(.*?)$(.)^(.*?)$(.)^(.*?)$/sm;
并打印$1
,$3
,$5
。
谢谢大家。
答案 5 :(得分:0)
如果您想使用变量$1
,$2
和$3
,可以通过创建一个未将$.
视为“{1}}”的正则表达式字符串来执行此操作变量
my $string = "This is a line 1.\nThis is line 2.\nThis is line 3.\n";
my $rex = q/^(.*?)$.^(.*?)$.^(.*?)$/; #The . between $ and ^ is the newline
$string =~ m/$rex/sm;
要表明这是正确的,您可以使用Data::Dumper
。
use Data::Dumper;
print Dumper($1,$2,$3);
这将输出:
$VAR1 = 'This is a line 1.';
$VAR2 = 'This is line 2.';
$VAR3 = 'This is line 3.';
更进一步,表明了。在$和^之间匹配换行符,您可以添加以下内容:
$rex = q/^(.*?)$(.)^(.*?)$(.)^(.*?)$(.)/;
$string =~ m/$rex/sm;
print Dumper($1,$2,$3,$4,$5,$6);
这将输出:
$VAR1 = 'This is a line 1.';
$VAR2 = '
';
$VAR3 = 'This is line 2.';
$VAR4 = '
';
$VAR5 = 'This is line 3.';
$VAR6 = '
';