2013-06-05 5 views
4

J'ai un script qui prend des chemins/fichiers qui sont trop vieux (comme décidé par l'utilisateur) et les supprime. Je veux lister chaque répertoire séparément et demander la confirmation de la suppression des anciens fichiers dans chaque répertoire. Donc, j'ai un tableau (@oldDirs) qui contient plusieurs tableaux (chaque répertoire), qui contiennent des chaînes (les chemins complets).Perl Foreach à travers une matrice multidimensionnelle?

@oldDirs = (@AirDefense,@Arcsight,@Avocent,@BlueCoat,@Checkpoint,@Cisco,@Crossbeam,@FireE ye,@lostAndFound,@rancid,@Riverbed,@Symantec,@Wiki,@WLAN) 

if($oldPathsSize != 0) 
{ 
    my $dirNamesCounter = 0; 
    my @dirNames =  ('/AirDefense','/Arcsight','/Avocent','/BlueCoat','/Checkpoint','/Cisco','Crossbeam','FireE ye','/lost+found','/rancid-2.3.8','/Riverbed','/Symantec','/Wiki','/WLAN'); 
    foreach my @direc (@oldDirs) 
    { 
     my $size = @direc; 
     print "Confirm Deletion of $size Old files in $dirNames[$dirNamesC]: \n"; 
     $dirNamesCounter++; 

     foreach my $pathname (@direc) 
     { 
      print "\t$pathname\n"; 
     } 

     print "\nDelete All?(y/n): "; 
     my $delete = <STDIN>; 
     chomp($delete); 

     if($delete eq "y") 
     { 
      #delete file 
     } 
    } 
} 

Ma question est la première foreach. Les deux sont des tableaux et @direc n'est pas autorisé car j'ai besoin d'avoir une valeur scalaire dans cette partie du foreach ... mais ce sont tous des tableaux! Comment suis-je censé faire cela, si c'est possible?

Répondre

14

Vous devriez lire perllol - Manipulating Arrays of Arrays in Perl. Vous ne pouvez pas créer un tableau multidimensionnel comme ceci:

my @array1 = (1, 2, 3); 
my @array2 = qw/a b c/; 
my @multi = (@array1, @array2); 

Au lieu de cela, les tableaux seront aplaties et @multi contiendront

1, 2, 3, 'a', 'b', 'c' 

Vous devez utiliser des références:

my @multi = (\@array1, \@array2); 
for my $ref (@multi) { 
    for my $inner (@$ref) { 
     # ... 
    } 
} 
+0

ohhhhhhh, références . Amusement! Ok, ben merci pour ta réponse et le lien! – geeoph

+3

note que \ est distributif, donc cela fonctionne: 'my @multi = \ (@ array1, @ array2);' – ysth

+0

grille, Merci – Jerry

Questions connexes