我面临着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;
}上述代码的输出如下:
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移除最后一个字符串和尾随的新行。
发布于 2012-07-25 09:29:39
您只看到一串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";
}发布于 2012-07-25 08:41:30
不过,一开始都是我的错。
chomp函数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-25 08:44:32
如果您只是想去掉新行,可以使用regex:
my $var = $row[1];
$var=~s/\n//g;https://stackoverflow.com/questions/11645696
复制相似问题