如何使这个foreach循环工作?

时间:2012-10-15 12:18:01

标签: perl

我已经编写了一个小代码来从我的test.dat文件的每一行中减去一个特定的数字(这里是499)。但这不起作用。输入包含每行中的数字。请帮帮我

open (F1, "test.dat" );


foreach $line (F1)
 {  
    $x = 0; 
    $x = $line-(499);
    print $x;
    $x = 0;              
}

4 个答案:

答案 0 :(得分:4)

你有几个不同的错误。而不只是告诉你它们是什么,你从一个较小的一块开始。创建一个只读取test.dat并打印出它读取的每一行的脚本。使用use strict;use warnings;开始您的脚本,并声明您的变量(例如foreach my $line (...

答案 1 :(得分:2)

您的代码几乎没有问题: -

  • 首先,您应该使用3-arg open打开文件
  • 您应该使用bare代替lexical variables
  • ,而不是使用file handle字词
  • 在foreach循环中,您需要将文件句柄括在<>

前两个是约定,但最后一个是逻辑错误

所以,这是你需要做的改变: -

open my $fh, '<', 'test.dat' or die 'Cannot open file:, $!';

foreach (<$fh>) {

    # $_ is the default special variable that holds the current element in loop
    # You can process $_ and subtract `499` from it and print it.
}

答案 2 :(得分:1)

如果你想要做的就是从每一行中减去499,我只会这样做:

perl -plwe '$_ -= 499' input.txt > output.txt

这相当于程序文件:

BEGIN { $^W = 1; }
BEGIN { $/ = "\n"; $\ = "\n"; }
while (<>) {
    chomp;
    $_ -= 499;
}
continue {
    die "-p destination: $!\n" unless print $_;
}

假设您的数据一致,它将按预期工作。它将无法处理非数字行,并将为任何此类行生成警告,但也会为此行创建错误的-499值。

作为对此类问题的简单修复,您可以跳过不包含预期数字的行,但随后添加的问题是数据中包含哪种数字。只有0-9个整数,你将获得:

next unless /^\d+$/;

对于浮点数:

next unless /^[\d.]+$/;

对于科学记数法,更复杂的东西,但也许我们不需要那么远。

答案 3 :(得分:-1)

由于你的问题中的主要短语是让你的foreach循环来处理你的dat文件,下面是逐行处理的正确方法,并用空字符串替换它(假设你想要实现的目标)< / p>

$DATFILE = test.dat; 

open(DATFILE) or die("Could not open log file.");
foreach $line (<DATFILE>) {

    # do line-by-line processing. some what like this 
   if($line =~ /499/g) {

       $line  =~ s/499//g ;

   }

}