Juni 2009 Archive

Ein wesentlicher Teil der Arbeit eines Systemadministrators ist die Analyse von Log-Dateien. Diese wichtige, aber auch oft langweilige und daher auch gern unterlassene Tätigkeit lässt sich mit File::Tail von Matija Grabnar automatisieren.

File::Tail funktioniert so ähnlich wie das UNIX/Linux Tool tail -f, daher auch der Name des Moduls.

Beispiel:

#!/usr/bin/perl
use strict;
use warnings;

use File::Tail;

my $logfile = '/var/log/messages';

### Defaults:
### maxinterval = 60 Sekunden
### interval = 10 Sekunden
### adjustafter = 10 Sekunden
### resetafter = adjustafter * maxinterval
### tail = 0 Nach der letzten Zeile starten
my $tail = File::Tail->new( $logfile ) or die $!;

my $line;
while ( defined( $line = $tail->read) ) {
	process_line( $line );
}

sub process_line {
	my ($line) = shift @_;
		# Machwas mit der Zeile
      	print "$line";
}

Das Programm starten und anschließend ein

$ logger  -i  'Hallo Welt'

in einem zweiten Terminal eingeben. Nach ca. 70 Sekunden (interval + maxinterval) sollte der neue Eintrag von File::Tail angezeigt werden.

Logrotate und File::Tail

File::Tail kann eigentlich gut damit umgehen, das die beobachtete Datei durch andere Programme, wie z.B. logrotate, verschoben und neu erstellt wird. Manchmal müssen dazu allerdings die Parameter maxintervall und adjustafter eingestellt werden. Optimale Werte erhält man nur durch Ausprobieren.

#!/usr/bin/perl
use strict;
use warnings;

use File::Tail;

my $logfile = '/var/log/messages';

### Defaults:
### maxinterval = 60 Sekunden
### interval = 10 Sekunden
### adjustafter = 10 Sekunden
### resetafter = adjustafter * maxinterval
### tail = 0 Nach der letzten Zeile starten
my $tail = File::Tail->new( name =>  $logfile,
                                # Die letzten 5 Zeilen beim Start ausgeben
                            tail => 5, 
                                # Datei alle 30 Sekunden pruefen 
                            maxinterval => 30,
 ) or die $!;

my $line;
while ( defined( $line = $tail->read) ) {
	process_line( $line );
}

sub process_line {
	my ($line) = shift @_;
		# Machwas mit der Zeile
      	print "$line";
}

Siehe auch:

Mit Finance::QuoteHist von Matt Sisk lassen sich historische Börsenkursdaten (Stock Quotes) einfach über das Web abrufen.

Beispiel: Historische Dax-Kurse von Yahoo! Finance

#!/usr/bin/perl 
use strict;
use warnings;
use Finance::QuoteHist::Yahoo;

my $q = Finance::QuoteHist::Yahoo->new
     (
      			#symbols    => [qw(IBM UPS AMZN)],
      			#Adidas
      			#symbols    => [qw(ADS.DE)],
      symbols    => [qw(^GDAXI)],
      start_date => '01/01/1999',
      end_date   => 'today',
     );

  # Einfache Ausgabe der Ergebnisse 
foreach my $quote ( $q->quotes() ) {
	my ($symbol, $date, $open, $high, $low, $close, $volume, $adjusted) = @$quote;
	print "$symbol startete am $date mit $open und schloss zu $close ($adjusted).\n";
}

Das Programm erzeugt folgende Ausgabe:

^GDAXI startete am 1999/01/04 mit 4991.9500 und schloss zu 5252.3600 (5252.3600).
^GDAXI startete am 1999/01/05 mit 5221.4300 und schloss zu 5253.9100 (5253.9100).
^GDAXI startete am 1999/01/06 mit 5328.0200 und schloss zu 5443.6200 (5443.6200).
^GDAXI startete am 1999/01/07 mit 5485.6100 und schloss zu 5323.2100 (5323.2100).
......
^GDAXI startete am 2009/06/11 mit 5039.9700 und schloss zu 5107.2600 (5107.2600).
^GDAXI startete am 2009/06/12 mit 5098.0100 und schloss zu 5069.2400 (5069.2400).
^GDAXI startete am 2009/06/15 mit 5051.3500 und schloss zu 4889.9400 (4889.9400).
^GDAXI startete am 2009/06/16 mit 4899.8100 und schloss zu 4890.7200 (4890.7200).

 

