test.dat
ファイルのすべての行から特定の数値 (ここでは 499) を減算する小さなコードを書きました。しかし、これは機能していません。入力には、すべての行に数値が含まれます。私を助けてください
open (F1, "test.dat" );
foreach $line (F1)
{
$x = 0;
$x = $line-(499);
print $x;
$x = 0;
}
test.dat
ファイルのすべての行から特定の数値 (ここでは 499) を減算する小さなコードを書きました。しかし、これは機能していません。入力には、すべての行に数値が含まれます。私を助けてください
open (F1, "test.dat" );
foreach $line (F1)
{
$x = 0;
$x = $line-(499);
print $x;
$x = 0;
}
そこにはいくつかの異なるエラーがあります。それらが何であるかを単に説明するのではなく、小さな部分から始めてみませんか。test.dat を読み取るだけのスクリプトを作成し、読み取った各行を出力します。use strict;
とでスクリプトを開始use warnings;
し、変数を宣言します (例: foreach my $line (...
)
コードにはいくつかの問題があります:-
3-arg open
、ファイルを開くために使用する必要がありますbare
言葉を使うのではなくlexical variables
、file handle
<>
最初の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.
}
各行から 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.]+$/;
科学的記法については、もっと複雑ですが、おそらくそこまでする必要はありません。
あなたの質問の主なフレーズは、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 ;
}
}