perl 从多行变量中删除最后一行

oyxsuwqo  于 2023-05-29  发布在  Perl
关注(0)|答案(5)|浏览(206)

如何从多行变量中删除几行?
我从Expect中得到了这类东西,需要整理一下

$var='

total 20
drwxr-xr-x 5 drew.jess users 4096 2013-01-22 15:51 bash
drwxr-xr-x 2 drew.jess users 4096 2011-11-11 10:37 diff
drwxr-xr-x 8 drew.jess users 4096 2012-02-14 09:09 expect
drwxr-xr-x 3 drew.jess users 4096 2011-10-06 11:05 perl 
drwxr-xr-x 3 drew.jess users 4096 2013-02-07 13:10 python
drew ~ $

';

那些空白的行代表了我所拥有的。理想情况下,我想让$var看起来像这样:

$var='
total 20
drwxr-xr-x 5 drew.jess users 4096 2013-01-22 15:51 bash
drwxr-xr-x 2 drew.jess users 4096 2011-11-11 10:37 diff
drwxr-xr-x 8 drew.jess users 4096 2012-02-14 09:09 expect
drwxr-xr-x 3 drew.jess users 4096 2011-10-06 11:05 perl 
drwxr-xr-x 3 drew.jess users 4096 2013-02-07 13:10 python
';

我应该澄清一下;对我来说,这条问题的重要部分是删去以下一行:

drew ~ $

我想我能科普得了空白。

nimxete2

nimxete21#

您可以使用正则表达式替换:

$var =~ s/^\s*$//gm;

\s*将匹配换行符,但也会匹配其他您可能不想要的空格。^$以及行锚的开始和结束。/m修饰符允许锚点在字符串内部匹配,在行的开始/结束(例如在新行处)。

46scxncf

46scxncf2#

s/^[^\S\n]*\n//gm这样的正则表达式将删除所有只包含空格的行。

更新

如果你想做的不仅仅是删除空行,那么最好是将字符串split成行,并删除你不想要的行。这段代码使用grep删除全是空格的行,然后使用pop删除最后一行。

my @lines = grep /\S/, split /\n/, $var;
pop @lines;
$var = join '', map "$_\n", @lines;
print $var;

输出

total 20
drwxr-xr-x 5 drew.jess users 4096 2013-01-22 15:51 bash
drwxr-xr-x 2 drew.jess users 4096 2011-11-11 10:37 diff
drwxr-xr-x 8 drew.jess users 4096 2012-02-14 09:09 expect
drwxr-xr-x 3 drew.jess users 4096 2011-10-06 11:05 perl 
drwxr-xr-x 3 drew.jess users 4096 2013-02-07 13:10 python
aurhwmvo

aurhwmvo3#

this perlmonks answer
$var =~ s/(^|\n)[\n\s]*/$1/g;
有很多方法可以做到这一点。在我看来,没有问题,只是循环和删除空行。

6ovsh4lw

6ovsh4lw4#

你可以像处理单行字符串一样简单地修剪空格,然后添加一个终止换行符:

$var =~ s/^\s+//;  # Trim whitespace from beginning of string
$var =~ s/\s+$//;  # Trim whitespace from end of string
$var .= "\n";      # Add terminating newline
muk1a3rh

muk1a3rh5#

为了不使用正则表达式的另一种解决方案,您可以在循环中使用chomp

for ( 1 .. 2 ) {
    1 while chomp $var;
    $var = reverse $var;
}

相关问题