U検定プログラム

unless(open(FILE_1, $ARGV[0])){
	print "File ", $ARGV[0], " is not found.";
}
unless(open(FILE_2,$ARGV[1])){
	print "File ", $ARGV[1], " is not found.";
}

$file_1_line = <FILE_1>;
$file_1_line =~ s/\x0A\x0D//g;
$file_1_line =~ tr/\x0A\x0D//d;

$file_2_line = <FILE_2>;
$file_2_line =~ s/\x0A\x0D//g;
$file_2_line =~ tr/\x0A\x0D//d;

my @file_1 = split(/\t/, $file_1_line);
my @file_2 = split(/\t/, $file_2_line);
my $sample_1 = shift @file_1;
my $sample_2 = shift @file_2;
my $n1 = 1+$#file_1;
my $n2 = 1+$#file_2;
my @file_total = (@file_1, @file_2);

#値の順位
my %ranking = ();
#順位
my $counter = 0;

#1つ前の値
my $prevalue = "-";

#同値の数
my $svalue_counter = "-";

#同じ値を持つサンプル集団の累積順位, 1,2,3番目の値が同じであれば1+2+3 = 6
#最後に累積順位を同値の数で割れば、必要な順位がでる
my $accumulation_counter = 0;

foreach my $line (sort{$a<=>$b} (@file_total)){
	$counter++;
	if ($line == $prevalue){
		$svalue_counter++;
		$accumulation_counter += $counter;
		$ranking{$line} = $accumulation_counter / $svalue_counter;
	}else{
		$svalue_counter = 1;
		$accumulation_counter = $counter;
		$ranking{$line} = $counter;
		$prevalue = $line;
	}
}
my $R1 = 0;
foreach my $line (@file_1){
	$R1 += $ranking{$line};
}
print $R1, "\t";
my $R2 = 0;
foreach my $line (@file_2){
	$R2 += $ranking{$line};
}
print $R2, "\r\n";

my $U1 = $n1*$n2 + $n1*($n1+1)/2 -$R1;
my $U2 = $n1*$n2 + $n2*($n2+1)/2 -$R2;

my $U0 = ();
if ($U1 < $U2){
	$U0 = $U1;
}elsif($U2 <= $U1){
	$U0 = $U2;
}else{
	print "error";
}
print $U1, "\t";
print $U2, "\t";
print $U0;