2009-05-21 5 views
2

ich dieses Skript in Apache für eine verrohrt Log-Setup bin mit 2:Perl verrohrt nur Log-Skript alle 2 Treffer läuft

#!/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");} 
} 

I in der Richtlinie% f sende es den Dateinamen zu geben. Wie Sie sehen können, überprüft es, ob der angeforderte Dateiname eine Inhaltsdatei ist. Wenn dies der Fall ist, gibt es dem System einen Signalton. Aus irgendeinem Grund piept der Server jedoch nur alle zwei Male, wenn auf eine Inhaltsseite zugegriffen wird. Weiß jemand, warum das passieren könnte?

Ich bin mir ziemlich sicher, dass es mit der Art, wie ich <STDIN> benutze, zu tun hat, weil dies mein erstes Perl-Skript ist.

Antwort

4

Sie lesen die erste Zeile mit der while(), dann lesen Sie eine andere in der if().

Ändern Sie den 'wenn' zu: if ($ _ = ~ ...)

+1

Oder nur, wenn (/(.php|.html|.htm|.dhtml | .cpp | .h | .c | .txt | .pdf | .pl) $ /) perl nimmt an, dass Sie meinen, das Match auf $ _ zu machen, wenn es nicht gegeben ist. – Copas

4

Versuchen:

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

Das sieht viel sauberer aus, aber ich sehe nicht, wie die if-Anweisung einen Vergleich macht. Brauchst du nicht ein ~ = irgendwo? Wie kommt es, dass Sie durch nur <> ersetzen? –

+0

/REGEXP/entspricht $ ~ = ~/REGEXP/standardmäßig. <> bedeutet alle in der Befehlszeile angegebenen Dateien oder , wenn keine Dateien angegeben wurden. – pts

+0

Siehe perldoc perlvar. Suchen Sie nach ARGV. –