首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl的Chomp: Chomp正在删除整个单词,而不是换行符

Perl的Chomp: Chomp正在删除整个单词,而不是换行符
EN

Stack Overflow用户
提问于 2012-07-25 08:33:18
回答 4查看 4.2K关注 0票数 4

我面临着perl chomp函数的问题。我有一个test.csv,如下所示:

代码语言:javascript
复制
col1,col2
vm1,fd1
vm2,fd2
vm3,fd3
vm4,fd4

我想打印这个csv的第二个字段。这是我的密码:

代码语言:javascript
复制
#!/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;
}

上述代码的输出如下:

代码语言:javascript
复制
11111

我真的不知道"1“是从哪里开始的。实际上,最后一份文件可以打印如下:

代码语言:javascript
复制
foreach (@array)
{
    my @row = split (/,/,$_);
    print $row[1];     ###  << Note that I am not printing "\n"
}  

产出如下:

代码语言:javascript
复制
vm_cluster
fd1
fd2
fd3
fd4

现在,我使用这些字段值作为DB的输入,而DB INSERT语句由于这条不可见的换行符而失败。所以我想chomp会帮我。而不是咬牙切齿,它给我"11111“。

你能帮我理解我在这里做错了什么吗?

谢谢。

阅读loldop的回应后添加更多信息:

如果我按下面的方式写,它就不会打印任何东西(即使是上面提到的"11111“输出)。

代码语言:javascript
复制
foreach (@array)
{
    my @row = split (/,/,$_);
    chomp ($row[1]); 
    my $var = $row[1]; 
    print $var;
}

意思是,chomp移除最后一个字符串和尾随的新行。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-25 09:29:39

您只看到一串1的原因是要打印$val的值,这是从chomp返回的值。chomp不返回经过修剪的字符串,它修改其参数就地,并返回从末尾移除的字符数。由于它总是准确地删除一个"\n"字符,因此为数组的每个元素都提供了一个1输出。

您确实应该使用use warnings而不是-w命令行选项,这里没有理由将整个文件读入数组中。但是在使用三个参数形式的open的词法文件句柄方面做得很好。

下面是对你的程序的快速重构,它可以做你想做的事情。

代码语言:javascript
复制
#!/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";
}
票数 5
EN

Stack Overflow用户

发布于 2012-07-25 08:41:30

不过,一开始都是我的错。

chomp函数return 1 <- -使用该函数的结果。

此外,您还可以在下面找到这个糟糕的示例。但是如果你用数字的话,它会起作用的。有时我用这种欺骗(不要那样做!)这是我的坏密码!)

map{/filter/ && $_;}@all_to_filter;

而不是这个,使用

grep{/filter/}@all_to_filter;

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2012-07-25 08:44:32

如果您只是想去掉新行,可以使用regex:

代码语言:javascript
复制
my $var = $row[1];
$var=~s/\n//g;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11645696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档