Domanda

Sto cercando di ottenere un elenco di sottodirectory in una determinata directory usando qualcosa come il seguente:

#!/usr/bin/perl -wT
use strict;
use warnings;

use File::Find::Rule;
use Data::Dumper;

my @subdirs = File::Find::Rule->maxdepth(1)->directory->relative->in('mydir');

print Dumper(@subdirs);

Tuttavia, eseguendo questo si ottiene il risultato:

  

Dipendenza non sicura in chdir durante l'esecuzione con l'opzione -T

Comprendo che File :: Find ha opzioni per gestire la modalità taint, ma non riesco a trovare un equivalente in File :: Trova :: Rule . È possibile fare quanto sopra? Devo usare un metodo alternativo per elencare le sottodirectory? Ho completamente frainteso qualcosa di ovvio che dovrei davvero capire sulla modalità contaminazione?

È stato utile?

Soluzione

( Modifica !) Va bene, la logica suggerisce che il lancio di quanto segue funzioni:

->extras( {untaint => 1, untaint_pattern => $untaint_pattern, untaint_skip => 1} )

Ciò consente di utilizzare le funzionalità in modalità taint di File :: Find passando gli argomenti direttamente alla funzione find () di quel modulo. Per inciso, File :: Find menziona che si dovrebbe impostare $ untaint_pattern usando l'operatore qr // . Ad esempio, il valore predefinito è

$untaint_pattern = qr|^([-+@\w./]+)$|

Tuttavia , questo non funziona! In effetti, il problema è un bug noto in File :: Trova :: Regola. (Ad esempio, ecco i CPAN e Debian segnalazioni di bug.) Se desideri un bugfix, allora entrambi quelle segnalazioni di bug hanno delle patch.

