Salve a Tutti , sto cercando di risolvere un problema per un software che sfrutta i package Curses::Widget e Curses::Widget::Menu<br>tale software è praticamente un frontend fatto da un menu che permette la scelta di alcune operazioni di aggiornamento dei miei portali su vps<br>
dalla mia macchina di sviluppo. tale frontend non deve fare altro che lanciare degli script shell che si occupano di effetture gli aggiornamenti.<br>Il problema che mi sto ponendo è che io voglio generare tali menu dinamicamente grazie ad una funzione che esegue un semplice "ls" su una dir <br>
purtruppo questo non riesco proprio a farlo è cioè non riesco a passare al costruttore dell pacchetto Curses::Widget::Menu un' hash nella maniera in cui <br>lui si attende di riceverlo.<br>Vi incollo il codice:<br><br>
#!/usr/bin/perl<br>use warnings;<br>use Devel::StackTrace;<br>use Curses;<br>use Curses::Widgets; # Included to import select_colour & scankey<br>use Data::Dumper;<br>#use Curses::Widgets::TextField;<br>#use Curses::Widgets::ButtonSet;<br>
#use Curses::Widgets::ProgressBar;<br>#use Curses::Widgets::TextMemo;<br>use Curses::Widgets::ListBox;<br>#use Curses::Widgets::Calendar;<br>#use Curses::Widgets::ComboBox;<br>use Curses::Widgets::Menu;<br>#use Curses::Widgets::Label;<br>
<br>my $menu;<br>my $mwh;<br>my $key;<br><br>$mwh = new Curses;<br><br>noecho();<br>halfdelay(5);<br>$mwh->keypad(1);<br>$mwh->syncok(1);<br>curs_set(0);<br>leaveok(1);<br><br>main_win();<br>$key = scankey($mwh);<br>
<br>$menu = Curses::Widgets::Menu->new({<br>FOREGROUND => 'white',<br> BACKGROUND => 'yellow',<br> BORDER => 1,<br> CURSORPOS => [qw(Aggiornamenti)],<br> FOCUSSWITCH => "\t",<br>
MENUS => {<br> MENUORDER => [qw(Aggiornamenti Log Tools Help)],<br> Aggiornamenti => {<br> ITEMORDER => [qw(Internet Local Exit)],<br> Internet => \&submenu,<br> Local => \&submenu,<br>
Exit => sub { exit 0 },<br> },<br> Log => {<br> ITEMORDER => [qw(View)],<br> View => sub { 1 },<br> },<br> Tools => {<br> ITEMORDER => [qw(Toolslist)],<br>
Toolslist => sub { 1 },<br> },<br> Help => {<br> ITEMORDER => [qw(Help About)],<br> Help => sub { 1 },<br> About => sub { 1 },<br> },<br> },<br><br>
});<br>$menu->execute($mwh);<br>$menu->draw($mwh);<br>scankey($mwh);<br><br>#exit 0;<br><br>END {<br> # The END block just ensures that Curses always cleans up behind<br> # itself<br> endwin();<br>}<br>exit 0;<br>
<br>##SUBROUTINE##<br><br><br>sub main_win {<br> $mwh->erase();<br> # This function selects a few common colours for the foreground colour<br> $mwh->attrset(COLOR_PAIR(select_colour(qw(red black))));<br> $mwh->box(ACS_VLINE, ACS_HLINE);<br>
$mwh->attrset(0);<br><br> $mwh->standout();<br> $mwh->addstr(0, 1, "Welcome to the System Updater of XXXXX");<br> $mwh->standend();<br>}<br><br>sub genLstPortalMenu{<br>my $dirtolist="./binportal";<br>
my @portal;<br>@portal = `ls ./binportal/`;<br>return @portal;<br>}<br><br>sub submenu{<br> $mwh->erase();<br> my $submenu;<br> my @listportal = genLstPortalMenu();<br><br>$submenu = Curses::Widgets::Menu->new({<br>
FOREGROUND => 'white',<br> BACKGROUND => 'yellow',<br> BORDER => 1,<br> CURSORPOS => [qw(Portali)],<br> FOCUSSWITCH => "\t",<br> MENUS => {<br>
MENUORDER => [qw(Portali)],<br> Portali => {<br> ITEMORDER => [@listportal],<br> <u><i><b>QUI DOVREI INSERIRE UNA STRUTTURA COME QUELLE PER LE ALTRE VOCI SOTTOSTANTI<br> MA GENERATA DINAMICAMENTE E' PURTROPPO NON RIESCO A TROVARE UN MODO.<br>
</b></i></u> },<br> Log => {<br> ITEMORDER => [qw(View)],<br> View => sub { 1 },<br> },<br> Tools => {<br> ITEMORDER => [qw(Toolslist)],<br>
Toolslist => sub { 1 },<br> },<br> Help => {<br> ITEMORDER => [qw(Help About)],<br> Help => sub { 1 },<br> About => sub { 1 },<br> },<br>
},<br> });<br>$submenu->execute($mwh);<br>1;<br>}<br><br>Grazie a tutti di avermi letto<br>Stefano Vitali<br><br>