2017-08-22 46 views
-3

私は次の形式でデータを含むTXTファイルを持っている:ここではperlの.txtファイルから数値データを抽出する方法は?

Max.number : 900 
Min.number : 10 
Mid.number : 55 

は私のPerlのコードです:

open (FILE, ‘NAME.txt’) or die « $! »; 
while (<FILE>) { 
#I would like to choose Max.number and name it as $max.nb 
if (m^(Max.number)%:%(.*)/) 
print $max.nb 

ミス

の多くがあるかもしれないので、私は本当にperlの上で始めています
+2

これはperlコードではありません。 'use strict;'と 'use warnings;'を追加し、発行されたエラーと警告を修正してください。 – dgw

答えて

1

Perl変数名にはドットを含めることができないため、$max.nbは有効な変数名ではありません。あなたは$max_nbのために解決しますか?あなたはハードコードされたファイル名を取り除くと、オペレーティングシステムのIOリダイレクションはfilenandlesの世話をさせた場合

#!/usr/bin/perl 

# Always use these 
use strict; 
use warnings; 

# Lexical filehandle and three-arg open; 
open my $fh, '<', ‘NAME.txt’ or die $!; 

my $max_nb; 
while (<$fh>) { 
    next unless /^Max\.number/; 
    # split on colon and optional spaces. 
    # Only store second field. 
    (undef, $max_nb) = split /\s*:\s*/; 
} 

print $max_nb; 

あなたのプログラムは非常に簡単になります。

#!/usr/bin/perl 

# Always use these 
use strict; 
use warnings; 

my $max_nb; 
while (<>) { 
    next unless /^Max\.number/; 
    # split on colon and optional spaces. 
    # Only store second field. 
    (undef, $max_nb) = split /\s*:\s*/; 
} 

print $max_nb; 

これは、max_nbと呼ばれるファイルにされたと仮定すると、あなたはこのようにそれを呼び出すことができます。

$ ./max_nb NAME.txt 
900 

アップデート:コメントで、あなたはすべてのラインをキャプチャすることを示唆しています。それは事をかなり変えます。これで、データをハッシュに格納するのが理にかなっています。

#!/usr/bin/perl 

# Always use these 
use strict; 
use warnings; 
use feature 'say'; 

my %numbers; # hash 

while (<>) { 
    if (my ($key, $val) = /(^\w+)\.number : (\d+)/; 
    $numbers{$key} = $val; 
} 

say "$_: $numbers{$_}" for keys %numbers; 
+0

ありがとうございます。他のデータに対して同じプロセスを実行したいのであれば、同じスキームでelsifループだけを追加できますか? – chocovore17

+0

@ chocovore17:それはむしろ答えの全体の形を変えます。私の更新を参照してください。 –

関連する問題