Perl 的 Chomp : Chomp is removing the whole word instead of the newline

标签 perl

我正面临着 perl chomp 功能的问题。
我有一个 测试.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 INSERT 语句失败。所以我认为chomp会在这里帮助我。而不是咀嚼,它给了我“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";
}

关于Perl 的 Chomp : Chomp is removing the whole word instead of the newline,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11645696/

相关文章:

database - 在 Perl 模块中部署数据库的好方法?

perl - 如何默认设置ComboBoxEntry?

c - Perl XS : Memory management

perl - 为什么不证明接受 -MCarp=verbose?

perl - 无法在 Perl 中打开子目录中的文件

Perl Ubuntu WordNet::SenseRelate::AllWords - 安装过程中的相似性问题

javascript - CGI:如何在 JavaScript 中增加 Perl 变量

perl - 无法从日志文件中提取特定信息

linux - 使用 Perl 无法在 @INC 中找到 DBI.pm

perl - 在 Perl 中,如果强制使用 foreach 循环,如何找到字符串中匹配的位置?位置