Regex 在perl中删除变量的换行符

Regex 在perl中删除变量的换行符,regex,perl,Regex,Perl,我有这样的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";

我有这样的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"; 
我得到了打印语句的结果

test value = gsfdsd gsfgsfg sfghsdg.
第一个病例有什么问题。唯一的区别是包含换行符空间。如何执行第一个代码。

正则表达式的s修饰符导致。匹配换行符

所以你的正则表达式应该是

$test=~ m/(.*)Starting(.*)/s;

获取所需的行为。

除非使用/s修改器,否则点与换行符不匹配

$test =~ /(.*)Starting(.*)/s;

您确定要将换行符作为捕获字符串的一部分吗?

其他答案已更正您的正则表达式。但如果您的目标是将字符串拆分为行,请使用

如果您的目标是获得第一行和第三行,那么使用split意味着您不需要知道第二行的内容。

正如其他人所说。匹配除换行符以外的任何字符,因此您的.*将不匹配行尾以外的字符

您可以简单地使用\s*解释该空白\s匹配任何空白字符,而换行符是空白字符

my $test = "gsfdsd gsfgsfg sfghsdg 
Starting 
gahgahd vvsfdh";

$test =~ m/(.*)\s*Starting/;
print "test value = $1 \n";
输出
使用替换和多行匹配来实现该解决方案非常简单

#!/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 

哇!多快的答复啊。非常感谢,@bytepusher。它起作用了。一个人也可以在开始时分开,而OP似乎正试图这样做;或者,如果您对空白感兴趣,可以使用点的易变性,my@lines=$test=~/.+/g或/*\n/glines@Borodin聪明,但不必要的迟钝。我不太确定。无论如何,我都尽量不让文本嵌入换行符,而且通常要做的选择比查找换行符更多。在我看来,你的解决方案好像是shell在思考。@nandeeshv:注意,第二个。*是多余的,除非你也想使用$2。实际上,我正在尝试将打印的结果存储在终端上。我正在运行make文件并存储打印的结果,如下所示。系统制造;my$var=.\/fir.exe;我正在使用backsticks存储打印在屏幕上的结果screen@nandeeshv当前位置那么在问题中这样说会更好。如果使用“`my@result=command`”。然后,输出已经被拆分为行,每个数组元素一行。但是您想对结果做什么呢?您可以删除/m修饰符,因为您没有使用^or$Yeah。。谢谢你,爸爸,一开始我没注意到。
#!/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