1

我是 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

4 回答 4

5

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

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

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

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

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

use strict;关于代码的附加说明:使用and可以为自己省去很多麻烦use warnings;,这需要使用myand进行变量声明our。你不需要打电话grep。就说吧if ($line =~ /gooty/) {。如果您的数据中可能存在额外的空白,则更好的拆分模式是\s+\|\s+. 这将消耗垂直条字段分隔符周围的空白。在这种情况下,您还想使用

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

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

于 2012-07-31T01:30:34.997 回答
1

您在 . 末尾有一个换行符$linechomp它,在拆分之前,以获得所需的输出。

chomp $line;

perldoc -f chomp

于 2012-07-31T01:30:13.877 回答
0

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

开始你的循环

$line =~ s/\s+\z//;
于 2012-07-31T11:56:37.790 回答
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

于 2012-07-31T01:50:49.293 回答