Newsgroup: it.comp.lang.perl
Titolo: stessa open() che funziona a inizio prg ma non alla fine

  E` una cosa stranissima e non mi ci raccapezzo.
my $cntfound = 0;
open( OUT, "> totfile.dat" ) || die "\nErrore Aprendo totfile.dat !\n\n";
  print OUT ( $cntfound );
close( OUT );
foreach $file( @dir ) {
  open( IN, "< $file" ) || next;
  while( $riga = <IN> ) {
      ...elaborazione dati...
  }
  close( IN );
  $cntfound += 1;
}
open( OUT, "> totfile.dat" ) || die "\nErrore Aprendo totfile.dat !\n\n";
  print OUT ( $cntfound );
close( OUT );
  Ora, la prima open( OUT )  funziona correttamente, la seconda mi da`
invcece "Errore Aprendo totfile.dat !".
  Come puo` essere  possibile? Le tre righe sono  identiche, lo script
funziona perfettamente da  un pajo di anni, ho solo  aggiunto 'ste tre
righe per salvare un dato da utilizzare in un altro script...
  Per ora ho risolto tenendo aperta la prima open, lasciando girare lo
script, e scrivendo e chiudendo alla fine, cioe`
open( OUT, "> totfile.dat" ) || die "\nErrore Aprendo totfile.dat
  foreach $file( @dir ) {
    ...elaborazione dati...
  }
  print OUT ( $cntfound );
close( OUT );
  Pero` non apro nessun altro file OUT, nel frattempo!
  Veramente non capisco... bah... :(((
  Avete qualche idea su da cosa possa dipendere?
  Grazie.
-- 
Cio` che ho scritto, ho scritto.

 invcece "Errore Aprendo totfile.dat !".
prova a usare la variabile speciale $!
open( OUT, "> totfile.dat" ) or die "\nErrore con totfile.dat: $!\n\n";
che ti dovrebbe dare un messaggio d'errore + specifico.

  Come puo` essere  possibile? 
A parte che non capisco perché scrivi un dato in un file all'inizio, per poi
cancellarlo e scriverne un altro (ma immagino che tu sappia quello che stai
facendo), e a parte che la soluzione "corretta" mi sembra quella di tenere
aperto il file tutto il tempo, se continui a scriverci qualcosa, o aprirlo
una sola volta alla fine se ci scrivi una volta sola, potrebbe dipendere da
una cache del file da parte del sistema operativo.
Un tentativo (su cui personalmente non ivestirei piů che tanto) potrebbe
essere quello di imporre un flush immediato dell'output.
Un'altra ipotesi č che il file venga nel frattempo aperto in modo esclusivo
da qualche altro programma (e questo spiegherebbe perché ci vuoi scrivere
qualcosa fin dall'inizio), ma immagino che, se cosě fosse, ce lo avresti
detto.
Ciao.

 che ti dovrebbe dare un messaggio d'errore + specifico.
  "Permission denied"...  ma vedi la  risposta che ho dato  a Giovanni
Zezza.
  Grazie per l'interessamento.


 fosse, ce lo avresti detto.
  In effetti,  e` quel che  avevo pensato... invece, non  c'e` nessuna
"open" in modo scrittura nello script,  tranne quella alla fine, e non
lancio nessun altro programma nel  frattempo. E` uno script che lavora
da solo. L'output  dello script avviene sullo STDOUT o  sullo STDERR a
seconda  di quel  che  voglio memorizzare  o  visualizzare a  schermo,
ovviamente  senza pero`  specificare STDOUT...  cioe` lo  script viene
lanciato tipo:
 
nomescript.pl
 >file_di_output
e  quindi  ogni  print  o  printf  relativa  allo  STDOUT  non  ha  la
"specifica" STDOUT... che sia per  quello? Non ci avevo pensato... Mo'
cce provo, chissa`... ;)
  Intanto grazie per l'interessamento.


cce provo, chissa`... ;)
Non credo proprio.
Ciao.

 cui vuoi scrivere, invece che dare per scontato che aprirà [...]
  Ok, sono una *BESTIA*!
  In  effetti  `davo  proprio  per scontato'  di  lavorare  nella  dir
corrente, e invece m'ero scordato di un `chdir' per poter lavorare sui
file, directory che -  manco a dirlo - non ha  i permessi in scrittura
per "l'utonto" (che a questo punto sono io...)
  Beh... ti ringrazio infinitamente per  la pazienza. Le tue tre righe
che ho quotato  mi hanno messo la pulce nell'orecchio,  perche' io ero
stra-convinto di leggere i file con il nome assoluto, e invece mi sono
messo  a  spulciare nuovamente  lo  script  sinche'  non ho  visto  il
fatidico `chdir'... eh, e` la memoria che se ne va progressivamente in
pappa...
  A 'sto punto  calo le brache e ne approfitto  ancora un po', perche'
questo e`  un problema  che ho gia`  avuto in passato  e non  sono mai
riuscito a risolvere, nonostante abbia cercato  in lungo e in largo su
perldoc (e  non escludo di non  aver formulato la corretta  domanda in
inglese, eh?):  insomma, come diavolo  faccio a ottenere  la directory
corrente? Ok,  sotto Linux posso usare  pwd, ma sotto Win?  Perche' mi
serve per uno script sotto entrambe  le piattaforme, e mi pare assurdo
dover  testare  il  sistema  per un  semplice  "preleva  la  directory
corrente". Io sono convinto che sia  una cosa banalissima, ma non sono
proprio riuscito a venirne a capo...
  (beh... penso  sia inutile dirti che  con il perl sono  ancora prima
delle "prime armi"...) ;)
  Ti ringrazio ancora per la disponibilita`.
  Buon 2004.


 file, directory che -  manco a dirlo - non ha  i permessi in scrittura
Il "Permission denied" che ti ha fornito $! mi pare fosse un messaggio 
chiaro del problema. Non avevi i permessi per farlo.

 messaggio chiaro del problema. Non avevi i permessi per farlo.
  Vero, ma quando si e` accecati da una falsa convinzione... ;)


insomma, come diavolo  faccio a ottenere  la directory corrente?
    use Cwd;
    my $dir = getcwd;
Non escludo che ci siano altri modi, ma questo dovrebbe andare bene
dappertutto.
Ciao.

     my $dir = getcwd;
  Perfetto. E io che avevo cercato pwd, getpwd, current, directory...
  Ti ringrazio per l'ultima volta.
  Ora mi eclisso e non ti disturbo piu`... ;)
