perl:在一行中打印新行

时间:2012-07-31 01:24:58

标签: perl

我是perl的新手。 当我试图在while循环中打印数组的值和一个变量时, 变量在新行中打印。

while($line=<FH>)
{
    chomp($line);
    $tem = grep(/gooty/,$line);
    if($tem==1)
    {
        $Date=$date;
        @array=split(/\|/,$line);
        $sth = "INSERT INTO TABLE VALUES $array[1],$array[2],$date \n";
    }
}
print "$sth \n";

输出:

INSERT INTO TABLE VALUES alan ,777  
,2012-07-31

我希望输出为:

INSERT INTO TABLE VALUES alan ,777,2012-07-31

单行

4 个答案:

答案 0 :(得分:5)

这是新的perl程序员的常见问题。说

while (defined($line = <FH>))
{
    chomp $line; # Eliminate terminating newline if there
    ...

如果结果仍然不正确,您可能正在尝试使用不能正确处理它们的Perl版本(如Cygwin)来读取带有MSDOS / Windows行结尾的文本文件。这可能会导致chomp出现故障。您可以使用此方法解决问题:

$line =~ s/[\r\n]+$//;

这会清除行尾的所有行结尾字符,无论有多少。

关于代码的其他说明:使用use strict;use warnings;,您将为自己省去很多麻烦,这需要使用myour进行变量声明。您无需致电grep。只需说if ($line =~ /gooty/) {。如果您的数据中有任何额外空格的可能性,则更好的拆分模式为\s+\|\s+。这将消耗垂直条字段分隔符周围的空白。在这种情况下,您还想使用

$line =~ s/\s+$//; 

而不是chomp $line。这将清除行尾的所有空格,包括行尾字符。

答案 1 :(得分:1)

$line结尾处有换行符。在分割之前chomp,以获得所需的输出。

chomp $line;

perldoc -f chomp

答案 2 :(得分:0)

我假设你不希望你的@array元素被空格字符包围。然后我们应该在打印之前修剪它们。

my $line = <FH>;

my $date = '2012-07-31'; # or whatever

if($line =~ /gooty/)
{
    my @array = split /[|]/, $line;
    foreach (@array) {
      s/^\s+//; # removes leading  whitespaces
      s/\s+$//; # removes trailing whitespaces
    }
    print "INSERT INTO TABLE VALUES $array[1],$array[2],$date \n";
}

这应该打印所需的输出。

但是,在您向我们展示输入之前,我无法确定您是否提供了产生意外输出的代码。 (或者你可以修改循环和$sth语句之间的print吗?我看到你附加了两个换行符?)

顺便说一下:use strict; use warnings

答案 3 :(得分:0)

最干净的方法,而不是使用chomp,是从行尾删除所有尾随空格

使用

开始循环
$line =~ s/\s+\z//;