Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中,只有在第一行以冒号结尾时,如何将输入行与下一行连接起来?_Perl - Fatal编程技术网

在Perl中,只有在第一行以冒号结尾时,如何将输入行与下一行连接起来?

在Perl中,只有在第一行以冒号结尾时,如何将输入行与下一行连接起来?,perl,Perl,我的台词: ABC: XYZ XYZ ABC: XYZ XYZ: ABC XYZ ABC: AAB CCD 我想将以冒号结尾的行与下一行连接起来: ABC: XYZ XYZ ABC: XYZ XYZ: ABC XYZ ABC: AAB CCD 如果内容适合内存,请将其加载到单个变量中,然后执行以下操作: $text =~ s/:\n/: /g my$text; { 本地$/=”; $text=; $text=~s/:\n/:/g; } 打印$text; __资料__ ABC:XYZ XYZ

我的台词:

ABC: XYZ
XYZ ABC: XYZ
XYZ:
ABC
XYZ
ABC:
AAB
CCD
我想将以冒号结尾的行与下一行连接起来:

ABC: XYZ
XYZ ABC: XYZ
XYZ: ABC
XYZ
ABC: AAB
CCD

如果内容适合内存,请将其加载到单个变量中,然后执行以下操作:

$text =~ s/:\n/: /g
my$text;
{
本地$/=”;
$text=;
$text=~s/:\n/:/g;
}
打印$text;
__资料__
ABC:XYZ
XYZ ABC:XYZ
XYZ:
基础知识
XYZ
ABC:
AAB
CCD

到目前为止,这两个建议都建议将文件拖到内存中,但考虑到最初的问题,这并不是绝对必要的

#!/usr/bin/env perl

use strict;
use warnings;

my $text;
while( my $line = <DATA> ) {
    if ($line =~ s/ : \s+ \z /: /x) {
        $text .= $line;
    }
    else {
        print $text if is_nonempty_string($text);
        print $line;
        $text = '';
    }
}

print $text, "\n" if is_nonempty_string($text);

sub is_nonempty_string { defined($_[0]) and length($_[0]) }

__DATA__
ABC: XYZ
XYZ ABC: XYZ
XYZ:
ABC
XYZ
ABC:
AAB
CCD:
#/usr/bin/env perl
严格使用;
使用警告;
我的$text;
while(我的$line=){
如果($line=~s/:\s+\z/:/x){
$text.=$line;
}
否则{
如果为非空字符串($text),则打印$text;
打印$行;
$text='';
}
}
打印$text,“\n”如果是非空字符串($text);
sub为非空字符串{定义($\[0])和长度($\[0])}
__资料__
ABC:XYZ
XYZ ABC:XYZ
XYZ:
基础知识
XYZ
ABC:
AAB
CCD:

我尝试了一个更美观的版本

while (<DATA>) {
  chomp;
  print $_;
  print /:$/ ? " " : "\n";
}
while(){
咀嚼;
打印美元;
打印/:$/?“”:“\n”;
}
旧的、令人不快的尝试。 这个答案只将当前行保留在内存中,不需要对输入进行slurp处理,也不需要在内存中构建整个输出。它还可以正确处理空数据,如果没有输入,则不会打印

#!/usr/bin/env perl

use strict;
use warnings;

my $text;
while( my $line = <DATA> ) {
  if ($line =~ /:\s*\n/ && defined $text) {
      print $text;
      undef $text;
  }
  $line =~ s/:\s*\n/: /g;
  $text .= $line;
}
print $text if defined $text;

__DATA__
ABC: XYZ
XYZ ABC: XYZ
XYZ:
ABC
XYZ
ABC:
AAB
CCD
#/usr/bin/env perl
严格使用;
使用警告;
我的$text;
while(我的$line=){
如果($line=~/:\s*\n/&&defined$text){
打印$text;
未定义$文本;
}
$line=~s/:\s*\n/:/g;
$text.=$line;
}
如果定义了$text,则打印$text;
__资料__
ABC:XYZ
XYZ ABC:XYZ
XYZ:
基础知识
XYZ
ABC:
AAB
CCD

