Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Tie::File Write Problem

by packetstormer (Monk)
on Nov 17, 2011 at 19:19 UTC ( #938670=perlquestion: print w/ replies, xml ) Need Help??
packetstormer has asked for the wisdom of the Perl Monks concerning the following question:

Hello

I am having a strange problem writing to a file with Tie::File. The code is below. The output to screen writes fine but the actual file isn't change. Its not permissions as I can write to the file fine if I don't split the line. I wonder if there is a fundamental problem with splitting the tie array and editing an element in that?

#!/usr/bin/perl use strict; use CGI; use Tie::File; my $query = new CGI; #my $file = $query->param('filename'); my $file = '/tmp/test.csv'; my @lines; print $query->header(); tie @lines, 'Tie::File', $file or die "No file found to work with."; print "We got $#lines lines in this file"; foreach my $i(@lines) { my @tmp = split (",",$i); if($tmp[6] eq "6 Elm") {$tmp[6] = 'XXXXX'} print "$i\n"; } untie @lines;

Does anything look obvious?

Comment on Tie::File Write Problem
Download Code
Re: Tie::File Write Problem
by toolic (Bishop) on Nov 17, 2011 at 19:30 UTC
    After you tied the file to the @lines array, you never make a modification to the @lines array. See Tie::File.
    tie @lines, 'Tie::File', $file or die "No file found to work with."; $lines[0] = 'foo'; # this should change the tied file
      That's my confusion, doesn't this line change the element in the line?
      if($tmp[6] eq "6 Elm") {$tmp[6] = 'XXXXX'}
      I am splitting each line up based on the commas in the line and changing that element
        That line does not change the @lines array or the tied file. That just changes the @tmp array. Tip #4 from Basic debugging checklist:
        use Data::Dumper; print Dumper(\@tmp); print Dumper(\@lines);

        @tmp is a completely separate variable that is not tied to the file. The split copies the data. You would have to add the following inside the foreach-loop to change the file as you intented:

        $i= join(',',@tmp);

        Note that even this works only because $i actually is an alias to the data in @lines and not a copy (this is magic done by the foreach loop)

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://938670]
Approved by toolic
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (16)
As of 2015-07-06 13:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (74 votes), past polls