Il n'y a pas de différence entre l'utilisation d'un opérateur de test de fichiers en temps-réel (while
) vs un tout-fausse boucle (until
), ou en séparant le test avec un if
/unless
, ni est là une différence avec rien d'autre en Perl.
Le seul cas magique avec la boucle while est ... while <$handle>;
ou while (<$handle>) {...}
qui définit $_
à la ligne suivante tant qu'il est défini. Et cela n'a pas vraiment de sens d'utiliser la boucle while-false (until
) avec des poignées nues.
La construction a until b
est simplement a while not b
.
Pour convertir sleep 1 until -e $file;
en boucle while
, utilisez les éléments suivants:
sleep 1 while not -e $file;
Cela peut ensuite être étendue à la forme de bloc:
while (not -e $file) {sleep 1}
Ou comme un while
infini avec fuite interne :
while (1) {
last if -e $file;
sleep 1;
}
Et toutes ces formes sont équivalentes. En réponse au reste de votre question, la plupart des systèmes de fichiers devraient être bien avec 1 seconde dort entre les vérifications, mais vous pouvez choisir un nombre plus grand si le processus n'attend pas d'urgence sur le fichier. De même, si vous utilisez un périphérique avec un système de fichiers lent (stocké dans la mémoire flash ou via un réseau lent), vous pouvez également essayer des valeurs plus grandes.
Et comme ysth
nitpicks ci-dessous, en général, les formulaires de déclaration de retour différemment que les formes de bloc quand ils sont le dernier élément d'une construction qui retourne: do {...}
, sub {...}
, do FILE
, eval ...
Performance ??? La seule pénalité ici est le ping du système de fichiers, qui est par pénalité plus grande que n'importe quelle boucle ... – Drakosha
@Drakosha: Combien de temps vous attendez-vous d'un fichier ping typique à prendre? Un sommeil d'une seconde n'est-il pas suffisant pour combattre le décalage? – Zaid
oui, semble assez de temps sur tout système de fichiers/stockage normal. Je n'ai tout simplement pas compris pourquoi vous vérifiez les performances de la boucle, ce qui est négligeable ici. – Drakosha