谁能告诉我这个bug在哪里?

时间:2011-07-21 08:10:06

标签: perl

             use strict;
             use warnings;
             open(FILE4,"cool.txt");
             open(FILE6,">./mool.txt");
             $line = <FILE4>;
               while ($line ne "")
             {
                @array = split(/,/,$line);
                $line = <FILE4> ;
                print FILE6 ($array[0]);
                print FILE6 ("\t");
                print FILE6 ($array[1]);
                print FILE6 ("\t");
                print FILE6 ($array[2]);
             }

这是我用perl编写的代码。但是代码运行不正常。它为每个下一行提供标签空间。但我不需要每个新行的TAB空间。让我告诉你输出是如何的。

          name         contact        email
                       samy            32344245            hyte@some.com
                       alex            231414124           coool@some.com   

这就是我看到我的mool.txt文件的方式。第一行它工作正常。但是从下一行我面临标签空间。我正在试图找出错误的位置。任何人都可以让我知道在哪里代码出错了?我经历了很多次,但无法弄明白。谢谢你

有人要求我向你展示输入文件

        "name","contact","email"
        "samy","32344245","hyte@some.com"

3 个答案:

答案 0 :(得分:4)

您可能在输入文件的行的开头/结尾有空格。
尝试使用s///

剥离它
use strict;
use warnings;

open my $in, "<", "cool.txt" or die $!;
open my $out, ">", "mool.txt" or die $!;

while (my $line = <$in>) {
    $line =~ s/^\s+|\s+$//g;                    
    my @array = split(/,/, $line);
    print $out join("\t", @array), "\n";
}     

答案 1 :(得分:2)

将此语句放在while循环中。 chomp 这应该是从文件中读取一行后的第一行。这将删除不需要的空格。

use strict;
use warnings;
open(FILE4,"cool.txt");
open(FILE6,">./mool.txt");

while (<FILE4>)
{
     chomp; #This will remove unwanted spaces
     @array = split(/,/,$_); #$_ will represent the line which is read
     print FILE6 ($array[0]);
     print FILE6 ("\t");
     print FILE6 ($array[1]);
     print FILE6 ("\t");
     print FILE6 ($array[2]);
     print FILE6 ("\n");
 }

答案 2 :(得分:2)

您似乎正在做的是将此文件从逗号分隔更改为制表符分隔。如果是这样,这可能是一种更简单的方法:

while (<>) {
    s/,/\t/g;
    print;
}

然后像这样使用它:

$ script.pl cool.txt > mool.txt

你甚至可以使用单行代码:

perl -pwe 's/,/\t/g' cool.txt > mool.txt

或者如果你有奇怪的空白:

perl -pwe 's/^\s+|\s+$//g; s/,/\t/g' cool.txt > mool.txt

或者,更安全的版本,使用Text::CSV。这将为您处理复杂数据等。如果你得到空白输出,可能是你的额外空白弄乱了。如果是这样,您可以在没有s/,/\t/g行的情况下运行上面的单行,以获得输入文件的“清理”版本:

perl -pwe 's/^\s+|\s+$//g;' cool.txt > cool_clean.txt

脚本:

use warnings;
use strict;
use Text::CSV;
use autodie;

my $csv_in = Text::CSV->new();
my $csv_out = Text::CSV->new( { sep_char => "\t", eol => "\n" } );
open my $fh, '<', 'data.csv';
open my $out, '>', 'mool.txt';
while (my $row = $csv_in->getline($fh)) {
    $csv_out->print($out, $row);
}