2010-11-05 5 views
1

Je donne les résultats suivants:Une ligne pour accéder à un élément de tableau dans Perl?

my @path = split("/", getcwd); 
my $grandParent = $path[-2]; 

Je voudrais le faire en une seule ligne (comme dans d'autres langues) depuis que je ne suis pas à l'aide @path à nouveau, comme ceci:

my $grandParent = split("/", getcwd)[-2]; 

Est-ce possible? Si c'est le cas, comment?

EDIT: Juste pour être clair - où je cours le manuscrit de je sais que certaines choses vont être invariantes (la structure de répertoire, les noms, etc.). Cela étant dit, la validation est agréable, mais dans ce scénario, c'est plus encombrant que cela en vaut la peine; Merci à ceux qui ont soumis des solutions avec une vérification d'erreur de toute façon.

Répondre

5

devrait être:

use Cwd; 
... 

my $grandParent = (split '/', getcwd) [-2]; 

Addendum: une autre façon (en quelque sorte plus 'perlienne'):

... 

my ($parent, $grandParent) = reverse split qr{/}, getcwd(); 

(en tenant compte de certaines tchrist's bons conseils)

Addendum 2: Certains co Il se peut que le répertoire $grandparent ne figure pas dans le répertoire

. Si elle est utilisée dans le répertoire racine sur un système Unix «/», ci-dessus résultat dans:

$parent = undef; 
$grandParent = undef; 

si dans un répertoire directement sous «/», par exemple. '/ somedir',

$parent = 'somedir'; 
$grandParent = ''; # empty string 

ainsi vous pouvez vérifier pour cette condition. En outre, le reverse inverse l'ordre des éléments du chemin divisé, donc vous savez que vous devez regarder les (deux) premiers éléments pour savoir où vous êtes.

Cordialement

RBO

+0

Merci, je me suis dit qu'il y avait un chemin, mais je suis vraiment nouveau à perl :) – javamonkey79

+0

L'addendum n'est pas clair pour moi. En fait, j'aime mieux la solution de @ zigdon, mais puisque votre première solution est assez claire, fonctionne, et était avant que vous obteniez l'acceptation :) – javamonkey79

+3

@ javamonkey79: réponse zigdons était en fait le premier, il était plus rapide d'environ 10 secondes si je Rappelez-vous correctement ... –

6

Mettre les résultats de la division dans une liste temporaire:

my $grandParent = (split("/", getcwd))[-2]; 
4

Thinngs à retenir:

  1. Vous devez tenir compte pour ne pas avoir assez liste les éléments de retour, et aussi pour quand l'élément applicable finit par être la chaîne vide. Le premier argument est un motif, pas une chaîne, donc vous devriez le rappeler aux gens en l'écrivant comme une opération de correspondance.
  2. getcwd()getcwd() est une fonction nullaire, pas un mot, donc vous devriez le rappeler aux autres en utilisant des parens vides.

    $grandparent = (split(m{/}x, getcwd()))[-2] || "/"; 
    

Cela ne fonctionnera pas sur les systèmes de fichiers non-POSIX; Au lieu de cela, voir File::Spec.

Veuillez ignorer les coloriages idiotes de SO, qui font plus de mal que de bien.

+0

La coloration de SO est terrible pour Perl, mais c'est plutôt bon ou la plupart des langues. Dans l'ensemble, j'ai appris à ignorer comment Perl est coloré ici. –

+4

Vous pouvez utiliser '

...
' pour désactiver la mise en surbrillance. –

2

Une façon portable est d'utiliser la méthode de splitdirFile::Spec:

use Cwd; 
use File::Spec; 

my $grand_parent = (File::Spec->splitdir(getcwd()))[-2] || File::Spec->rootdir(); 
+0

Cela a toujours le bug de chemin court. – tchrist

+0

tchrist: Merci de mentionner. Je l'ai réparé. –

Questions connexes