-4

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

open (F1, "test.dat" );


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

4 回答 4

4

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

于 2012-10-15T12:44:23.887 回答
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.
}
于 2012-10-15T12:52:59.323 回答
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.]+$/;

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

于 2012-10-15T16:43:01.733 回答
-1

由于您问题中的主要短语是让您的 foreach 循环来处理您的 dat 文件,以下是逐行处理并将其替换为空白字符串的正确方法(假设这就是您要实现的目标)

$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 ;

   }

}
于 2012-10-15T12:49:02.303 回答