2010-06-25 6 views
2
  1. En script shell Unix, nous vérifier l'état de sortie de la commande précédente en utilisant la valeur de $? où zéro est gage de succès. Comment puis-je le faire en Perl?questions de base Perl

  2. Lorsque je cours perl -V je vois certains chemins répertoriés dans @INC. Comment ajouter de nouveaux chemins à @INC? Comment puis-je définir l'ordre des arguments dans la fonction GetOptions?Je veux -email être le premier argument et s'il est donné comme deuxième argument, il devrait échouer.

    GetOptions(
        'nemail' => sub {$ENV{EMAIL} = "Y"}, 
        'arg' => \$help 
    ); 
    
  3. Quelle est la différence entre les extensions .pl et .pm? Quand dois-je utiliser l'extension .pm?

  4. Lorsque j'écris use File::Copy, où se trouve le code? Quelles sont les variables d'environnement auxquelles accède use?

+3

Arav, la quasi-totalité de ces cinq questions ne sont pas liées entre elles. À l'avenir, il serait préférable de [poser une question séparée] (http://stackoverflow.com/questions/ask) pour chaque sujet. – daxim

Répondre

8
  1. Les commandes externes sont lancées avec le system function, elle fixe également le child error variable $?/$CHILD_ERROR. Au lieu de faire ces contrôles vous, utilisez autodie:

    require IPC::System::Simple; 
    use autodie qw(:all); 
    system([0], 'foobar-command', '--option', '--yet-another-option'); 
    # 0 is allowed as an exit status, others will throw an exception 
    

    constructions de programmation interne, par exemple sous-programmes des modules, utilisez la vérification des erreurs qui va au-delà de ce que vous savez de la programmation du shell. Il y a plus d'une façon de le faire. La plupart du type, le succès et l'échec est signalé par la valeur de retour d'une fonction, souvent undef signifie une défaillance, par ex. en lisant le documentation for File::Copy, nous apprenons que la valeur de retour est 0 pour l'échec et que l'autre variable d'erreur habituelle est définie.

    use English qw($OS_ERROR) 
    use File::Copy qw(mv); 
    my $source = '/does_not_exist'; 
    my $destination = '/tmp'; 
    unless (mv($source, $destination)) { 
        warn "Move from $source to $destination failed: $OS_ERROR"; 
    } 
    

    Une autre possibilité est des exceptions. Vous devez apprendre cela en détail: chapitre 13 de PBP et le chapitre 11 de EPP.

    use Try::Tiny; 
    my $string; 
    try { 
        $string = Encode::decode('UTF-8', $octets_buffer, Encode::FB_CROAK) 
    } catch { 
        warn "Decoding failed: $_"; 
    } 
    
  2. Il est conçu de telle sorte que les arguments peuvent être dans un ordre aléatoire. Pourquoi le veux-tu comme ça? Il existe un paramètre de configuration appelé require_order, mais ce n'est pas exactement ce que vous voulez.

  3. .pl indique une bibliothèque Perl, tout comme une collection de sous-programmes, prête à être incluse via require. Cela vient de plus de 10 ans. Les gens sur Windows aiment aussi donner cette extension aux programmes Perl, car le système d'exploitation est tellement centré sur l'extension et ne fonctionne pas confortablement avec les fichiers sans extension.

    .pm indique Perl module. Un module est juste une bibliothèque qui suit quelques conventions supplémentaires. C'est de l'ère Perl 5.

  4. File::Copy se traduit au nom de fichier File/Copy.pm qui est dans l'un des chemins dans votre @INC, pour plus de détails voir à nouveau require. Sur mon système, ce serait dans /usr/lib/perl5, par ex. /usr/lib/perl5/5.10.0/File/Copy.pm.

+0

Merci beaucoup. Nan. Je demande à propos de la vérification de la valeur de retour de toute commande en Perl. si je fais une commande FILE: MOVE ou toute autre commande, comment puis-je vérifier l'état de la sortie si elle a réussi? Dans le script shell UNIX, nous pouvons vérifier $ ?. En Perl est le statut de sortie 0 dénote le succès comme dans le script shell. J'ai vu le site wikipedia. utilisez Hello :: World; Est-ce que le mot mondial est nécessaire ici. Le mot "Hello" devrait aussi avoir le même nom que le nom du fichier. Normalement, dans le paquet java, nous avons le nom du répertoire dans le nom du paquet. require_order doit être défini dans GET_OPTIONS COMMAND? – Arav