-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;とでスクリプトを開始use warnings;し、変数を宣言します (例: foreach my $line (...)

于 2012-10-15T12:44:23.887 に答える
2

コードにはいくつかの問題があります:-

  • まず3-arg open、ファイルを開くために使用する必要があります
  • bare言葉を使うのではなくlexical variablesfile handle
  • そして、foreachループでは、ファイルハンドルをで囲む必要があります<>

最初の2つは慣例ですが、最後の2つは論理エラーです

だから、これがあなたがする必要がある変更です:-

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 に答える