4

我正面临 perl chomp 函数的问题。我有一个test.csv如下:

col1,col2
vm1,fd1
vm2,fd2
vm3,fd3
vm4,fd4

我想打印这个 csv 的第二个字段。这是我的代码:

#!/usr/bin/perl -w
use strict;

my $file = "test.csv";
open (my $FH, '<', $file);
my @array = (<$FH>);
close $FH;

foreach (@array)
{
    my @row = split (/,/,$_);
    my $var = chomp ($row[1]);     ###   <<< this is the problem
    print $var;
}

aboe 代码的输出是:

11111

我真的不知道“1”是从哪里来的。实际上,最后一个文件可以打印如下:

foreach (@array)
{
    my @row = split (/,/,$_);
    print $row[1];     ###  << Note that I am not printing "\n"
}  

输出是:

vm_cluster
fd1
fd2
fd3
fd4

现在,我使用这些字段值作为 DB 的输入,并且 DB INSERT 语句由于这个不可见的换行符而失败。所以我认为 chomp 会在这里帮助我。而不是咀嚼,它给了我“11111”。

你能帮我理解我在这里做错了什么吗?

谢谢。

阅读 loldop 的回复后添加更多信息:

如果我写如下,那么它不会打印任何东西(甚至不是上面提到的“11111”输出)

foreach (@array)
{
    my @row = split (/,/,$_);
    chomp ($row[1]); 
    my $var = $row[1]; 
    print $var;
}

意思是, chomp 正在删除最后一个字符串和尾随的新行。

4

4 回答 4

5

您只看到一串1s 的原因是您正在打印的值$val是从chomp. chomp不返回修剪后的字符串,它就地修改其参数并返回从末尾删除的字符数。由于它总是只删除一个"\n"字符,因此您会1为数组的每个元素获得一个输出。

你真的应该use warnings代替-w命令行选项,这里没有理由将整个文件读入数组。但是在使用具有三参数形式的词法文件句柄时做得很好open

这是您的程序的快速重构,它将执行您想要的操作。

#!/usr/bin/perl
use strict;
use warnings;

my $file = 'test.csv';
open my $FH, '<', $file or die qq(Unable to open "$file": $!);

while (<$FH>) {
    chomp;
    my @row = split /,/;
    print $row[1], "\n";
}
于 2012-07-25T09:29:39.060 回答
1

虽然,一开始是我的错。
chompfunction return 1<- 使用这个函数的结果。
另外,您可以在下面找到这个不好的示例。但它会起作用,如果你使用数字。有时我使用这个作弊(不要那样做!这是我的坏黑客代码!)
map{/filter/ && $_;}@all_to_filter;
而不是这个,使用
grep{/filter/}@all_to_filter;

foreach (@array)
{
    my @row = split (/,/,$_);
    my $var = chomp ($row[1]) * $row[1];     ###   this is bad code!
    print $var;
}

foreach (@array)
{
    my @row = split (/,/,$_);
    chomp ($row[1]);
    my $var = $row[1];  
    print $var;
}
于 2012-07-25T08:41:30.737 回答
1

如果您只是想摆脱新行,可以使用正则表达式:

my $var = $row[1];
$var=~s/\n//g;
于 2012-07-25T08:44:32.337 回答
0

所以,我对这个看似简单的任务整天困扰着我感到非常沮丧。我真的很感谢所有回复的人。

最后,我最终使用 Text::CSV perl 模块,然后将每个 CSV 字段调用为数组引用。使用 Text::CSV 后无需再运行 chomp。

这是代码:

#!/usr/bin/perl 
use warnings;
use strict;
use Text::CSV;


 my $csv = Text::CSV->new ( { binary => 1 } )  # should set binary attribute.
                  or die "Cannot use CSV: ".Text::CSV->error_diag ();


open my $fh, "<:encoding(utf8)", "vm.csv" or die "vm.csv: $!";

<$fh>;  ## this is to remove the column headers.

while ( my $row = $csv->getline ($fh) )
{
    print $row->[1];
}

这是hte输出:

fd1fd2fd3fd4 

后来我被拉出这些单独的值并插入到数据库中。

谢谢大家。

于 2012-07-25T17:09:15.877 回答