#!/usr/bin/perl -w  
use strict; 
use Data::Dumper; 
my $ref_matrius = &llegir_matrius; 
 
my @keys = keys %{$ref_matrius}; 
while (my $m = shift (@keys)){ 
    open (MAT_RAND, ">matrius_random/$m") or die $!; 
    my $j=0; 
	while ($j<20){ 
	    my $random_mat = &randomizar_mats ( ${$ref_matrius}{$m} ); 
	    $j = $j+1; 
	   
	    print MAT_RAND "I\$".$m."_r$j\n"; 
	    foreach my $fila (1..(scalar @{$random_mat})){ 
		print MAT_RAND "$fila   "; 
		foreach my $freq (@{${$random_mat}[$fila-1]}){ 
		    print MAT_RAND "$freq   "; 
		} 
		print MAT_RAND "\n"; 
	    } 
	    print MAT_RAND "//\n"; 
	} 
    close (MAT_RAND); 
} 
 
sub esta_en_la_fila 
{ 
    my ($arref, $a) = @_; 
    foreach my $i (@{$arref}){ 
	return 1 if ($i eq $a); 
    } 
    return 0; 
} 
sub randomizar_mats 
{ 
    my $rmat = shift @_; 
    my $n = 0; 
    my $rmat_random; 
 
    while ($n < scalar@{$rmat}){ 
	my @fila = (@{${$rmat}[$n]}); 
	my $cont_pos=0; 
	
	my @usades =(); 
	my @fila_random; 
	while ( $cont_pos<4) 
	    
	    my $pos = int (rand(4)); 
	    
	    while (&esta_en_la_fila (\@usades, $pos)){ 
		$pos = int (rand(4)); 
	    }	 
	    push @usades,$pos;  
	    
	    $fila_random[$pos]=$fila[$cont_pos]; 
	    $cont_pos = $cont_pos + 1; 
        } 
	push @{$rmat_random}, [ @fila_random ]; 
	$n = $n +1; 
	
    }     
    return $rmat_random; 
} 
 
sub llegir_matrius 
{ 
    my %hash_mat; 
    
    while (my $matrius = <STDIN>){ 
	chomp ($matrius); 
	my $liniaID; 
	my $i=0; 
	my @mat; 
	 
	while (!($matrius =~ m/\/\//)){ 
	    if($matrius =~ m/(^I.*$)/){     
		$liniaID = $1; 
	    } else { 
		my ($pos, @valores) = split (/\s+/, $matrius); 
		
		$mat[$i] = [@valores]; 
		$i = $i + 1; 
		$hash_mat {$liniaID}=[@mat]; 
	    } 
	       $matrius = <STDIN>;
	    
	} 
	
	} 
	return \%hash_mat; 
    
    }
  
 |