我是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
单行
答案 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;
,您将为自己省去很多麻烦,这需要使用my
和our
进行变量声明。您无需致电grep
。只需说if ($line =~ /gooty/) {
。如果您的数据中有任何额外空格的可能性,则更好的拆分模式为\s+\|\s+
。这将消耗垂直条字段分隔符周围的空白。在这种情况下,您还想使用
$line =~ s/\s+$//;
而不是chomp $line
。这将清除行尾的所有空格,包括行尾字符。
答案 1 :(得分:1)
答案 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//;