[英]Perl's Chomp: Chomp is removing the whole word instead of the newline
我遇到了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
现在,我将这些字段值用作数据库的输入,并且由于此不可见的换行符,数据库INSERT语句失败。 所以我认为排骨可以在这里帮到我。 而不是砍,它给我“ 11111”。
你能帮我了解我在这里做错了吗。
谢谢。
阅读loldop的回复后添加更多信息:
如果我这样写,那么它将不会打印任何内容(甚至上面提到的“ 11111”输出也不会)
foreach (@array)
{
my @row = split (/,/,$_);
chomp ($row[1]);
my $var = $row[1];
print $var;
}
意思是,chomp删除了最后一个字符串和尾随的新行。
您仅看到1
s的字符串的原因是,您正在打印$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";
}
不过,一开始是我的错。
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;
}
如果您只是想摆脱换行,可以使用正则表达式:
my $var = $row[1];
$var=~s/\n//g;
因此,这一整日困扰我的任务看上去很容易让我感到沮丧。 我非常感谢每个做出回应的人。
最后,我最终使用了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
后来我被拉出这些单独的值并插入到数据库中。
感谢大家。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.