[+] Perl, formatowanie tekstu w konsoli - co

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
ShinnRa
Beginner
Posty: 457
Rejestracja: 05 marca 2007, 23:05
Lokalizacja: Gdynia

[+] Perl, formatowanie tekstu w konsoli - coś typu tabela

Post autor: ShinnRa »

Mam taki kod:

Kod: Zaznacz cały

#!/usr/bin/env perl
#----------------------------------------------------------------------
# /usr/local/bin/update.pl
#
# v0.1.1
#----------------------------------------------------------------------
# Modules
#
use strict;
use warnings;
use Linux::APT;

#----------------------------------------------------------------------

my $APT = Linux::APT->new(
	debug => 0
);

my $l		= 0;
my $len		= 0;
my $toupgrade	= $APT->toupgrade;
my @up_pkgs	= $toupgrade->{packages};
my $output	= " PACKAGE                 | CURRENT            | NEW
-------------------------+--------------------+--------------------\n";

for my $i (@up_pkgs) {
	while(my($package, $versions) = each %{$i}) {
		
		# length of the package name
		$len	= length $package;
		$l	= $len-25;
		$output = $output . sprintf(" %${l}s", $package);
		$output = $output . "|";
		
		$len = $l = 0;
		# length of the package current version
		$len	= length $versions->{current};
		$l	= $len-20;
		$output = $output . sprintf(" %${l}s", $versions->{current});
		$output = $output . "|";

		$len = $l = 0;
		# length of the package new version
		$len	= length $versions->{new};
		$l	= $len-20;
		$output = $output . sprintf(" %${l}s", $versions->{new});
		$output = $output . "\n";
	}
}

$output = $output . "-------------------------+--------------------+--------------------\n";

print $output;

#----------------------------------------------------------------------
exit 0;

Teoretycznie kod powinien wypisywać coś w tym stylu:

Kod: Zaznacz cały

 PACKAGE                 | CURRENT            | NEW
-------------------------+--------------------+--------------------
 mysql-client-5.5        | 5.5.24+dfsg-5      | 5.5.24+dfsg-6
 libss2                  | 1.42.4-3           | 1.42.5-1
 libmysqlclient18        | 5.5.24+dfsg-5      | 5.5.24+dfsg-6
 libcomerr2              | 1.42.4-3           | 1.42.5-1
 e2fslibs                | 1.42.4-3           | 1.42.5-1
 mysql-server-5.5        | 5.5.24+dfsg-5      | 5.5.24+dfsg-6
 e2fsprogs               | 1.42.4-3           | 1.42.5-1
 mysql-server-core-5.5   | 5.5.24+dfsg-5      | 5.5.24+dfsg-6
 apt                     | 0.8.15.10          | 0.9.7.2 
 mysql-client            | 5.5.24+dfsg-5      | 5.5.24+dfsg-6
 mysql-server            | 5.5.24+dfsg-5      | 5.5.24+dfsg-6
 mysql-common            | 5.5.24+dfsg-5      | 5.5.24+dfsg-6
-------------------------+--------------------+--------------------

Jednak nie wiem dlaczego wynik jest zupełnie inny:

Kod: Zaznacz cały


 PACKAGE                 | CURRENT            | NEW
-------------------------+--------------------+--------------------
 mysql-client-5.5| 5.5.24+dfsg-5| 5.5.24+dfsg-6
 libss2             | 1.42.4-3    | 1.42.5-1    
 libmysqlclient18| 5.5.24+dfsg-5| 5.5.24+dfsg-6
 libcomerr2     | 1.42.4-3    | 1.42.5-1    
 e2fslibs         | 1.42.4-3    | 1.42.5-1    
 mysql-server-5.5| 5.5.24+dfsg-5| 5.5.24+dfsg-6
 e2fsprogs       | 1.42.4-3    | 1.42.5-1    
 mysql-server-core-5.5| 5.5.24+dfsg-5| 5.5.24+dfsg-6
 apt                   | 0.8.15.10  | 0.9.7.2      
 mysql-client | 5.5.24+dfsg-5| 5.5.24+dfsg-6
 mysql-server | 5.5.24+dfsg-5| 5.5.24+dfsg-6
 mysql-common | 5.5.24+dfsg-5| 5.5.24+dfsg-6
-------------------------+--------------------+--------------------
sihill
Posty: 13
Rejestracja: 02 stycznia 2011, 18:24

Post autor: sihill »

Spróbuj zamienić

Kod: Zaznacz cały

sprintf(" %${l}s", $package);

na:

Kod: Zaznacz cały

sprintf(" %-${l}s", $package);



