2009-05-21 4 views
2

J'utilise ce script pour une configuration de journal dans Apache 2 canalisé:Perl canalisé script journal ne fonctionne que tous les 2 coups

#!/usr/local/bin/perl 

$|=1; # Use unbuffered output 
while (<STDIN>) 
{ 
    if (<STDIN> =~ m/(.php|.html|.htm|.dhtml|.cpp|.h|.c|.txt|.pdf|.pl)$/) 
     {system("beep");} 
} 

J'envoie dans la directive% f pour lui donner le nom de fichier. Comme vous pouvez le constater, il vérifie si le nom de fichier demandé est un fichier de contenu. Si c'est le cas, le système émet un bip. Cependant, pour quelque raison que ce soit, le serveur émet uniquement un bip toutes les deux fois que vous accédez à une page de contenu. Est-ce que quelqu'un sait pourquoi cela pourrait arriver? Je suis assez sûr que cela a à voir avec la façon dont j'utilise <STDIN>, parce que c'est mon premier script Perl.

Répondre

4

Vous avez lu la première ligne avec while(), puis vous en avez lu une autre dans if().

Changez le 'si' à: if ($ _ = ~ ...)

+1

Ou si (/(.php|.html|.htm|.dhtml | .cpp | .h | .c | .txt | .pdf | .pl) $ /) perl suppose que vous voulez faire la correspondance sur $ _ si elle n'est pas donnée. – Copas

4

Essayez:

while (<>) { 
    system("beep") if /php|pl.../; 
} 
+0

Cela semble beaucoup plus propre, mais je ne vois pas comment l'instruction if fait une comparaison. N'auriez-vous pas besoin d'un ~ = quelque part? Aussi, comment se fait-il que vous ayez remplacé avec juste <>? –

+0

/REGEXP/est équivalent à $ ~ = ~/REGEXP/par défaut. <> signifie tous les fichiers spécifiés dans la ligne de commande, ou si aucun fichier n'a été spécifié. – pts

+0

Voir perloc perlvar. Recherchez ARGV. –

Questions connexes