2017-02-07 6 views
0

私はファイルを開いてスキャンして、正、負、ゼロの数をプリントアウトしようとしています。私はプログラムを正常にファイルを開くが、 "周波数"を見つけることは私にトラブルを与えているものです。私は授業の日に病気だったので、私の特定のプロンプトに関するヘルプを見つけることができないようです。これまで私が持っているものは次のとおりです。ファイル内の正、負、およびゼロの整数の特定の量/頻度はどのようにして調べることができますか? (Perl)

#!/usr/bin/perl 
use strict; 
use warnings; 
my ($ctrZ) = (0); 
while(my $num = <DATA>) { 
     chomp($num); 
     ## print "num=[$num]\n"; 
     if ($num =~ /^-\d+$/) { 
       $ctrZ++; 
     } 

printf("freq(0):%9s\n", $ctrZ); 

exit; 
__DATA__ 
19 
-22 
498 
512 
15 
-932 
0 
22 
808 
17 
-32 

注:私たちの教授は、私たちに使用するファイルを与えました。各行に1つの番号が付いた.txtファイルです。

+1

ます。http://perldoc.perl。 org/perlop.html#関係演算子 – toolic

+0

'chomp($ infile);のようなコメントが本当に必要ですか? #Chomps $ infile Variable.'? – Borodin

+0

はい、私たちの教授は私たちにそれらを持ってほしいと思っています。また、私は間違ったコードを追加しました。これは私が持っているものです。私はちょうど0個の整数がファイル内にどれくらいあるか調べる必要があります。 –

答えて

1

ありあなたのコードで問題のカップルだが、主要な一つはこれです:ファイル名のみです$infileの内容を評価しています

if ($infile) { 
     $Pos_Int++; 
     $Neg_Int++; 
     $Zer_Int++; 
} 

を。それは常に真実なので、常にカウンターを1つ増やします。

ここでやっていることは、基本的には線を集めることです。 、そして、配列にそれを読んで、配列を反復

open(FHIN, '<', $infile); #Opens the file prompted by user. 
my @lines = <FHIN>; #Variable storing the number of lines in the file. 
chomp(@lines); 
close(FHIN); 

ファイルを開く:

は、私はまた、あなたがする必要がないこと、しかし示唆していますか?

代わりにwhileループで1行ずつ行かないでください(メモリも少なくなります)。

また、グローバルスコープである大文字の名前ではなく、字句ファイルハンドルを使用することをお勧めします。

ので:

open (my $input, '<', $infile) or die $!; #check return code for errors. 
while (my $line = <$input>) { #iterate the input line by line, setting $_ for each. 
    $Pos_Int++ if $line > 0; 
    $Neg_Int++ if $line < 0; 
    $Zer_Int++ if $line == 0; 
} 

は、トリックを行う必要があります - それはすべての入力の検証を行いませんが、心の中でクマを。必要であれば、正規表現がそこで助けてくれるかもしれません。また

if (-e $infile) { #If the file can't be found, it will exit. 

    } else { 
     print ("No such file exists. Program closing.\n"); 
      exit; 
} 

これは、あなたができるので、冗長である - とすべき - トラップopenからの戻りコード。そうすると、ファイルが読めなくなったり、壊れたシンボリックリンクやその他の問題が発生したりするなど、他の条件が発生します。

など。

open (my $input, '<', $infile) or die "Problem opening file: $!"; 

$!はあなたにあまりにももう少し有意義だエラーコードを与えるだろう - それはあなたが「いいえそのようなファイルまたはディレクトリ」と例えば「権限拒否」の違いを教えてあげましょう。

+1

また、存在のテストが余分であることを指摘する価値はあります。なぜなら、 'open'の状態は、とにかくチェックされなければならないからです。 – Borodin

+0

良い点。私は改正するつもりです。 – Sobrique

+1

ちょうど注:*英語の冗長*は、*過剰*、*贅沢*、または*正常*を超えるようなものを意味する可能性があります。例えば、二要素認証は「冗長」なセキュリティです。だからこそ私はこれらのページで余計な*に固執しています。 – Borodin

-1

<=>演算子を使用して、必要なものを正確に取得することができます。 perldoc perlopによれば:

バイナリ「<=>」左 引数が数値的に等しい、以下右 引数よりも大きいか否かに応じて-1、0、又は1を返します。

だから、

numbers.txtを想定し

$ perl -MData::Dumper -wne '$count{$_ <=> 0}++; END { print Dumper(\%count); }' numbers.txt 

には、次のものが含まれています

111 
0 
-892 
-664 
21 
0 
63 
868 
-351 
-263 
467 
-58 
625 
724 
0 
0 
990 
107 
-739 
-501 
-386 
909 
-96 
0 
-735 

出力は次のようになります。

$VAR1 = { 
      '0' => 5, 
      '1' => 10, 
      '-1' => 10 
     }; 
関連する問題