perl:index
This is an old revision of the document!
links
blobs of code
sub max { my $r=$_[0]; for (@_) { if ($_>$r) { $r=$_ } }; return $r; } sub min { my $r=$_[0]; for (@_) { if ($_<$r) { $r=$_ } }; return $r; } sub sum { my $r=0; for (@_) { $r += $_ }; return $r; } sub avg { return sum(@_)/@_; } sub limits { my $lo = my $hi = $_[0]; for (@_) { if ($_<$lo) { $lo=$_ } if ($_>$hi) { $hi=$_ } } return ($lo,$hi); } # returns maximum in scalar context; returns (maximum,max_index) in list context. sub max { my $I=0; my $r=$_[0]; for (my $i=1; $i<@_; $i++) { if ($_[$i] > $r) { $r=$_[$i]; $I=$i } } return wantarray ? ($r,$I) : $r; } # returns minimum in scalar context; returns (minimum,min_index) in list context. sub min { my $I=0; my $r=$_[0]; for (my $i=1; $i<@_; $i++) { if ($_[$i] < $r) { $r=$_[$i]; $I=$i } } return wantarray ? ($r,$I) : $r; } sub timestamp { my ($fmt,$time) = @_; $fmt ||= 'SHORT'; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = defined($time) ? localtime($time) : localtime(); $mon++; $year += 1900; return ($fmt eq 'SHORTEST') ? sprintf("%04d%02d%02d-%02d%02d%02d",$year,$mon,$mday,$hour,$min,$sec) : ($fmt eq 'SHORT') ? sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec) : '<undefined timestamp format>'; } use Getopt::Std; my %opt; getopts( 'o:vh', \%opt ) or usage(); usage() if ($opt{h} or !@ARGV); sub file_put_contents { my ($file) = @_; open my $fp, "> $file" or die "$file: $!\n"; print $fp $_ for (@_); close $fp; } sub file_get_contents { my ($file) = @_; local $/ = undef; open my $fp, "< $file" or die "$file: $!\n"; my $r = <$fp>; close $fp; return $r; } # this forces a full stack trace on every exception use Carp qw( confess ); $SIG{__DIE__} = \&confess; $SIG{__WARN__} = \&confess; sub commify { # commify a number. Perl Cookbook, 2.17, p. 64 my $text = reverse $_[0]; $text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g; return scalar reverse $text; } ## # copy data from source to destination until EOF. Either argument can be # a file handle or a file name. If the latter, the file will be opened for # the appropriate mode, and closed when done. # # Params: # $src - Source file name or handle # $dest - Destination file name or handle # sub copy { my ($src,$dest) = @_; my ($fpSrc,$fpDest); # if the src is a glob (aka file handle), use it, else open it if (ref($src) eq 'GLOB') { $fpSrc = $src; } elsif (ref($src) eq '') { open $fpSrc,$src or die "$src: $!\n"; } else { die "Invalid src type: $src\n"; } # ditto for dest if (ref($dest) eq 'GLOB') { $fpDest = $dest; } elsif (ref($dest) eq '') { open $fpDest,$dest or die "$dest: $!\n"; } else { die "Invalid dest type: $dest\n"; } # do copy my $buf; while (read($fpSrc,$buf,1024)) { print $fpDest $buf; } # if we opened the file, we close it if (ref($src) eq '') { close $fpSrc; } if (ref($dest) eq '') { close $fpDest; } } #stupid slow timeout sub ip2host { my $name = gethostbyaddr(inet_aton($_[0]), AF_INET); return $name; } # faster, needs nslookup installed sub ip2host { my ($ip) = @_; open PIPE,"nslookup $ip |" or die "pipe: $!\n"; while (<PIPE>) { if (/name = (.*)\./) { # if this line contains the name... return $1; } } return; } sub round_to_nearest_multiple { my ($n,$m) = @_; my $r = $n % $m; return $r ? $n+$m-$r : $n; }
perl/index.1250182622.txt.gz · Last modified: 2009/08/13 09:57 (external edit)