【发布时间】:2014-10-05 04:55:16
【问题描述】:
我有一些字符串,我需要删除这个字符串中第一个空行之后的所有内容。
我试过用这个
$string = ~s/\^\s*$.*//
但是这个表达式会删除字符串中的所有字符!
【问题讨论】:
-
= ~不是绑定运算符=~,它是=赋值运算符和~按位求反。
我有一些字符串,我需要删除这个字符串中第一个空行之后的所有内容。
我试过用这个
$string = ~s/\^\s*$.*//
但是这个表达式会删除字符串中的所有字符!
【问题讨论】:
= ~ 不是绑定运算符=~,它是= 赋值运算符和~ 按位求反。
使用以下内容:
\h 匹配水平间距,\n 匹配换行符/m 修饰符允许^ 匹配任何行/s 修饰符,因此任何字符都将匹配换行符如图所示:
use strict;
use warnings;
my $string = do {local $/; <DATA>};
$string =~ s/^\h*\n.*//ms;
print $string;
__DATA__
Hello World
Second Line
New Paragraph
another line
final line
输出:
Hello World
Second Line
要将标题与正文分开,只需使用split。
从技术上讲,模式应该只是 /\n\n/,但鉴于您的问题的上下文,我建议:
my ($header, $body) = split /\n\h*\n/, $string, 2;
【讨论】:
split。
$string =~ s/^\h*\n.*//ms; 和我的$string =~ s/\^\s*$.*//
\^ 而不是正则表达式符号作为行首 ^。此外,您没有使用 /m 修饰符来更改 ^ 和 $ 的含义以匹配任何行。此外, \s* 将匹配换行符。如果没有 /s 修饰符,任何字符都不会匹配换行符。您的方法存在一些问题。