我正面临着 perl chomp 功能的问题。我有一个test.csv如下:
col1,col2
vm1,fd1
vm2,fd2
vm3,fd3
vm4,fd4
Run Code Online (Sandbox Code Playgroud)
我想打印这个 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;
}
Run Code Online (Sandbox Code Playgroud)
aboe 代码的输出是:
11111
Run Code Online (Sandbox Code Playgroud)
我真的不知道“1”是从哪里来的。实际上,最后一个文件可以打印如下:
foreach (@array)
{
my @row = split (/,/,$_);
print $row[1]; ### << Note that I am not printing "\n"
}
Run Code Online (Sandbox Code Playgroud)
输出是:
vm_cluster
fd1
fd2
fd3
fd4
Run Code Online (Sandbox Code Playgroud)
现在,我将这些字段值用作数据库的输入,并且由于这个不可见的换行符,DB INSERT 语句失败。所以我认为chomp会在这里帮助我。而不是咀嚼,它给了我“11111”。
你能帮我理解我在这里做错了什么。
谢谢。
阅读 loldop 的回复后添加更多信息:
如果我写如下,那么它不会打印任何东西(甚至不是上面提到的“11111”输出)
foreach (@array)
{
my @row = split (/,/,$_);
chomp ($row[1]);
my $var = $row[1];
print $var;
}
Run Code Online (Sandbox Code Playgroud)
意思是,chomp 正在删除最后一个字符串和尾随的新行。
您只看到一串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";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4083 次 |
| 最近记录: |