CPAN: mit print ipadresse auf html seite schreiben

Beitrag lesen

Dein Code ist großer Murks. Das grep funktioniert nicht, weil ein Tippfehler im String ist. Das grep funktioniert nicht, weil der String localeabhängig ist. (Ich vermute, dies ist der Grund für das beschriebene Fehlverhalten.) Man pfriemelt keine Daten mit Screenscraping raus, wenn diese bereits in strukturierter Form vorliegen.

So geht's richtig:

  
    use IO::Interface::Simple qw();  
    my $interface_address = IO::Interface::Simple->new('ippp0')->address;  
    # 123.123.123.123  

Woher weißt du eigentlich, dass ippp0 der richtige Interfacename ist? Diese Frage ist nicht rhetorisch, ich möchte es erfahren. Morgen, oder insbesonders gerne nach einem Neustart, kann das Interface ja plötzlich anders heißen.

U.u. ist eine Auflistung nützlich.

  
    use IO::Interface::Simple qw();  
    my %interfaces_addresses_map = map {  
        $_ => $_->address  
    } IO::Interface::Simple->interfaces;  
    # (  
    #    eth0     => '192.168.0.1',  
    #    lo       => '127.0.0.1',  
    #    vboxnet0 => undef,  
    # )  

Weitere Kritik: die Art, wie du eine Webanwendung schreibst, war schon 1997(!) überholt. Kannst du auf eine modernere Weise umsatteln? Insbesonders lege ich dir die Verwendung von Templates zu Herzen, damit du später das Markup in Dateien auslagern kannst und so eine saubere Trennung von Inhalt und Form hast, die du mittels print nur schwerlich erreichen kannst.

════════════════════════════════════════════════════════════════════════════════

Als PSGI-Anwendung:

  
use HTTP::Status qw(HTTP_OK);  
use IO::Interface::Simple qw();  
use Template::Tiny qw();  
  
my $app = sub {  
    my ($env) = @_;  
    my $fill_in = {  
        interface_address => IO::Interface::Simple->new('ippp0')->address,  
    };  
  
    my $content_body;  
    Template::Tiny->new->process(\<<'END_TEMPLATE', $fill_in, \$content_body);  
<!DOCTYPE html>  
<html>  
    <head>  
        <title></title>  
    </head>  
    <body>  
        <table>  
            <tr>  
                <td>aktuelle IP</td>  
                <td>[% interface_address %]</td>  
            </tr>  
        </table>  
    </body>  
</html>  
END_TEMPLATE  
  
    return [HTTP_OK, ['Content-Type' => 'text/html;charset=UTF-8'], [$content_body]];  
};  

════════════════════════════════════════════════════════════════════════════════

Oder als CGI-Anwendung:

  
use CGI qw();  
use IO::Interface::Simple qw();  
use Template::Tiny qw();  
  
my $cgi = CGI->new;  
print $cgi->header('text/html;charset=UTF-8');  
  
my $fill_in = {  
    interface_address => IO::Interface::Simple->new('ippp0')->address,  
};  
Template::Tiny->new->process(\<<'END_TEMPLATE', $fill_in);  
<!DOCTYPE html>  
<html>  
    <head>  
        <title></title>  
    </head>  
    <body>  
        <table>  
            <tr>  
                <td>aktuelle IP</td>  
                <td>[% interface_address %]</td>  
            </tr>  
        </table>  
    </body>  
</html>  
END_TEMPLATE  
  
1;