我有像这样的perl代码
my $test = "gsfdsd gsfgsfg sfghsdg
Starting
gahgahd vvsfdh";
$test=~ m/(.*)Starting(.*)/;
print"test value = $1 \n";
当我执行此代码时,我什么都没得到,
test value =
但是当$test
字符串在同一行中时,即
my $test ="gsfdsd gsfgsfg sfghsdg Starting gahgahd vvsfdh";
我得到print语句的结果为
test value = gsfdsd gsfgsfg sfghsdg.
第一种情况有什么问题。唯一的区别是包含换行符空间。如何使第一个代码执行。
答案 0 :(得分:2)
正则表达式的error
修饰符会导致s
与换行符匹配。
所以你的正则表达式应该是
.
获得您想要的行为。
答案 1 :(得分:2)
除非您使用$test=~ m/(.*)Starting(.*)/s;
修饰符,否则该点与换行符不匹配。
/s
您确定要让换行符成为捕获的字符串的一部分吗?
答案 2 :(得分:2)
其他答案已经纠正了你的正则表达式。但如果您的目标是将字符串拆分为多行,请使用split
。
use strict;
use warnings;
use v5.10;
my $test = "gsfdsd gsfgsfg sfghsdg
Starting
gahgahd vvsfdh";
my @lines = split /\n/, $test;
say "First line: $lines[0]";
say "Second line: $lines[1]";
say "Third line: $lines[2]";
如果你的目标是获得第一行和第三行,使用split
意味着你不需要知道第二行的内容是什么。
答案 3 :(得分:1)
正如其他人所说,.
匹配除换行符之外的任何字符,因此您的.*
将不会超出该行的结尾
您可以使用\s*
简单地说明该空白。 \s
匹配任何空格字符,换行符是空格字符
my $test = "gsfdsd gsfgsfg sfghsdg
Starting
gahgahd vvsfdh";
$test =~ m/(.*)\s*Starting/;
print "test value = $1 \n";
test value = gsfdsd gsfgsfg sfghsdg
答案 4 :(得分:0)
使用替换和多行匹配来实现解决方案非常简单。
#!/usr/bin/perl
use strict;
use warnings;
my $test = "gsfdsd gsfgsfg sfghsdg
Starting
gahgahd vvsfdh";
$test=~ s/\n//mg;
print"test value = $test \n";
输出如下,
test value = gsfdsd gsfgsfg sfghsdg Starting gahgahd vvsfdh