如果您只想修复文件,请使用以下命令行:

% perl -i.orig -pe 'chomp if /:$/' yourfile
如果您处于输入循环中,希望拥抱以冒号结尾的记录,请执行以下操作:

while (<>) {
    chomp;
    if (/:$/ && !eof) {
         $_ .= <>;
         redo unless eof;
    }
    # now you have your cuddled line(s), proceed as before
    ...
}
while(){
咀嚼;
如果(/:$/&&!eof){
$_ .= ;
重做,除非eof;
}
#现在你有了你的拥抱线,像以前一样继续
...
}
这假定文件的最后一行不是续行。

#/usr/bin/env perl
#!/usr/bin/env perl

use strict;
use warnings;

my $emit_eol;

while( my $line = <DATA> ) {
    $emit_eol = ($line =~ s/ : \s+ \z /: /x);
    print $line;
}

print "\n" if $emit_eol;

__DATA__
ABC: XYZ
XYZ ABC: XYZ
XYZ:
ABC
XYZ
ABC:
AAB
CCD:
严格使用; 使用警告; 我的$emit_eol; while(我的$line=){ $emit_eol=($line=~s/:\s+\z/:/x); 打印$行; } 如果$emit\u eol,则打印“\n”; __资料__ ABC:XYZ XYZ ABC:XYZ XYZ: 基础知识 XYZ ABC: AAB CCD:

即使内容可以存储在内存中,在几乎99.99%的情况下,咕噜咕噜是错误的答案。99.99%的情况下?就我个人而言,只要少打字,我就会做任何事。这是错的吗?@DanDman虚假的懒惰不是美德。编写可伸缩的算法,而不是爆炸的算法。@tchrist tchrist——Perl的孔子。在空输入上打印,在内存中保存整个输出。我试图在不改变原始解决方案精神的情况下改进原始解决方案。请随意回滚更改。好的,我想我今天早上的速度有点快。谢谢你,思南。看起来这个任务应该更简单。虽然说实话,空输入的东西并不让我担心。这似乎是一次性的,所以让我们假设它被用来做某事。更不用说,打印是为了展示,而不是最终使用。如果OP想要一个永久性的解决方案,让他们试试,边缘案例似乎比比皆是。可能重复@Sinan You是对的,但天哪,这些都是糟糕的答案。@tchrist如果我怀疑这些是家庭作业或面试问题,回答越差越好;-)@孩子们要求别人为他们做家庭作业,这让我目瞪口呆。这是我上大学时被开除的理由,没有上诉的余地。你做了你自己的工作。其他任何东西都是作弊。你在两个地方有相同的正则表达式。这似乎很复杂。尝试正确性和最小内存而不是简单性。简单性带来清晰。在算法中,就像在证明中一样,越简单、越干净,就越美观。为什么有两个变量?为什么这需要不止一个累加器变量呢?我从下面复制的代码开始,并做了最小的更改。我需要建立文本等待打印和行进来,可以添加到当前的输出linet或用于启动新的输出线。我懒洋洋地使用$text的未定义状态作为状态变量。这是一个非常大的假设,因为如果最后一行是一个延续,它将进入一个无限循环!“我喜欢这一行。”比尔,这就是我提到这个假设的原因。除非eof可以解决这个问题,但它在tty上不是很有用。只需要“重做除非eof”;if中的eof情况不是被while覆盖了吗?与其说是这么复杂,不如说是这么简单:(A)用冒号空格替换冒号换行符;(b) 打印。这些问题提出得不好,因为不可能确定他们是否只想让一个简单的程序将延续行作为筛选器或文件munger连接起来,或者这实际上是在询问如何修改现有的输入循环以解释所述延续。
#!/usr/bin/env perl

use strict;
use warnings;

my $emit_eol;

while( my $line = <DATA> ) {
    $emit_eol = ($line =~ s/ : \s+ \z /: /x);
    print $line;
}

print "\n" if $emit_eol;

__DATA__
ABC: XYZ
XYZ ABC: XYZ
XYZ:
ABC
XYZ
ABC:
AAB
CCD: