【问题标题】:Perl - Printing the next linePerl - 打印下一行
【发布时间】:2009-07-03 15:09:19
【问题描述】:

我是一个新手 Perl 用户,我想尽快完成我的工作,以便我今天可以准时回家 :)

基本上我需要在文本文件中打印下一行空白行。

以下是我目前所拥有的。它可以完美地定位空白行。现在我只需要打印下一行。

    open (FOUT, '>>result.txt');

die "File is not available" unless (@ARGV ==1);

open (FIN, $ARGV[0]) or die "Cannot open $ARGV[0]: $!\n";

@rawData=<FIN>;
$count = 0;

foreach $LineVar (@rawData)
    {
        if($_ = ~/^\s*$/)
        {
            print "blank line \n";
                    #I need something HERE!!

        }
        print "$count \n";
        $count++;
    }
close (FOUT);
close (FIN);

非常感谢:)

【问题讨论】:

  • 将整个文件放入内存是否明智?所示练习并非 100% 必要。
  • 即使您想使用数组,也不需要 1%。看看 Tie::File(自 5.8 以来的核心部分,大约在 2002 年左右)。
  • 文件没有那么大,但绝对不是个好主意。我会看看 Tie::File :) 谢谢

标签: regex perl newline


【解决方案1】:
open (FOUT, '>>result.txt');

die "File is not available" unless (@ARGV ==1);

open (FIN, $ARGV[0]) or die "Cannot open $ARGV[0]: $!\n";

$count = 0;

while(<FIN>)
{
    if($_ = ~/^\s*$/)
    {
            print "blank line \n";
            count++;
            <FIN>;
            print $_;

    }
    print "$count \n";
    $count++;
}
close (FOUT);
close (FIN);
  • 不将整个文件读入@rawData 可以节省内存,尤其是在大文件的情况下...

  • &lt;FIN&gt; 作为命令将下一行读入 $_

  • print ; 本身就是 print $_; 的同义词(尽管这次我选择了更明确的变体...

【讨论】:

  • 如果您连续有两个空行,上述情况会发生什么?大概你想打印第二个空白行之后的行,但是这段代码会跳过这样一行,不是吗?
  • @blackkettle:非常正确。如果这是一个要求,那么 Ron/malach 的解决方案会更好。
  • 非常感谢您的解决方案 :) 幸运的是我的文件没有连续两个空白。
【解决方案2】:

详细阐述 Ron Savage 的解决方案:

foreach $LineVar (@rawData)
    {
        if ( $lastLineWasBlank ) 
           {
                print $LineVar;
                $lastLineWasBlank = 0;
           }
        if($LineVar  =~ /^\s*$/)
        {
                print "blank line \n";
                    #I need something HERE!!
                $lastLineWasBlank = 1;
        }
        print "$count \n";
        $count++;
    }

【讨论】:

  • 我想你想要if($LineVar =~ /^\s*$/),因为你没有在循环中使用 $_,是吗?
  • 另外,你想要01 你有falsetrue 吗? (Perl 中没有内置的布尔值,是吗?)
  • 所以如果我要使用这个解决方案,我需要在“真”和“假”周围加上引号吗?
  • 感谢指正,好久没做Perl了
  • @mr.flow3r:不,你不能直接用'true'和'false'来做,即使你引用它们。 (好吧,除非你测试 $flag eq 'true' 是否太罗嗦。)我会在 Perl 中使用 0 和 1 作为简单的布尔值。
【解决方案3】:

我会这样做,但可能还有其他方法可以做到:

for ( my $i = 0 ; $i < @rawData ; $i++ ){
   if ( $rawData[$i] =~ /^\s*$/ ){
       print $rawData[$i + 1] ; ## plus check this is not null
   }
}

J.

【讨论】:

  • 这不是打印所有非空行吗?
【解决方案4】:
sh> perl -ne 'if ($b) { print }; if ($b = !/\S/) { ++$c }; END { print $c,"\n" }'

根据自己的喜好添加输入文件名。

【讨论】:

    【解决方案5】:

    添加一个像 $lastLineWasBlank 这样的变量,并在每个循环结束时设置它。

    if ( $lastLineWasBlank ) 
       {
       print "blank line\n" . $LineVar;
       }
    

    类似的东西。 :-)

    【讨论】:

      猜你喜欢
      • 2020-02-29
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2015-09-12
      • 2013-03-01
      • 1970-01-01
      相关资源
      最近更新 更多