在perl中删除变量的换行符

时间:2017-05-27 21:28:44

标签: 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"; 

我得到print语句的结果为

test value = gsfdsd gsfgsfg sfghsdg.

第一种情况有什么问题。唯一的区别是包含换行符空间。如何使第一个代码执行。

5 个答案:

答案 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