Co domyślnie ustawi przyleganie tekstu do lewej strony i stosuj stałą szerokość do danej kolumny. Wnioskując z kodu obecnie szerokość generowana jest na podstawie długości ciągu $package-20.
Awatar użytkownika
ShinnRa
Beginner
Posty: 457
Rejestracja: 05 marca 2007, 23:05
Lokalizacja: Gdynia

Post autor: ShinnRa »

Niestety nie dało to zamierzonego efektu... Jedna w końcu zastosowałem coś innego a dokładniej Text::ASCIITable dzieki, któremu moge sobie dowolnie definiować wyrównanie kolumn, wierszy czy poszczególnych komórek (włacznie z nagłówkami)
sihill
Posty: 13
Rejestracja: 02 stycznia 2011, 18:24

Post autor: sihill »

Zawsze to dodatkowy moduł do doinstalowania. Jak dla mnie jedyne sensowne rozwiązanie to zdefiniowanie przed pętlą stałej szerokości kolumn (według kodu z pierwszego postu szerokość definiujesz w pętli więc jest zmienna).
Awatar użytkownika
ShinnRa
Beginner
Posty: 457
Rejestracja: 05 marca 2007, 23:05
Lokalizacja: Gdynia

Post autor: ShinnRa »

sihill pisze:Zawsze to dodatkowy moduł do doinstalowania. Jak dla mnie jedyne sensowne rozwiązanie to zdefiniowanie przed pętlą stałej szerokości kolumn (według kodu z pierwszego postu szerokość definiujesz w pętli więc jest zmienna).
Chyba nie do końca zrozumiałem zasadę działania tego:

Kod: Zaznacz cały

" %20s"...
Myślałem, że jest to ilość samych spacji jakie mają być dopisane o to jest szerokość całości.

W każdym razie, ten kod działa tak jak chciałem:

Kod: Zaznacz cały

#!/usr/bin/env perl
#----------------------------------------------------------------------
# /usr/local/bin/update.pl
#
# v0.1.1
#----------------------------------------------------------------------
# Modules
#
use strict;
use warnings;
use Linux::APT;

#----------------------------------------------------------------------

my $APT = Linux::APT->new(
        debug => 0
);

my $l           = 0;
my $len         = 0;
my $toupgrade   = $APT->toupgrade;
my @up_pkgs     = $toupgrade->{packages};
my $output      = "+-------------------------+--------------------+--------------------+
| PACKAGE                 | CURRENT            | NEW                |
+-------------------------+--------------------+--------------------+\n";

for my $i (@up_pkgs) {
        while(my($package, $versions) = each %{$i}) {
                $output = $output . "|";
                # length of the package name
                $len    = length $package;
                $l      = 24;
                $output = $output . sprintf(" %-${l}s", $package);
                $output = $output . "|";

                $len = $l = 0;
                # length of the package current version
                $len    = length $versions->{current};
                $l      = 19;
                $output = $output . sprintf(" %-${l}s", $versions->{current});
                $output = $output . "|";

                $len = $l = 0;
                # length of the package new version
                $len    = length $versions->{new};
                $l      = 19;
                $output = $output . sprintf(" %-${l}s", $versions->{new});
                $output = $output . "|\n";

        }
}

$output = $output . "+-------------------------+--------------------+--------------------+\n";

print $output;

#----------------------------------------------------------------------
exit 0;
drukuje:

Kod: Zaznacz cały

+-------------------------+--------------------+--------------------+
| PACKAGE                 | CURRENT            | NEW                |
+-------------------------+--------------------+--------------------+
| manpages                | 3.40-0.1           | 3.42-1             |
| manpages-dev            | 3.40-0.1           | 3.42-1             |
| libkmod2                | 9-1                | 9-2                |
| libmagickwand5          | 6.7.7.10-3         | 6.7.7.10-4         |
| libperl5.14             | 5.14.2-12          | 5.14.2-13          |
| perl-base               | 5.14.2-12          | 5.14.2-13          |
| imagemagick-common      | 6.7.7.10-3         | 6.7.7.10-4         |
| imagemagick             | 6.7.7.10-3         | 6.7.7.10-4         |
| libmagickcore-dev       | 6.7.7.10-3         | 6.7.7.10-4         |
| libmagickwand-dev       | 6.7.7.10-3         | 6.7.7.10-4         |
| perl-modules            | 5.14.2-12          | 5.14.2-13          |
| perl                    | 5.14.2-12          | 5.14.2-13          |
| libmagickcore5          | 6.7.7.10-3         | 6.7.7.10-4         |
| libmagickcore5-extra    | 6.7.7.10-3         | 6.7.7.10-4         |
| module-init-tools       | 9-1                | 9-2                |
| kmod                    | 9-1                | 9-2                |
+-------------------------+--------------------+--------------------+
ODPOWIEDZ