Perl:打印带有更改的原始文件

时间:2014-04-30 12:04:13

标签: perl file printing

我编写了这段代码并且工作正常,它应该找到没有类似' SID'并附加管道在行的开头,就像这样:找到所有行中没有' SID'并附加管道在行的开头。但是我怎么写它,我只能输出改变的行并有一个管道。我真正想要的是:保持文件不变,只需将管道附加到匹配的行。谢谢。

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

my $fh;

open $fh, '<', 'file1.csv';
my $out = 'file2.csv';
open(FILE, '>', $out);

my $myline = "";
while (my $line = <$fh>) {
  chomp $line;
  unless ($line =~ m/^SID/) {
    $line =~ m/^(.*)$/;
    $myline = "\|$1";
  }
  print FILE $myline . "\n";
}

close $fh;
close FILE;

我的文件示例:

SID,bla
foo bar  <- my code adds the pipe to the beginning of this line 

输出应该是这样的:

SID,bla
| foo bar

但在我的情况下,我只打印$myline,我知道:

| foo bar

2 个答案:

答案 0 :(得分:0)

不要创建新变量$myline,而是使用您已有的变量:

while (my $line =<$fh>) {
    $line = '|' . $line if $line !~ /^SID/;
    print FILE $line;
}

此外,您还可以使用词法文件句柄作为输出文件。此外,您应该检查open的返回值:

open my $OUT, '>', $out or die $!;

答案 1 :(得分:0)

该行

$line =~ m/^(.*)$/

被误导:所有这一切都将$line的内容放入$1,所以以下陈述

$myline = "\|$1"

也可能是

$myline = "|$line"

(管道|不需要转义,除非它是正则表达式的一部分。)

由于您在循环结束时打印$myline,因此您永远不会看到未修改行的内容。

您可以通过打印$line$myline根据哪个包含所需的输出来解决此问题,例如

while (my $line = <$fh>) {
  chomp $line;
  if ($line =~ m/^SID/) {
    print "$line\n";
  }
  else {
    my $myline = "|$line";
    print "$myline\n";
  }
}

或者更简单地说,通过删除中间变量并使用默认的$_作为输入行,就像这样

while (<$fh>) {
  print '|' unless /^SID/;
  print;
}

请注意,我还删除了chomp,因为它只是意味着您必须在打印时将换行符放回字符串的末尾。