Potrzebujesz pomocy z C, C++, perl, python, itp.
ShinnRa
Beginner
Posty: 457 Rejestracja: 05 marca 2007, 23:05
Lokalizacja: Gdynia
Post
autor: ShinnRa » 11 sierpnia 2012, 03:37
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 » 17 września 2012, 09:34
Spróbuj zamienić
na:
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.
ShinnRa
Beginner
Posty: 457 Rejestracja: 05 marca 2007, 23:05
Lokalizacja: Gdynia
Post
autor: ShinnRa » 17 września 2012, 10:22
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 » 17 września 2012, 11:37
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).
ShinnRa
Beginner
Posty: 457 Rejestracja: 05 marca 2007, 23:05
Lokalizacja: Gdynia
Post
autor: ShinnRa » 17 września 2012, 13:21
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:
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 |
+-------------------------+--------------------+--------------------+