Siehe auch

Finance::YahooQuote von Dirk Eddelbuettel vereinfacht die Ermittlung der Börsenkurse von Yahoo! Finance und dient als Grundlage für den graphischen Stockticker SMTM.

/2009/06/DAX.png

Beispiel: Aktueller Stand des DAX

#!/usr/bin/perl 
use strict;
use warnings;

use Finance::YahooQuote;

my $symbol = '^GDAXI';

my @quote = getonequote $symbol; # Get a quote for a single symbol

if (scalar @quote) {
	print " 0 Symbol: $quote[0]\n";
	print " 1 Company Name: $quote[1]\n";
	print " 2 Last Price: $quote[2]\n";
	print " 3 Last Trade Date: $quote[3]\n";
	print " 4 Last Trade Time: $quote[4]\n";
	print " 5 Change: $quote[5]\n";
	print " 6 Percent Change: $quote[6]\n";
	print " 7 Volume: $quote[7]\n";
	print " 8 Average Daily Vol: $quote[8]\n";
	print " 9 Bid: $quote[9]\n";
	print "10 Ask: $quote[10]\n";
	print "11 Previous Close: $quote[11]\n";
	print "12 Today's Open: $quote[12]\n";
	print "13 Day's Range: $quote[13]\n";
	print "14 52-Week Range: $quote[14]\n";
	print "15 Earnings per Share: $quote[15]\n";
	print "16 P/E Ratio: $quote[16]\n";
	print "17 Dividend Pay Date: $quote[17]\n";
	print "18 Dividend per Share: $quote[18]\n";
	print "19 Dividend Yield: $quote[19]\n";
	print "20 Market Capitalization: $quote[20]\n";
	print "21 Stock Exchange: $quote[21]\n";
} 
else {
	print "Ooops\n";
}

Das Programm erzeugt folgende Ausgabe:

 0 Symbol: ^GDAXI
 1 Company Name: DAX
 2 Last Price: 5107.26
 3 Last Trade Date: 6/11/2009
 4 Last Trade Time: 11:45am
 5 Change: +56.08
 6 Percent Change: +1.11%
 7 Volume: 0
 8 Average Daily Vol: 0
 9 Bid: N/A
10 Ask: N/A
11 Previous Close: 5051.18
12 Today's Open: 5039.97
13 Day's Range: 5038.03 - 5120.87
14 52-Week Range: 3588.89 - 6855.84
15 Earnings per Share: N/A
16 P/E Ratio: N/A
17 Dividend Pay Date: N/A
18 Dividend per Share: N/A
19 Dividend Yield: N/A
20 Market Capitalization: N/A
21 Stock Exchange: XETRA

Beispiel: Aktueller Kurs der adidas Aktie

Durch useExtendedQueryFormat können weitere Felder, wie Earnings per Share, ermittelt werden:

#!/usr/bin/perl 
use strict;
use warnings;

use Finance::YahooQuote;

my $symbol = 'ADS.DE';

useExtendedQueryFormat(); 

my @quote = getonequote $symbol; # Get a quote for a single symbol

if (scalar @quote) {
	print " 0 Symbol: $quote[0]\n";
	print " 1 Company Name: $quote[1]\n";
	print " 2 Last Price: $quote[2]\n";
	print " 3 Last Trade Date: $quote[3]\n";
	print " 4 Last Trade Time: $quote[4]\n";
	print " 5 Change: $quote[5]\n";
	print " 6 Percent Change: $quote[6]\n";
	print " 7 Volume: $quote[7]\n";
	print " 8 Average Daily Vol: $quote[8]\n";
	print " 9 Bid: $quote[9]\n";
	print "10 Ask: $quote[10]\n";
	print "11 Previous Close: $quote[11]\n";
	print "12 Today's Open: $quote[12]\n";
	print "13 Day's Range: $quote[13]\n";
	print "14 52-Week Range: $quote[14]\n";
	print "15 Earnings per Share: $quote[15]\n";
	print "16 P/E Ratio: $quote[16]\n";
	print "17 Dividend Pay Date: $quote[17]\n";
	print "18 Dividend per Share: $quote[18]\n";
	print "19 Dividend Yield: $quote[19]\n";
	print "20 Market Capitalization: $quote[20]\n";
	print "21 Stock Exchange: $quote[21]\n";
	print "22 Short ratio: $quote[22]\n";
	print "23 1yr Target Price: $quote[23]\n";
	print "24 EPS Est. Current Yr: $quote[24]\n";
	print "25 EPS Est. Next Year: $quote[25]\n" ;
	print "26 EPS Est. Next Quarter: $quote[26]\n";
	print "27 Price/EPS Est. Current Yr: $quote[27]\n";
	print "28 Price/EPS Est. Next Yr: $quote[28]\n";
	print "29 PEG Ratio: $quote[29]\n";
	print "30 Book Value: $quote[30]\n";
	print "31 Price/Book: $quote[31]\n";
	print "32 Price/Sales: $quote[32]\n";
	print "33 EBITDA: $quote[33]\n";
	print "34 50-day Moving Avg: $quote[34]\n";
	print "35 200-day Moving Avg: $quote[35]\n";
} 
else {
	print "Ooops\n";
}

