<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://kb.acenet.us/index.php?action=history&amp;feed=atom&amp;title=Httptop.pl</id>
	<title>Httptop.pl - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://kb.acenet.us/index.php?action=history&amp;feed=atom&amp;title=Httptop.pl"/>
	<link rel="alternate" type="text/html" href="https://kb.acenet.us/index.php?title=Httptop.pl&amp;action=history"/>
	<updated>2026-05-14T12:05:43Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://kb.acenet.us/index.php?title=Httptop.pl&amp;diff=1127&amp;oldid=prev</id>
		<title>Docs admin at 14:56, 12 December 2012</title>
		<link rel="alternate" type="text/html" href="https://kb.acenet.us/index.php?title=Httptop.pl&amp;diff=1127&amp;oldid=prev"/>
		<updated>2012-12-12T14:56:50Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:56, 12 December 2012&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Source: http://oreilly.com/pub/h/65&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/perl -w&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/perl -w&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Docs admin</name></author>
	</entry>
	<entry>
		<id>https://kb.acenet.us/index.php?title=Httptop.pl&amp;diff=1126&amp;oldid=prev</id>
		<title>Docs admin: Created page with &quot;&lt;syntaxhighlight lang=&quot;bash&quot;&gt; #!/usr/bin/perl -w #  =head1 NAME   httptop - display top(1)-like per-client HTTP access stats  =head1 SYNOPSIS  httptop [-f &lt;format&gt;] [-r &lt;refre...&quot;</title>
		<link rel="alternate" type="text/html" href="https://kb.acenet.us/index.php?title=Httptop.pl&amp;diff=1126&amp;oldid=prev"/>
		<updated>2012-12-12T14:56:20Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; #!/usr/bin/perl -w #  =head1 NAME   httptop - display top(1)-like per-client HTTP access stats  =head1 SYNOPSIS  httptop [-f &amp;lt;format&amp;gt;] [-r &amp;lt;refre...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl -w&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
