【问题标题】:New to perl... having problems with chompperl 新手... 有 chomp 问题
【发布时间】:2011-11-07 03:53:05
【问题描述】:

我正在尝试学习 perl 编程并使用它来读取比赛中的文件;

#!/usr/local/bin/perl
use warnings;

open(FILE, <~/source/test.txt>);
@array = <FILE>;
$number = shift @array;

while($number--) {
    chomp($key = shift @array);
    chomp($message = shift @array);

    print "Key: $key";
    print "Message: $message";
}
print "\n";
close(FILE);

该文件包含一个数字 N,然后是 2 * N 行,其后是有多少键/消息对。

但是当我执行这个程序时,它只打印出最后一条“消息”而没有其他任何内容......它不会打印任何其他内容。如果我删除 chomps 它会按预期工作,但有了 chomps 那里它只会​​切断一切......有什么想法吗?

//编辑:去掉-w

【问题讨论】:

  • 您的第一行应该是文件中的行数,并且每个键和消息都必须在新行中
  • 你应该使用严格的。 Why use strict and warnings?
  • -wuse warnings; 或多或少是多余的。 -w 也为任何模块启用警告,这在当今被认为是一个坏主意(因为某些较旧的模块在启用警告的情况下可能无法正常工作)。建议:使用use stricts; use warnings;,去掉-w
  • @run,我没有创建比赛...他们是这样描述的,第一行是密钥/消息对的数量。

标签: perl


【解决方案1】:

您正在 unix 机器上读取 DOS/Win 文本文件。使用chomp,您将删除“CRLF”的“LF”,但留下“CR”,导致所有行一个接一个地显示。

#!/usr/local/bin/perl -w
use strict;   # Do use this!
use warnings;

open(my $fh, '<', "$ENV{HOME}/source/test.txt") or die $!;
my @array = <$fh>;
s/\s+\z// for @array;  # Universal chomp

my $number = shift(@array);
while ($number--) {
   my $key     = shift(@array);
   my $message = shift(@array);

   print "Key: $key\n";
   print "Message: $message\n";
}

【讨论】:

  • s/\s+\z// 还会删除尾随空格和制表符,这可能是您想要的,也可能不是。
  • @Keith Thompson,确实,但如果你必须处理一种依赖于有意义的尾随空格的格式,我很同情你。
  • 所以我应该使用my。我一直在寻找教程和一些参考my,而有些则没有变量...谁能指出我最近的一个体面的 perl 教程?
  • @Nicholas, my 创建范围有限的变量。限制变量的范围是计算机科学的基本原则,所以我不知道有任何教程专门涵盖了这一点。您应该使用use strict; 让 Perl 在您忘记声明(或拼写错误)变量时告诉您(以及其他一些超级有用的检查)。
  • @Nicholas :对于 Perl 教程,您可以从这里开始:tutorials
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多