September 2010 Archive

Devel::TraceUse von Philippe Bruhat (BooK) zeigt die Module, die von einem Perl-Programm genutzt werden, übersichtlich an.

Verwendete Module auflisten

Devel::TraceUse wird auf der Kommandozeile aufgerufen

$ perl -d:TraceUse your_program.pl

Devel::TraceUse erzeugt aus dem folgenden Beispielprogramm:

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

use DBI;

folgende Ausgabe:

Modules used from hierachy.pl:
   1.  strict 1.04, hierachy.pl line 2 [main]
   2.  warnings 1.09, hierachy.pl line 3 [main]
   3.  DBI 1.615, hierachy.pl line 5 [main]
   4.    Carp 1.17, DBI.pm line 159
   5.      Exporter 5.64_01, Carp.pm line 11
  11.        Exporter::Heavy 5.64_01, Exporter.pm line 16
   6.    DynaLoader 1.10, DBI.pm line 160
   7.      Config, DynaLoader.pm line 25
   9.        Config_heavy.pl, Config.pm line 70
  10.          Config_git.pl, Config_heavy.pl line 1224 [Config]
   8.      AutoLoader 5.70, DynaLoader.pm line 22
  12.    Scalar::Util 1.23, DBI.pm line 290
  13.      vars 1.01, Scalar/Util.pm line 10
  14.        warnings::register 1.01, vars.pm line 7
  15.      List::Util 1.23, Scalar/Util.pm line 12
  16.        XSLoader 0.10, List/Util.pm line 26

Die Ausgabe der Core-Module lässt sich über den Schalter =hidecore unterdrücken.

$ perl -d:TraceUse=hidcore your_program.pl

und erzeugt dann für o.g. Beispiel folgende Ausgabe:

Modules used from hierachy.pl:
   3.  DBI 1.615, hierachy.pl line 5 [main]
   9.    Config_heavy.pl, Config.pm line 70
  10.      Config_git.pl, Config_heavy.pl line 1224 [Config]

 

Visualisierung der verwendeten Module

Die Ausgabe von Devel::TraceUse lässt sich mittels eines einfachen Hacks mit GraphViz visualisieren.

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

use GraphViz;

###########################################################
# Works for me Software(TM)
###########################################################
# Usage:
# Step 1:
# perl -d:TraceUse your-programm.pl 2> TraceUse.out.txt
# or
# perl -d:TraceUse=hidecore your-programm.pl 2> TraceUse.out.txt
# Step2:
# perl $0  TraceUse.out.txt 
###########################################################
# Based on http://use.perl.org/~BooK/journal/34717
###########################################################

#my $png = shift || 'use.png';
my $png =  'trace-use.png';

my $g = GraphViz->new( rankdir => 1 );

my @stack;

while (<>) {

    # Do not graph standard pragmas
    next if m/warnings\s+\d+/;
    next if m/strict\s+\d+/;

    # Remove leading line numbers
    s/^\s+\d+\.//;
	
    # first node
    /^Modules used from (.*):/ && do {
        $g->add_node($1);
        @stack = ($1);
    };

    # all other nodes
    /^((?:  )+)(\S+).*,/ && do {
        my $idx = length($1) / 2;
        $stack[$idx] = $2;
        $g->add_node($2);
        $g->add_edge( $stack[ $idx - 1 ] => $2 );
    };

    # ignore all other lines
}

$g->as_png($png);

Das Programm erzeugt mit o.g. Beispiel folgende Graphik:

/2010/09/trace-use-small.png

 

Siehe auch

URI::Find von Michael G Schwern vereinfacht das Extrahieren von URIs aus beliebigen Texten.

 

Beispiel URI Extraktion

Das Beispielprogramm holt eine Webseite und gibt den HTML-Quelltext an die Methode find. Die Methode find ruft bei jedem gefundenem URI die callback-Funktion callback mit zwei Parametern auf: Einem Objekt der Klasse URI::URL und dem gefundenem URI. Der Rückgabewert der callback-Funktion wird genutzt, um die gefundene URI im Text (hier in $html) zu ersetzen.

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

use URI::Find;
use LWP::Simple;

my $url = 'http://perl-howto.de';

my $html = get $url;

# Container fuer URIs
my %uris = ();

my $finder = URI::Find->new( \&callback );

my $found = $finder->find( \$html );

# URIs absteigend sortiert ausgeben
my @uris = reverse sort keys %uris;

foreach my $uri (@uris) {
    print "$uri\n";
}
exit();

sub callback {
    my ( $uri_url, $uri ) = @_;

    # $uri_url ist ein Objekt der Klasse URI::URL

    # Doppelte URIs entfernen
    $uris{$uri}++;

    # Der Ruckgabewert ersetzt die URI in \$html
    return "--- Ersetzt durch XXXXX ---";
}

Das Programm erzeugt folgende Ausgabe:

