我正面临着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正在删除最后一个字符串和尾随的新行。
答案 0 :(得分:3)
您只看到1
字符串的原因是您要打印的$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";
}
答案 1 :(得分:1)
chomp
函数return 1
&lt; - 使用此函数的结果。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;
}
答案 2 :(得分:1)
如果您只是想摆脱新行,可以使用正则表达式:
my $var = $row[1];
$var=~s/\n//g;
答案 3 :(得分: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];
}
这里是输出:
fd1fd2fd3fd4
后来我把这些单个值拉出来并插入到数据库中。
谢谢大家。