我编写了这段代码并且工作正常,它应该找到没有类似' 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
答案 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
,因为它只是意味着您必须在打印时将换行符放回字符串的末尾。