Das Programm erzeugt folgende Ausgabe:

 0 Symbol: ADS.DE
 1 Company Name: ADIDAS
 2 Last Price: 27.88
 3 Last Trade Date: 6/11/2009
 4 Last Trade Time: 11:35am
 5 Change: +0.17
 6 Percent Change: +0.61%
 7 Volume: 1324113
 8 Average Daily Vol: 1747360
 9 Bid: 27.80
10 Ask: 27.84
11 Previous Close: 27.71
12 Today's Open: 27.59
13 Day's Range: 27.48 - 28.30
14 52-Week Range: 21.22 - 45.12
15 Earnings per Share: 0.00
16 P/E Ratio: N/A
17 Dividend Pay Date: N/A
18 Dividend per Share: 0.50
19 Dividend Yield: 1.80
20 Market Capitalization: N/A
21 Stock Exchange: XETRA
22 Short ratio: N/A
23 1yr Target Price: N/A
24 EPS Est. Current Yr: 0.00
25 EPS Est. Next Year: 0.00
26 EPS Est. Next Quarter: 0.00
27 Price/EPS Est. Current Yr: N/A
28 Price/EPS Est. Next Yr: N/A
29 PEG Ratio: N/A
30 Book Value: 0.00
31 Price/Book: N/A
32 Price/Sales: N/A
33 EBITDA: 0
34 50-day Moving Avg: 26.7369
35 200-day Moving Avg: 26.1586

Siehe auch

O'Reilly hat im oreillyblog eine Artikelreihe über Perl gestartet. Als Autor konnte Renée Bäcker, Perlprogrammierer, Herausgeber des Perl-Magazins $Foo und Betreiber von Perl News gewonnen werden.

Der erste Beitrag, Perl Who-is-Who, stellt sehr übersichtlich wichtige Personen und Gruppierungen des Perl-Universums vor.

Der zweite Beitrag, Modern Perl, erläutert die wichtigsten Entwicklungen der letzten Jahre, wie Moose, DBIx::Class, Catalyst und Perl::Critic.

 

Siehe dazu auch:

Business::Tax::VAT::Validation von Bernard Nauwelaerts ermöglicht die Überprüfung einer europäischen Umsatzsteuer-Identifikationsnummer durch eine Online-Abfrage der VIES VAT number validation-Datenbank der European Commission. (Eine einfache Prüfung durch reguläre Ausdrücke kann ebenfalls durchgeführt werden.)

Beispiel

#!/usr/bin/perl
use strict;
use warnings;

use Business::Tax::VAT::Validation;

my @UstIdNr = qw/ DE17590386 DE175903868 /;

my $btvv = Business::Tax::VAT::Validation->new();

foreach my $UStIdNr ( @UstIdNr ) { 
  # Check number
  if ($btvv->check($UStIdNr )){
        print "OK: $UStIdNr.\n";
  }
  else {
        print "Error: $UStIdNr. ",  $btvv->get_last_error ,"\n";
  } 
}

Das Programm erzeugt folgende Ausgabe:

Error: DE17590386. Invalid VAT number format
OK: DE175903868.

Siehe auch

Über dieses Archiv

Diese Seite enthält alle Einträge von Perl HowTo von neu nach alt.

Mai 2009 ist das vorherige Archiv.

Juli 2009 ist das nächste Archiv.

Aktuelle Einträge finden Sie auf der Startseite, alle Einträge in den Archiven.

Blog Roll

Powered by

Powered by Movable Type 5.2.10

Creative Commons-Lizenz

Creative Commons License
Dieses Weblog steht unter einer Creative Commons-Lizenz.