Newsgroup: it.comp.lang.perl
Titolo: print e l'output di una sub

Devo settare un numero elevato di password su una macchina aix
utilizzando il tool chpass
Ho realizzato una soubroutine in perl che mi genera delle password
casuali.
come posso passare l'output di tale subroutine alla funzione print di
modo che mi stampi "chpass utente password" in un file(che poi eseguirņ)
o a video, dove password č l'output della subroutine
qualcosa come:
 
print OUTFILE "/usr/local/lib/tools/chpass $utente[0]  &genera "
dove &genera č la soubroutine che mi dą in output la password, non
funziona.
io nel file OUTFILE voglio leggere qualcosa come :
/usr/local/lib/tools/chpass pippo  XF5hyu7rT
ma mi stampa 
/usr/local/lib/tools/chpass pippo 
qualcuna sa dirmi come si fa?
thks
ludomir
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 funziona.
Da perlop (sezione "Quote and Quote-like Operators"):
        For constructs that do interpolate, variables beginning
        with "$" or "@" are interpolated
Quindi non si puo` interpolare l'output di una subroutine.
Potresti scrivere ad esempio:
print "/usr/local/lib/tools/chpass $utente[0] " . genera();
Quello che vuoi fare tu molto probabilmente sara` possibile
con Perl 6:
http://www.perl.com/pub/a/2001/05/03/wall.html
http://dev.perl.org/rfc/252.html
Oppure puoi usare il modulo Interpolation:
http://search.cpan.org/search?dist=Interpolation
ma non vedo perche` complicarsi la vita: da quello che ho
capito, in questo caso l'operatore '.' va benissimo.
ciao
Stefano


in questo modo (che a dire il vero avevo già provato) funziona solo a
video...ma se ridirigo il tutto in file come faccio?
proverò con il modulo che suggerisci.
Grazie mille
ludo


 Quindi non si puo` interpolare l'output di una subroutine.
da perlfaq4 ("How do I expand function calls in a string?"):
    This is documented in the perlref manpage. In general, this is
    fraught with quoting and readability problems, but it is possible.
    To interpolate a subroutine call (in list context) into a string:
    print "My sub returned @{[mysub(1,2,3)]} that time.\n";
quindi puoi scrivere:
    print OUTFILE "/usr/local/lib/tools/chpass $utente[0]  @{[&genera]} "
morale: "non si puņ" non si puņ usare in Perl ;-)
cheers,
Aldo
__END__
$_=q,just perl,,s, , another ,,s,$, hacker,,print;

 
Cosi funziona ovviamente, ridiigendo l'output in un file oppure aprendolo
e mettendo la filhendle nel print
open(OUT,">file") || die "Can't open $file for output: $!";
foreach my $user (@users) {
  print OUT  "/usr/local/lib/tools/chpass $user", genera(), "\n";
  #NOTA     ^___ niente virgola!!!!!
}
Nota che puoi fare meglio
foreach my $user (@users) {
  my $pass = genera();
  if (system("/usr/local/lib/tools/chpass $user $pass") {
      print OUT "$user $pass\n";
  }
  else {
      print STDERR "Could not change $user password: $!";
  }
}
In questo modo, il cambio della password è fatto dal programma perl
stesso, e ti da un file con le coppie user-password.
Giusto per evitare problemini di sicurezza, io utilizzerey sysopen invece
di open.
use Fcntl;
sysopen(OUT,"$file",O_WRONLY | O_CREAT | O_EXCL,0600);
In questo modo, apri il file in lettura sola, lo crei se non esiste e fai
un errore se esiste, inoltre lo crei leggibbile solo da root.
Per essere ancora più sicuro (ed evitare un symlink attack) dovresti
creare un filename casuale e fare in modo che il tuo script scriva il
nbome del file sullo standard output _dopo_ averlo creato, e se possibile
lo crei in una directory di proprietà root e con i permessi a 0700.
Ciao
-- 
Leo TheHobbit |  Windows NT: Recommended by people who put   |
IRCnet #roma2 |buggy software in control of lethal weapons.  |
ICQ 56656060  |                                              |a.d. XIII Kal. Mai. MMDCCLV AUC

 morale: "non si puň" non si puň usare in Perl ;-)
Good point. Oltretutto, visto che "C'e` piu` di un modo per..."
errare e` umano, perseverare e` automatico :-)
ciao
Stefano, che deve ricordare il mantra "perldoc, perlfaq, CPAN, Google"...