chomp给我1和0

时间:2012-09-02 19:03:37

标签: perl

我有两段代码。第一个是我想要的。为什么它是第二个给我1和0(是我的英语正确,或者它是" 1s和0s")而不是" johnchrismandy&#34 ;


foreach (@data) {
    print ;
}
//output
john
chris
mandy


foreach  (@data) {
    print chomp ;
}
//output
110

UPDATE:: Thank you guys, I understand it more now. But I don't understand the last part of the doc.

foreach (@data) { print chomp ; } //output 110);

4 个答案:

答案 0 :(得分:6)

这是documented行为:"它返回从其所有参数中删除的字符总数。"你想要

for (@data) {
   chomp;
   print "$_\n";
}

请注意,$_@data元素的别名,因此@data也会被修改。如果你不希望这种情况发生。

for (@data) {
   my $item = $_;
   chomp($item);
   print "$item\n";
}

关于文档的最后一行:

my $item = $_;返回$item作为左值(适用于作业的 l eft-hand侧的值)。因此,

my $item = $_;
chomp($item);

可以写成

chomp( my $item = $_ );

答案 1 :(得分:1)

这是因为您正在打印chomp函数的返回值,这是从其所有参数中删除的字符总数

答案 2 :(得分:1)

chomp返回已删除字符的总数。

因此它会打印已删除的\n个。{/ p>

以下列方式进行:

foreach  (@data) {
    chomp($_);
    print $_;
}

答案 3 :(得分:0)

正如其他人所说,chomp返回删除的字符数。在我的特定实例中(在一行perl replace-in-file语句中使用eval修饰符的正则表达式),我需要在单个语句中获取chomped值而不需要单独的print语句。我终于找到了一个有效的解决方案 - 将chomp命令包装在if语句中。

从:

开始
$in = "I have COMMITS commits in my log";
$in =~ s/COMMITS/`git log | grep -i '^commit' | wc -l`/e;
print $in;

返回:

I have 256
 commits in my log

太好了,我需要选择这个,所以我试试:

$in = "I have COMMITS commits in my log";
$in =~ s/COMMITS/chomp `git log | grep -i '^commit' | wc -l`/e;
print $in;

但这会引发错误:

Can't modify quoted execution (``, qx) in chomp at ./script line 4, near "`git log | grep -i '^commit' | wc -l`}"
Execution of ./script aborted due to compilation errors.

是的,所以我需要将输出分配给一个局部变量并选择它:

$in = "I have COMMITS commits in my log";
$in =~ s/COMMITS/chomp (my $VAR = `git log | grep -i '^commit' | wc -l`)/e;
print $in;

但正如我们所说,chomp返回剥离的字符数:

I have 1 commits in my log

然后我发现我可以将它包装在if语句中并让它返回结果,chomped:

$in = "I have COMMITS commits in my log";
$in =~ s/COMMITS/if (chomp (my $VAR = `git log | grep -i '^commit' | wc -l`)) { $VAR }/e;
print $in;

最后,我在一个声明中得到了命令结果:

I have 256 commits in my log