このPerlスクリプトをファイルから読み込むように変換することはできますか?

Perlスクリプトを使用してデータの特定の列の中央値を取得したい、スクリプト内の配列から値を読み取るスクリプトを取得しました。

my (@vals, $med);
@vals =(12, 23, 34, 21, 66,66, 34, 87);
print "UNSORTED: @vals\n"; #sort data points 
@vals = sort(@vals); 
print "SORTED: @vals\n"; #test to see if there are an even number of data points 
if( @vals % 2 == 0) { #if pair then: 
$sum = $vals[(@vals/2)-1] + $vals[(@vals/2)]; 
$med = $sum/2; 
print "The median value is $med\n"; 
} 
else {                       #if odd then: 
print "The median value is $vals[@vals/2]\n"; 
} 
exit;

これを何とか変換して、複数の列のファイルからデータを読み込み、選択した列の中央値を計算することはできますか?シェルコマンドの./median.pl 1 column_numbers.tblと入力します。 私はこれを試みたが、data.txtファイルには1つの列しかない

my (@vals, $med, $sum1, @numbers, @sorted);
open (COLUMN, "< data.txt") || die "Can not open file : $! ";
my @not_sorted = ;                  
close (COLUMN);
@sorted = sort { $a <=> $b } @not_sorted;  
if (@vals % 2 == 0) {  
$med = ($sorted[int($N/2)]);             
print "MEDIAN = $med\n";
}
else {  
$sum1 = $vals[(@vals/2)-1] + $vals[(@vals/2)]; 
$med = $sum1/2;
print "MEDIAN = $vals[@vals/2]\n";
};

手伝ってくれてありがとう。

2
これは私にはあなたの前にこの質問をしてきたようです... 4〜5回程度です。これは私のためのコードを書いたものではありません。問題が発生したときには、努力して具体的な質問をしなければなりません。 perldoc.perl.org にはドキュメントがあります。 perlopen とそれに関連するファイルは、開始するのに適しているかもしれません。
追加された 著者 TLP,
繰り返します:具体的な質問をする必要があります。例:「3行目の構文エラー」というエラーが表示されます。この行には何の問題がありますか?それを行うと、あなたは助けを受けるでしょう。
追加された 著者 TLP,
はい、できます!私たちがあなたに何を試みたのかを示すだけで、私たちはあなたを助けることができます。
追加された 著者 gangabass,
これは私が前に尋ねたことの一部です。私が尋ねたことのほとんどを試して修正しました。あなたが私の質問に答えたいと思わないなら、あなたは自由ですが、私は努力していないと責めません。ありがとう
追加された 著者 Dav1,

2 答え

原則として、私はこの1つのTLPに同意しますが、今私は興味があるので、

#!/usr/bin/perl

use strict;
use warnings;

my $index = shift;
my $filename = shift;
my $columns = [];

open (my $fh, "<", $filename) or die "Unable to open $filename for reading\n";

for my $row (<$fh>) {

    my @vals = split/\s+/, $row;
    push @{$columns->[$_]}, $vals[$_] for 0 .. $#vals;
}

close $fh;

my @column = sort {$a <=> $b} @{$columns->[$index]};

my $offset = int($#column/2);
my $length = 2 - @column % 2;

my @medians = splice(@column, $offset, $length);

my $median;
$median += $_ for @medians;
$median /= @medians;

print "$median\n";

これは、データが空白で区切られている場合に限り動作します。最初の引数は0インデックスの列番号で、2番目の引数は有効なファイル名です。

もしあなたがperlに慣れていないなら、スカラーコンテキストの配列は、 my $ length = 2 - @column%2; $ median/= @medians;

0
追加された
どうもありがとうございます。あなたは正しいのですが、私は毎日改善するつもりですが、Perlで新しくなっていますが、あなたが好きな人を見つけて、人が学び続けることができて、問題に悩まされたときにあきらめることはないのがうれしいです。あなたはスクリプトを私に私が探していた結果を与える、今、残りをするつもりです... +1000の担当者。 ;)
追加された 著者 Dav1,

あなたは残りの列に興味がありますか?そうでない場合は、単純に無視してください。

このプログラムスニペットは、ファイルから行を読み込み、必要な列を配列 @medium_array にプッシュします。ほとんどの人は第1列を列#1と考えているが、Perlは列#0と考えるので、 COLUMN_OFFSET というオフセットを追加しました。

主な作業は次の行で行います。

push @medium_array, (split " ", $line)[$column_for_medium - COLUMN_OFFSET];

この行は push コマンドと split コマンドを使用します。あなたはこの行が何を理解するまで移動しないでください。

このプログラムは、より良いパラメータエラーチェックを使用することができます。ユーザーがファイル内の列数より大きい列を要求していますか?ファイルに列が存在しない場合はどうなりますか?ファイルが存在しない場合はどうなりますか?このすべてのものは、このプログラムで追加してチェックする必要があります。

最後に、このプログラムは目的の列を @medium_array に格納します。そこから、前のコードを使用してその列のメディアを見つけることができるはずです。

use strict;
use warnings;
use autodie;

use constant {
    COLUMN_OFFSET => 1,    #Incase you want to number cols from 1 instead of 0
};

# Read in the command line parameters

my $column_for_medium = shift;
my $file_name         = shift;

# Some sort of parameter checking

if (not defined $file_name and not $column_for_medium =~ /^\d+$/) {
   die qq(You must have two parames: "Column Num" and "File Name");
}

open (my $array_file, "<", $file_name);
my @medium_array;
while (my $line = <$array_file>)   {
   chomp $line;
   push @medium_array, (split " ", $line)[$column_for_medium - COLUMN_OFFSET];
}       
0
追加された
if文が期待通りに動作しません。 ではなく、またはを使用する必要があります。
追加された 著者 TLP,
問題は、あなたがファイルの名前を持つことを意図していたことです。あなたのファイルの名前は何ですか? open()のドキュメントは、どの引数が必要かを示しています。それらの議論を供給してください。
追加された 著者 tadmc,
-1は、テストされていないコードを投稿します。
追加された 著者 tadmc,
ありがとうございました!、アイデアは、例として最初の列を使用し、必要に応じて他の列を使用することです。例えば./script.pl 1 columns.tblまたは./script.pl 7 columns.tblまたは./script.pl "1:7" columns.tbl ...
追加された 著者 Dav1,
それは可能ですか?
追加された 著者 Dav1,
私はこのエラーがあります。 "厳密なサブ"が./open_file.pl行22で使用されている間は、 "FILE_NAME"は使用できません。何が問題なのですか?
追加された 著者 Dav1,