制作一条单行

时间:2012-05-21 23:22:54

标签: perl

keyword harry /
sally/
tally/

希望每当字符串与关键字匹配时,它也应该寻找“/”字符。这表示继续行

然后我想输出

keyword harry sally tally 
==========================

我目前的代码:

#!/usr/bin/perl
open (file2, "trial.txt");

$keyword_1 = keyword;
foreach $line1 (<file2>) {
  s/^\s+|\s+$//g;
  if ($line1 =~ $keyword_1)    {
    $line2 =~ (s/$\//g, $line1) ;
    print " $line2 " ;
  }
}

4 个答案:

答案 0 :(得分:1)

如果问题中的=====行应该在输出中,请使用

#! /usr/bin/env perl

use strict;
use warnings;

*ARGV = *DATA;  # for demo only; delete

sub print_line {
  my($line) = @_;
  $line =~ s/\n$//;  # / fix Stack Overflow highlighting
  print $line, "\n",
        "=" x (length($line) + 1), "\n";
}

my $line = "";
while (<>) {
  $line .= $line =~ /^$|[ \t]$/ ? $_ : " $_";

  if ($line !~ s!/\n$!!) {  # / ditto
    print_line $line;
    $line = "";
  }
}

print_line $line if length $line;

__DATA__
keyword jim-bob
keyword harry /
sally/
tally/

输出:

keyword jim-bob
================
keyword harry sally tally
==========================

答案 1 :(得分:0)

您没有指定如何处理不包含关键字的行。不过,您可以使用此代码作为灵感:

#!/usr/bin/perl
use warnings;
use strict;

my $on_keyword_line;
while (<>) {
    if (/keyword/ or $on_keyword_line) {
        chomp;

        if (m{/$}) {
            chop;
            $on_keyword_line = 1;

        } else {
            $on_keyword_line = 0;

        }
        print;

    } else {
        $on_keyword_line = 0;
        print "\n";
    }
}

答案 2 :(得分:0)

我认为您需要简单地连接以斜杠结尾的所有行,而不管关键字是什么。

我建议使用此代码。

更新了以说明OP的评论,即延迟行被反斜杠终止。

while (<>) {
  s|\\\s*\z||;
  print;
}

答案 3 :(得分:0)

在处理连续的连续行时,redo非常有用。

my $line;
while ( defined( $line = <DATA> )) {
    chomp $line;
    if ( $line =~ s{/\s*$}{ } ) {
        $line .= <DATA>;
        redo unless eof(DATA);
    }
    $line =~ s{/}{};
    print "$line\n";
}
__DATA__
keyword harry /
sally/
tally/
and
done!!!

$ ./test.pl
keyword harry  sally tally and
done!!!