Se ti trovi in ??un ambiente limitato, una cosa che puoi fare è essenzialmente implementare tu stesso la patch nel tuo codice. Ad esempio, se si desidera conservare tutto in un unico file, è possibile aggiungere il blocco di codice grande riportato di seguito dopo utilizzare File :: Trova :: Regola . Si noti che questa è una soluzione molto rapida e potrebbe non essere ottimale. Se non funziona per te (ad esempio perché hai spazi nei nomi dei file), modifica il modello qr | ^ ([- + @ \ w ./ lasting+)$ | utilizzato .

Nota infine che se vuoi che la tua organizzazione del codice sia un po 'migliore, potresti voler scaricare questo in un pacchetto separato, forse chiamato MyFileFindRuleFix o qualcosa del genere, che usi sempre dopo File :: Trova :: regola stesso.

package File::Find::Rule;
no warnings qw(redefine);
sub in {
    my $self = _force_object shift;

    my @found;
    my $fragment = $self->_compile( $self->{subs} );
    my @subs = @{ $self->{subs} };

    warn "relative mode handed multiple paths - that's a bit silly\n"
      if $self->{relative} && @_ > 1;

    my $topdir;
    my $code = 'sub {
        (my $path = $File::Find::name)  =~ s#^(?:\./+)+##;
        $path = "." if ($path eq ""); # See Debian bug #329377
        my @args = (

( Modifica !) Va bene, la logica suggerisce che il lancio di quanto segue funzioni:

->extras( {untaint => 1, untaint_pattern => $untaint_pattern, untaint_skip => 1} )

Ciò consente di utilizzare le funzionalità in modalità taint di File :: Find passando gli argomenti direttamente alla funzione find () di quel modulo. Per inciso, File :: Find menziona che si dovrebbe impostare $ untaint_pattern usando l'operatore qr // . Ad esempio, il valore predefinito è

$untaint_pattern = qr|^([-+@\w./]+)$|

Tuttavia , questo non funziona! In effetti, il problema è un bug noto in File :: Trova :: Regola. (Ad esempio, ecco i CPAN e Debian segnalazioni di bug.) Se desideri un bugfix, allora entrambi quelle segnalazioni di bug hanno delle patch.

Se ti trovi in ??un ambiente limitato, una cosa che puoi fare è essenzialmente implementare tu stesso la patch nel tuo codice. Ad esempio, se si desidera conservare tutto in un unico file, è possibile aggiungere il blocco di codice grande riportato di seguito dopo utilizzare File :: Trova :: Regola . Si noti che questa è una soluzione molto rapida e potrebbe non essere ottimale. Se non funziona per te (ad esempio perché hai spazi nei nomi dei file), modifica il modello qr | ^ ([- + @ \ w ./ lasting+)$ | utilizzato .

Nota infine che se vuoi che la tua organizzazione del codice sia un po 'migliore, potresti voler scaricare questo in un pacchetto separato, forse chiamato MyFileFindRuleFix o qualcosa del genere, che usi sempre dopo File :: Trova :: regola stesso.

<*>, $File::Find::dir, $path); my $maxdepth = $self->{maxdepth}; my $mindepth = $self->{mindepth}; my $relative = $self->{relative}; # figure out the relative path and depth my $relpath = $File::Find::name; $relpath =~ s{^\Q$topdir\E/?}{}; my $depth = scalar File::Spec->splitdir($relpath); #print "name: \'$File::Find::name\' "; #print "relpath: \'$relpath\' depth: $depth relative: $relative\n"; defined $maxdepth && $depth >= $maxdepth and $File::Find::prune = 1; defined $mindepth && $depth < $mindepth and return; #print "Testing \'

( Modifica !) Va bene, la logica suggerisce che il lancio di quanto segue funzioni:

->extras( {untaint => 1, untaint_pattern => $untaint_pattern, untaint_skip => 1} )

Ciò consente di utilizzare le funzionalità in modalità taint di File :: Find passando gli argomenti direttamente alla funzione find () di quel modulo. Per inciso, File :: Find menziona che si dovrebbe impostare $ untaint_pattern usando l'operatore qr // . Ad esempio, il valore predefinito è

$untaint_pattern = qr|^([-+@\w./]+)$|

Tuttavia , questo non funziona! In effetti, il problema è un bug noto in File :: Trova :: Regola. (Ad esempio, ecco i CPAN e Debian segnalazioni di bug.) Se desideri un bugfix, allora entrambi quelle segnalazioni di bug hanno delle patch.

Se ti trovi in ??un ambiente limitato, una cosa che puoi fare è essenzialmente implementare tu stesso la patch nel tuo codice. Ad esempio, se si desidera conservare tutto in un unico file, è possibile aggiungere il blocco di codice grande riportato di seguito dopo utilizzare File :: Trova :: Regola . Si noti che questa è una soluzione molto rapida e potrebbe non essere ottimale. Se non funziona per te (ad esempio perché hai spazi nei nomi dei file), modifica il modello qr | ^ ([- + @ \ w ./ lasting+)$ | utilizzato .

Nota infine che se vuoi che la tua organizzazione del codice sia un po 'migliore, potresti voler scaricare questo in un pacchetto separato, forse chiamato MyFileFindRuleFix o qualcosa del genere, che usi sempre dopo File :: Trova :: regola stesso.

<*>\'\n"; my $discarded; return unless ' . $fragment . '; return if $discarded; if ($relative) { push @found, $relpath if $relpath ne ""; } else { push @found, $path; } }'; #use Data::Dumper; #print Dumper \@subs; #warn "Compiled sub: '$code'\n"; my $sub = eval "$code" or die "compile error '$code' $@"; my $cwd = getcwd; # Untaint it if ( $cwd =~ qr|^([-+@\w./]+)$| ) { $cwd = $1; } else { die "Couldn't untaint \$cwd: [$cwd]"; } for my $path (@_) { # $topdir is used for relative and maxdepth $topdir = $path; # slice off the trailing slash if there is one (the # maxdepth/mindepth code is fussy) $topdir =~ s{/?$}{} unless $topdir eq '/'; $self->_call_find( { %{ $self->{extras} }, wanted => $sub }, $path ); } chdir $cwd; return @found; } use warnings; package main;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top