[Kde-perl] listview and filehandles

toiletpaper usedtoiletpaper at thecookies.org
Mon Apr 26 11:28:54 CEST 2004


Rich wrote:

>On Sunday 25 Apr 2004 2:50 am, Edward wrote:
>  
>
>>ok well. heres something really odd. when using the listView in perlqt i
>>can no longer close or write to filehandles. they supposedly open fine
>>but when i print to them nothing prints and when i close them using
>>close FHA or die "cant close $pathname: $!";
>>i get cant close /tmp/Adema.Adema: Bad file descriptor at
>>/root/ui/form1.pl line 234
>>
>>    #    $pathname = "/tmp/Adema.Adema";
>>    #    print "Opening file and printing to it\n";
>>    #    open(FHA, "> $pathname")    or die "can't open $pathname: $!";
>>    #    #flock(FH, LOCK_EX)        or die "can't flock $pathname: $!";
>>    #    print FHA "hello there\n"     or die "cant print $pathname: $!";
>>    #    close(FHA)            or die "cant close $pathname: $!";
>>    
>>
>
>This isn't going to answer your question, but a couple of suggestions:
>
>1) Use a lexical scalar for filehandles.
>
>On modern(ish) perls you can do the following:
>
>open my $fh, ">", $pathname  or die "can't open $pathname: $!";   #<<<<
>print $fh "hello there\n"     or die "cant print $pathname: $!";
>close $fh                        or die "cant close $pathname: $!";
>
>This is generally a good thing, as it both limits filehandle scope, and closes 
>files when the handle goes out of scope, ie:
>
>{
>  open my $fh, ">", $pathname  or die "can't open $pathname: $!";   #<<<<
>  print $fh "hello there\n"     or die "cant print $pathname: $!";
>
>}  ## File closes here as $fh goes out of scope.
>
>Its still a good idea to explicitly close files as soon as they're not needed 
>however. You never know, that might solve your problem (but probably not).
>
>Also note the three argument form of open is safer than the two argument form. 
>perldoc -f open for lots of details (BTW the perlopentut docs for my version 
>(5.8.0) seem pretty out of date as the examples dont use lexical scalars for 
>filehandles).
>
>2) $pathname = "/tmp/Adema.Adema";
>
>Do you want a temporary file here? If so, you *must* use File::Temp - read the 
>docs for the reasons why.
>
>If you actually want to store data between runs, don't put the file in /tmp - 
>this is for temporary files, and there's no guarantee when data in /tmp will 
>be deleted. 
>
>Instead you could use File::HomeDir to find a suitable directory, then create 
>a hidden subdirectory and store data there - this will work on Unix style 
>systems, for windows there would be better alternatives but I'm not in a 
>position to comment.
>
>3) If you're going to add file locking, make sure you read the docs in detail 
>- there are some subtleties that make it easy to get wrong.
>
>Sorry this doesn't answer your question, but it will make the code slightly 
>more robust!
>  
>
well, i changed it to the lexical scalars as you suggested.
i had it put the file in the /tmp folder because it was just to see if 
it was working. so i changed it to the /home directory. same results. 
nothing prints and cant close it saying:
cant close /home/Adema.Adema: Bad file descriptor at ./form1.pl line 225.

i decided file locking was pretty much a waste as only one program is 
going to write this file at a time, no need to prevent others from 
writing to it as well.
i dont really think its something to do with the 
opening/printing/closing code in the end because when it is placed 
before the listview line it works fine. i am going to try using the kde 
listview control tommorow instead of the generic listview. with some 
luck it will work the way its supposed to.

the new subroutine looks like this:

sub puttrackinfo_tofile {
    my $pathname = "/home/Adema.Adema";
    my $line;
    my $dontadd = FALSE;
    my $lookforme;
    my $counter;
    $lookforme = join($combochars, $artist, $album, $tracknumber, 
$trackname, $tracklength, $genre);
    #open(my $ALBUMINFO,"<", $pathname);
    #my @rawdata = <$ALBUMINFO>;
    #close $ALBUMINFO;
    print "filepath=$pathname\n";
    print "filelinecount=$#rawdata\n";
    if (!$#rawdata == -1) {
        foreach $line (@rawdata) {
            if ("$line" eq "$lookforme") {  
                $dontadd=TRUE;
            }
            print $line,"\n";
        }
    }
    #if ($dontadd == FALSE) {
        print "Opening file and printing to it\n";
        open my $FHA, ">>", $pathname    or die "can't open $pathname: $!";
        print $FHA "$lookforme\n"     or die "cant print $pathname: $!";
        close $FHA            or die "cant close $pathname: $!";
    #}
}
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.kde.org/pipermail/kde-perl/attachments/20040426/03504a85/attachment.html


More information about the Kde-perl mailing list