https://www.socialtext.net/perl5/index.cgi?events_2010_froscon
http://www.zeit.de/digital/datenschutz/2010-09/twitter-oauthcalypse-authentification
http://www.yahoo.de
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
http://www.w3.org/1999/xhtml
http://www.thomas-fahle.de/perl-training/index.html
http://www.thomas-fahle.de/perl-programmierung/index.html
http://www.thomas-fahle.de/2010/08/kurzbericht-perlfroscon-2010-st-augustin-21-und-22-august-2010.html
http://www.thomas-fahle.de
http://www.slideshare.net/thomasfahle/dancer-5032076
http://www.slideshare.net/reneebperl/fr-os-con2010develnytprof
http://www.slideshare.net/reneebperl/fr-os-con2010bmatrainer
......

URI::Find nimmt es bei Erkennung der URI mit dem Schema sehr genau - eine etwas laxere Erkennung bietet URI::Find::Schemeless.

 

Kommandozeile: urifind

URI::Find bietet auch ein Kommandozeilen Tool, urifind, welches Dateien nach URIs durchsucht.

 $ urifind file

In bester *NIX-Manier lässt sich urifind auch als Filter verwenden:

$ wget http://perl-howto.de -O - | urifind -u -s -r
erzeugt die selbe Ausgabe wie das oben gezeigte Beispiel.

Weitere Optionen liefert urifind -h.

 

Siehe auch

Twitter zwingt Drittanbieter seit ein paar Tagen ein neues Authentifizierungsverfahren, OAuth, zu verwenden. Dieses Verfahren soll den Diebstahl von Passwörtern unterbinden.

 

Registrierung

Drittanbieter müssen Ihre Applikation zunächst unter http://twitter.com/apps registrieren.

 

Autorisierung

Im nächsten Schritt muss der Anwender der Applikation den Zugriff erlauben.

Das folgende Beispiel-Skript führt die Autorisierung durch und speichert alle erforderlichen Daten in eine Konfigurationsdatei.

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

use Config::Simple;
use Net::Twitter;

my $config_file = 'twitter.access.ini';
my $cfg = new Config::Simple( syntax => 'ini' ) or die $!;

# You can replace the consumer tokens with your own;
# these tokens are for the Net::Twitter example app.
#my %consumer_tokens = (
#    consumer_key    => 'v8t3JILkStylbgnxGLOQ',
#    consumer_secret => '5r31rSMc0NPtBpHcK8MvnCLg2oAyFLx5eGOMkXM',
#);
my %consumer_tokens = (
    consumer_key    => 'Get_Your_Consumer_Key_From_TwitterDotComSlashApps',
    consumer_secret => 'Get_Your_Consumer_Secret_From_TwitterDotComSlashApps',
);

my $nt = Net::Twitter->new( traits => [qw/API::REST OAuth/], %consumer_tokens );

# Autorisierung
my $auth_url = $nt->get_authorization_url;
print "Diese Applikation muss autorisiert werden.\n";
print "Bitte $auth_url \n";
print "in einem Browser oeffnen und den Zugang erlauben.\n";
print "Bitte Twitter-PIN eingeben: ";
my $pin = <STDIN>;    # Auf Eingabe warten
chomp $pin;

# Autorisierung mit PIN#
my ( $access_token, $access_token_secret, $user_id, $screen_name ) =
  $nt->request_access_token( verifier => $pin )
  or die $!;

# Daten in Config-Datei schreiben
$cfg->param( 'access_token',         $access_token );
$cfg->param( 'accesss_token_secret', $access_token_secret );
$cfg->param( 'user_id',              $user_id );
$cfg->param( 'screen_name',          $screen_name );
$cfg->param( 'consumer_key',         $consumer_tokens{consumer_key} );
$cfg->param( 'consumer_secret',      $consumer_tokens{consumer_secret} );

$cfg->write($config_file) or die $!;
exit;

 

Tweet

Im Beispiel wird die oben erzeugte Konfigurationsdatei verwendet, ein Test-Tweet erzeugt und die letzen Tweets angezeigt.

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

use Config::Simple;
use Net::Twitter;

my $config_file = 'twitter.access.ini';

my $cfg = new Config::Simple() or die $!;
$cfg->read($config_file) or die $!;

my $access_token        = $cfg->param('access_token');
my $access_token_secret = $cfg->param('accesss_token_secret');
my $user_id             = $cfg->param('user_id');
my $screen_name         = $cfg->param('screen_name');
my $consumer_key        = $cfg->param('consumer_key');
my $consumer_secret     = $cfg->param('consumer_secret');

my $nt = Net::Twitter->new(
    traits => [qw/API::REST OAuth/],
    ( consumer_key => $consumer_key, consumer_secret => $consumer_secret )
);

$nt->access_token($access_token);
$nt->access_token_secret($access_token_secret);

$nt->update('Test Net::Twitter mit OAuth!') or die $!;

my $statuses = $nt->user_timeline( { count => 10 } );

foreach my $status (@$statuses) {
        print $status->{text}, "\n";
}    

$nt->end_session();
exit;

 

Siehe auch

 

Fehlende Links, Ergänzungen, Anregungen?

Bitte einfach als Kommentar. Danke.

Über dieses Archiv

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

August 2010 ist das vorherige Archiv.

Oktober 2010 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.