Beefy Boxes and Bandwidth Generously Provided by pair Networks DiBona
There's more than one way to do things
 
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 (Chancellor) 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 chilling in the Monastery: (6)
As of 2014-04-21 10:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (492 votes), past polls