2010-08-25 9 views
3

J'ai vu des déclarations perl qui ressemblent à ceci:Que fait cette instruction:();

() unless $some_var; 

Qu'est-ce que vise à atteindre?

+2

S'il vous plaît montrer le script réel contenant cette déclaration. – kennytm

+1

Incluez un peu plus de code de votre script pour le comprendre correctement, dans quel contexte() est utilisé. –

Répondre

0

si exécute l'instruction une fois si et seulement si la condition est vraie. C'est l'inverse, il exécute l'instruction sauf si la condition est vraie (c'est-à-dire si la condition est fausse).

voir pour plus de détails: http://perldoc.perl.org/perlsyn.html

() est simplement la liste vide, de sorte que ce code fournit une valeur par défaut de la liste vide pour les cas où some_var $ est faux (probablement parce que some_var $ est non définie).

+5

Merci, je comprends la partie 'sauf' - mais pourquoi le '()'? Que réalise la liste vide? – Tony

0

Renvoie la liste vide si $ un_var est faux.

Si j'écris @s =() unless $some_var;, je vida @s si $some_var est faux.

C'est la seule façon dont cela peut être utilisé.

+1

Merci - désolé si je n'étais pas clair, mais c'est tout sur une ligne - aucune affectation. – Tony

1

Il est probablement utilisé en retour implicite, si $some_var est évalué à vrai, le retourner, sinon retourner la liste vide.

+0

+1 seulement réponse utile atm –

+0

Merci - je ne sais pas comment cela peut fonctionner, car il se produit au début d'un script, pas dans un sous-programme, et le même script se termine par un exit (0); – Tony

+0

Gardez à l'esprit que lorsqu'un sous-programme se termine, la valeur de retour est la dernière valeur traitée (ou, s'il existe une instruction 'return', quelle que soit l'instruction' return' avec laquelle elle a été appelée). –

1

Sur lui-même, cette expression est un nop. Mais la valeur (liste vide) peut être renvoyée automatiquement à partir d'un sous-programme ou d'un do(), s'il n'y a pas d'instruction return explicite et que cette valeur est la dernière chose du bloc.

+0

Merci, j'aime cette théorie ... mais il est près du sommet de la routine principale, beaucoup de choses se passe après :-( – Tony

9

Il y a un certain nombre de choses qui se passent ici, mais le plus important est le fait que ce type de ligne apparaît généralement comme la dernière ligne d'un bloc exécuté [1]. Dans ce contexte, la valeur du bloc est la valeur de la dernière instruction exécutée [2]. Maintenant une déclaration contenant unless a la valeur du côté gauche si le côté droit est vrai et la valeur du côté droit sinon, donc c'est une façon de dire "la valeur du bloc est $some_var si $some_var arrive à être vrai, () sinon ".

() est simplement la liste vide, de sorte que ce code fournit une valeur par défaut de la liste vide pour les cas où $some_var est faux (probablement parce que $some_var est non défini.)

Il est plus courant pour obtenir le même effet avec or, comme dans l'équivalent

$some_var or(); 

Mettez ensemble, nous pouvons voir ces cas:

use strict; 
use warnings; 

my @x = do {() unless 0 }; 
my @y = do {() unless 5 }; 

print "\@x: <@x>\n\@y: <@y>\n"; 

@x est le tableau vide car 0 est faux, tandis que @y est un tableau contenant 5 car 5 est true.

N'importe où autre que la dernière instruction d'un bloc, () unless $some_var; est un no-op. Il supprime l'avertissement once si $some_var n'est pas mentionné autrement, cependant.

[1]: C'est un bloc évalué par eval ou do ou fournie à (par exemple) map ou grep, ou un bloc appelé en tant que sous-programme.

[2]: "La valeur de la dernière instruction exécutée" est une expression étrange; la plupart du temps, seules les expressions ont des valeurs. Mais parce que Perl inclut le concept qu'en l'absence d'un retour explicite, la valeur d'un bloc est la valeur de la dernière instruction, Perl a besoin de cette phrase bizarre.

+0

Merci pour l'analyse détaillée, ne semble pas être ce qui se passe ici (si quoi que ce soit). Voici un peu plus d'un script, beaucoup de code suivant omis, et il se termine finalement par un 'exit (0);': # - MAIN -------------- -------------------------------------------------- ------- getOptions ("-interactive", "-request_file = s",) ou d'utilisation(); utilisation à moins que (opt_request_file $); () à moins que (opt_interactive $); $ today = strftime ".% Y-% m-% d", heure locale; $ dte = strftime "% Y-% m-% d", heure locale; @col = ("M", "N", "O", "P", "Q", "R", "S"); . . . – Tony

+0

Désolé si j'ai mal formaté, il suffit de couper et coller à partir de putty, regardé ok dans cette zone de texte :-( – Tony

+4

Dans ce contexte, il me semble être un non-op.Au stade, l'option interactive est en réalité non implémentée – darch

3

Mystère résolu:

GetOptions(
    "-interactive", 
    "-request_file=s", 
) or usage(); 

usage unless ($opt_request_file); 
() unless ($opt_interactive); 

Il semble que le '();' est trompeur - il ne fait rien, et le but est juste de mentionner la variable $ opt_interactive une fois ... comme un moyen de supprimer l'avertissement perl 'Name' $ var "utilisé une seule fois '.

Merci à tous ceux qui ont essayé de faire la lumière!