=head1 NAME &lt;br /&gt;
&lt;br /&gt;
httptop - display top(1)-like per-client HTTP access stats&lt;br /&gt;
&lt;br /&gt;
=head1 SYNOPSIS&lt;br /&gt;
&lt;br /&gt;
httptop [-f &amp;lt;format&amp;gt;] [-r &amp;lt;refresh_secs&amp;gt;] [-b &amp;lt;backtrack_lines&amp;gt;] &amp;lt;logdir | path_to_log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&lt;br /&gt;
use Time::HiRes qw( time );&lt;br /&gt;
use File::Tail (  );&lt;br /&gt;
use Term::ReadKey;&lt;br /&gt;
use Getopt::Std;&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
&lt;br /&gt;
### Defaults you might be interested in adjusting.&lt;br /&gt;
&lt;br /&gt;
my $Update = 2; # update every n secs&lt;br /&gt;
my $Backtrack = 250; # backtrack n lines on startup&lt;br /&gt;
my @Paths = qw(&lt;br /&gt;
%&lt;br /&gt;
/title/%/logs/access_log &lt;br /&gt;
/var/log/httpd/%/access_log&lt;br /&gt;
/usr/local/apache/logs/%/access_log&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
my $Log_Format = &amp;quot;combined&amp;quot;;&lt;br /&gt;
my %Log_Fields = (&lt;br /&gt;
combined =&amp;gt; [qw/ Host x x Time URI Response x Referer Client /],&lt;br /&gt;
vhost =&amp;gt; [qw/ VHost Host x x Time URI Response x Referer Client /]&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
### Constants &amp;amp; other thingies. Nothing to see here. Move along.&lt;br /&gt;
&lt;br /&gt;
my $Version = &amp;quot;0.4.1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
sub by_hits_per (  ) { $b-&amp;gt;{Rate} &amp;lt;=&amp;gt; $a-&amp;gt;{Rate} }&lt;br /&gt;
sub by_total (  ) { $b-&amp;gt;{Total} &amp;lt;=&amp;gt; $a-&amp;gt;{Total} }&lt;br /&gt;
sub by_age (  ) { $a-&amp;gt;{Last} &amp;lt;=&amp;gt; $b-&amp;gt;{Last} }&lt;br /&gt;
&lt;br /&gt;
my $last_field = &amp;quot;Client&amp;quot;;&lt;br /&gt;
my $index = &amp;quot;Host&amp;quot;;&lt;br /&gt;
my $show_help = 0;&lt;br /&gt;
&lt;br /&gt;
my $order = \&amp;amp;by_hits_per;&lt;br /&gt;
my $Help = &amp;quot;htlwufd?q&amp;quot;;&lt;br /&gt;
my %Keys = (&lt;br /&gt;
h =&amp;gt; [ &amp;quot;Order by hits/second&amp;quot; =&amp;gt; sub { $order = \&amp;amp;by_hits_per } ], &lt;br /&gt;
t =&amp;gt; [ &amp;quot;Order by total recorded hits&amp;quot; =&amp;gt; sub { $order = \&amp;amp;by_total } ],&lt;br /&gt;
l =&amp;gt; [ &amp;quot;Order by most recent hits&amp;quot; =&amp;gt; sub { $order = \&amp;amp;by_age } ],&lt;br /&gt;
w =&amp;gt; [ &amp;quot;Show remote host&amp;quot; =&amp;gt; sub { $index = &amp;quot;Host&amp;quot; } ],&lt;br /&gt;
u =&amp;gt; [ &amp;quot;Show requested URI&amp;quot; =&amp;gt; sub { $index = &amp;quot;URI&amp;quot; } ],&lt;br /&gt;
f =&amp;gt; [ &amp;quot;Show referring URL&amp;quot; =&amp;gt; sub { $index = &amp;quot;Referer&amp;quot; } ],&lt;br /&gt;
d =&amp;gt; [ &amp;quot;Show referring domain&amp;quot; =&amp;gt; sub { $index = &amp;quot;Domain&amp;quot; } ],&lt;br /&gt;
&amp;#039;?&amp;#039; =&amp;gt; [ &amp;quot;Help (this thing here)&amp;quot; =&amp;gt; sub { $show_help++ } ],&lt;br /&gt;
q =&amp;gt; [ &amp;quot;Quit&amp;quot; =&amp;gt; sub { exit } ]&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
my @Display_Fields = qw/ Host Date URI Response Client Referer Domain /;&lt;br /&gt;
my @Record_Fields = qw/ Host URI Referer Domain /;&lt;br /&gt;
my $Max_Index_Width = 50;&lt;br /&gt;
my $Initial_TTL = 50;&lt;br /&gt;
&lt;br /&gt;
my @Months = qw/ Jan Feb Mar Apr May Jun Jul Aug Sep Nov Dec /;&lt;br /&gt;
my %Term = (&lt;br /&gt;
HOME =&amp;gt; &amp;quot;\033[H&amp;quot;,&lt;br /&gt;
CLS =&amp;gt; &amp;quot;\033[2J&amp;quot;,&lt;br /&gt;
START_TITLE =&amp;gt; &amp;quot;\033]0;&amp;quot;, # for xterms etc.&lt;br /&gt;
END_TITLE =&amp;gt; &amp;quot;\007&amp;quot;,&lt;br /&gt;
START_RV =&amp;gt; &amp;quot;\033[7m&amp;quot;,&lt;br /&gt;
END_RV =&amp;gt; &amp;quot;\033[m&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
my ( %hist, %opt, $spec );&lt;br /&gt;
&lt;br /&gt;
$SIG{INT} = sub { exit };&lt;br /&gt;
END { ReadMode 0 };&lt;br /&gt;
&lt;br /&gt;
### Subs.&lt;br /&gt;
&lt;br /&gt;
sub refresh_output &lt;br /&gt;
{&lt;br /&gt;
my ( $cols, $rows ) = GetTerminalSize;&lt;br /&gt;
my $show = $rows - 3; &lt;br /&gt;
my $count = $show;&lt;br /&gt;
my $now = (shift || time);&lt;br /&gt;
&lt;br /&gt;
for my $type ( values %hist ) {&lt;br /&gt;
for my $peer ( values %$type ) {&lt;br /&gt;
# if ( --$peer-&amp;gt;{_Ttl} &amp;gt; 0 ) {&lt;br /&gt;
my $delta = $now - $peer-&amp;gt;{Start};&lt;br /&gt;
if ( $delta &amp;gt;= 1 ) {&lt;br /&gt;
$peer-&amp;gt;{ Rate } = $peer-&amp;gt;{ Total } / $delta;&lt;br /&gt;
} else {&lt;br /&gt;
$peer-&amp;gt;{ Rate } = 0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$peer-&amp;gt;{ Last } = int( $now - $peer-&amp;gt;{ Date } );&lt;br /&gt;
# } else {&lt;br /&gt;
# delete $type-&amp;gt;{$peer}&lt;br /&gt;
# }&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$count = scalar( values %{$hist{$index}} ) - 1 if $show &amp;gt;= scalar values %{$hist{$index}};&lt;br /&gt;
my @list = ( sort $order values %{$hist{$index}} )[ 0 .. $count ];&lt;br /&gt;
&lt;br /&gt;
my $first = 0;&lt;br /&gt;
$first = ( $first &amp;lt;= $_ ? $_ + 1 : $first ) for map { $_ ? length($_-&amp;gt;{$index}) : 0 } @list;&lt;br /&gt;
$first = $Max_Index_Width if $Max_Index_Width &amp;lt; $first;&lt;br /&gt;
&lt;br /&gt;
print $Term{START_TITLE}, &amp;quot;Monitoring $spec at: &amp;quot;, scalar localtime, $Term{END_TITLE} if $ENV{TERM} eq &amp;quot;xterm&amp;quot;; # UGLY!!!&lt;br /&gt;
&lt;br /&gt;
my $help = &amp;quot;Help/?&amp;quot;;&lt;br /&gt;
my $head = sprintf( &amp;quot;%-${first}s %6s %4s %4s %s (%d total)&amp;quot;, &lt;br /&gt;
$index, qw{ Hits/s Tot Last }, $last_field, &lt;br /&gt;
scalar keys %{$hist{$index}}&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Truncate status line if need be&lt;br /&gt;
#&lt;br /&gt;
$head = substr($head, 0, ($cols - length($help)));&lt;br /&gt;
print @Term{&amp;quot;HOME&amp;quot;, &amp;quot;START_RV&amp;quot;}, $head, &amp;quot; &amp;quot; x ($cols - length($head) - length($help)), $help, $Term{END_RV}, &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
for ( @list ) {&lt;br /&gt;
# $_-&amp;gt;{_Ttl}++;&lt;br /&gt;
&lt;br /&gt;
my $line = sprintf( &amp;quot;%-${first}s %6.3f %4d %3d %s&amp;quot;, &lt;br /&gt;
substr( $_-&amp;gt;{$index}, 0, $Max_Index_Width ), @$_{(qw{ Rate Total Last }, $last_field)} );&lt;br /&gt;
if ( length($line) &amp;gt; $cols ) {&lt;br /&gt;
substr( $line, $cols - 1 ) = &amp;quot;&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
$line .= &amp;quot; &amp;quot; x ($cols - length($line));&lt;br /&gt;
}&lt;br /&gt;
print $line, &amp;quot;\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot; &amp;quot; x $cols, &amp;quot;\n&amp;quot; while $count++ &amp;lt; $show;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
sub process_line&lt;br /&gt;
{&lt;br /&gt;
my $line = shift;&lt;br /&gt;
my $now = ( shift || time );&lt;br /&gt;
my %hit;&lt;br /&gt;
&lt;br /&gt;
chomp $line;&lt;br /&gt;
@hit{@{$Log_Fields{$Log_Format}}} = grep( $_, split( /&amp;quot;([^&amp;quot;]+)&amp;quot;|\[([^]]+)\]|\s/o, $line ) );&lt;br /&gt;
&lt;br /&gt;
$hit{ URI } =~ s/HTTP\/1\S+//gos;&lt;br /&gt;
&lt;br /&gt;
$hit{ Referer } = &amp;quot;&amp;lt;unknown&amp;gt;&amp;quot; if not $hit{Referer} or $hit{Referer} eq &amp;quot;-&amp;quot;;&lt;br /&gt;
( $hit{Domain} = $hit{Referer} ) =~ s#^\w+://([^/]+).*$#$1#os;&lt;br /&gt;
&lt;br /&gt;
$hit{ Client } ||= &amp;quot;&amp;lt;none&amp;gt;&amp;quot;;&lt;br /&gt;
$hit{ Client } =~ s/Mozilla\/[\w.]+ \(compatible; /(/gos;&lt;br /&gt;
$hit{ Client } =~ s/[^\x20-\x7f]//gos;&lt;br /&gt;
&lt;br /&gt;
# if $now is negative, try to guess how old the hit is based on the time stamp.&lt;br /&gt;
if ( $now &amp;lt; 0 ) {&lt;br /&gt;
my @hit_t = ( split( m![:/\s]!o, $hit{ Time } ))[ 0 .. 5 ];&lt;br /&gt;
my @now_t = ( localtime )[ 3, 4, 5, 2, 1, 0 ];&lt;br /&gt;
my @mag = ( 3600, 60, 1 );&lt;br /&gt;
&lt;br /&gt;
# If the hit didn&amp;#039;t parse right, or didn&amp;#039;t happen today, the hell with it.&lt;br /&gt;
return unless $hit_t[2] == ( $now_t[2] + 1900 )&lt;br /&gt;
and $hit_t[1] eq $Months[ $now_t[1] ]&lt;br /&gt;
and $hit_t[0] == $now_t[0];&lt;br /&gt;
&lt;br /&gt;
splice( @hit_t, 0, 3 ); &lt;br /&gt;
splice( @now_t, 0, 3 );&lt;br /&gt;
&lt;br /&gt;
# Work backward to the UNIX time of the hit.&lt;br /&gt;
$now = time;&lt;br /&gt;
$now -= (shift( @now_t ) - shift( @hit_t )) * $_ for ( 3600, 60, 1 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$hit{ Date } = $now;&lt;br /&gt;
&lt;br /&gt;
for my $field ( @Record_Fields ) {&lt;br /&gt;
my $peer = ( $hist{$field}{$hit{$field}} ||= { Start =&amp;gt; $now, _Ttl =&amp;gt; $Initial_TTL } );&lt;br /&gt;
@$peer{ @Display_Fields } = @hit{ @Display_Fields };&lt;br /&gt;
$peer-&amp;gt;{ Total }++;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub display_help {&lt;br /&gt;
my $msg = &amp;quot;httptop v.$Version&amp;quot;;&lt;br /&gt;
print @Term{qw/ HOME CLS START_RV /}, $msg, $Term{END_RV}, &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
print &amp;quot; &amp;quot; x 4, $_, &amp;quot; &amp;quot; x 8, $Keys{$_}[0], &amp;quot;\n&amp;quot; for ( split &amp;quot;&amp;quot;, $Help );&lt;br /&gt;
print &amp;quot;\nPress any key to continue.\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Init.&lt;br /&gt;
&lt;br /&gt;
getopt( &amp;#039;frb&amp;#039; =&amp;gt; \%opt );&lt;br /&gt;
&lt;br /&gt;
$Backtrack = $opt{b} if $opt{b};&lt;br /&gt;
$Update = $opt{r} if $opt{r};&lt;br /&gt;
$Log_Format = $opt{f} if $opt{f};&lt;br /&gt;
$spec = $ARGV[0];&lt;br /&gt;
&lt;br /&gt;
die &amp;lt;&amp;lt;End unless $spec and $Log_Fields{$Log_Format};&lt;br /&gt;
Usage: $0 [-f &amp;lt;format&amp;gt;] [-r &amp;lt;refresh_secs&amp;gt;] [-b &amp;lt;backtrack_lines&amp;gt;] &amp;lt;logdir | path_to_log&amp;gt;&lt;br /&gt;
Valid formats are: @{[ join &amp;quot;, &amp;quot;, keys %Log_Fields ]}.&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
for ( @Paths ) {&lt;br /&gt;
last if -r $spec;&lt;br /&gt;
( $spec = $_ ) =~ s/%/$ARGV[0]/gos;&lt;br /&gt;
}&lt;br /&gt;
die &amp;quot;No access_log $ARGV[0] found.\n&amp;quot; unless -r $spec;&lt;br /&gt;
&lt;br /&gt;
my $file = File::Tail-&amp;gt;new( &lt;br /&gt;
name =&amp;gt; $spec, &lt;br /&gt;
interval =&amp;gt; $Update / 2, &lt;br /&gt;
maxinterval =&amp;gt; $Update,&lt;br /&gt;
tail =&amp;gt; $Backtrack,&lt;br /&gt;
nowait =&amp;gt; 1&lt;br /&gt;
) or die &amp;quot;$spec: $!&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
my $last_update = time;&lt;br /&gt;
my ( $line, $now );&lt;br /&gt;
&lt;br /&gt;
# Backtracking.&lt;br /&gt;
while ( $Backtrack-- &amp;gt; 0 ) {&lt;br /&gt;
last unless $line = $file-&amp;gt;read;&lt;br /&gt;
process_line( $line, -1 );&lt;br /&gt;
}&lt;br /&gt;
$file-&amp;gt;nowait( 0 );&lt;br /&gt;
&lt;br /&gt;
ReadMode 4; # Echo off.&lt;br /&gt;
print @Term{&amp;quot;HOME&amp;quot;, &amp;quot;CLS&amp;quot;}; # Home &amp;amp; clear.&lt;br /&gt;
refresh_output;&lt;br /&gt;
&lt;br /&gt;
### Main loop.&lt;br /&gt;
&lt;br /&gt;
while (defined( $line = $file-&amp;gt;read )) {&lt;br /&gt;
$now = time;&lt;br /&gt;
&lt;br /&gt;
process_line( $line, $now );&lt;br /&gt;
&lt;br /&gt;
while ( $line = lc ReadKey(-1) ) {&lt;br /&gt;
$show_help = 0 if $show_help;&lt;br /&gt;
$Keys{$line}[1]-&amp;gt;(  ) if $Keys{$line};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ( $show_help == 1 ) {&lt;br /&gt;
display_help;&lt;br /&gt;
$show_help++; # Don&amp;#039;t display help again.&lt;br /&gt;
} elsif ( $now - $last_update &amp;gt; $Update and not $show_help ) {&lt;br /&gt;
$last_update = $now;&lt;br /&gt;
refresh_output( $now ); &lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
__END_  _&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Docs admin</name></author>
	</entry>
</feed>