On 2/4/10, Chris <cacogg...@gmail.com> wrote:
> On Feb 4, 10:59 am, shlo...@iglu.org.il (Shlomi Fish) wrote:
>> Hi Chris!
>>
>> Have you visitedhttp://perl-begin.org/yet and read a good introductory
>> book
>> or tutorial?
>>
>> On Thursday 04 Feb 2010 09:27:32 Chris wrote:
>>
>> > I need some help with this problem.
>> > I've got a text file datafile with 1 line of data comprised of 30
>> > different numbers delimited with ~s.
>>
>> > I need to open this file, grab this line of data, split it into
>> > individual numbers, perform some simple math (addition) on each
>> > number, and then put the new values back into the datafile, replacing
>> > the original data that was there.
>>
>> > I have tried for two days to figure out what I'm doing wrong, but I
>> > keep getting "needs a package name" errors for every variable
>> > nomenclature I try to work with. I've declare arrays and variables
>> > until my fingers are numb and nothing is working. I'm using Perl 5.008
>> > if that matters.
>>
>> You need to declare variables using "my". Can you show us what you have so
>> far?
>>
>> Regards,
>>
>>         Shlomi Fish
>>
>> > Can somebody please help?
>>
>
> Yes I have read several tutorials, and have a basic understanding of
> how to open a file and read the data into an array. The problem I run
> into is that once I close the file and perform my math functions and
> re-open the file to write the data to, the data is gone. Empty values
> are written to the file, making the file itself empty. I need to know
> the proper nomenclature for the arrays and variables so that the
> values of variables/elements are static for the next action. Here's
> one of the methods I tried to use that failed:
>
> #open file, get data, close file
> open(FILE, "<datafile.txt") or die("Unable to open data file.");
>     while (<FILE>) {
>         my($a,$b,$c) = split(/~/, $_);
>     }
>     close(FILE);
> #perform math
>     $a = $a+$previousarray[0]; #add the value of $a and the value of
> an element in a previous array
>     $b = $b+$previousarray[1];
>     $c = $c+$previousarray[2];
> #write new values to the datafile
> open(FILE, ">datafile.txt") or die ("unable to open file.");
> print FILE ("$a~");
> print FILE ("$b~");
> print FILE ("$c~");
> close(FILE);
> #end of problem section
>
> The above produces an empty datafile. I have tried to declare an
> explicit array for the file data using the following:
>
> open(FILE, "<datafile.txt") or die("Unable to open data file.");
> @values=<FILE>;
> close(FILE);
> foreach $element (@values)
> {
> ($a,$b,$c) = split(/~/, $element);
>     $a = $a+$previousarray[0];
>     $b = $b+$previousarray[1];
>     $c = $c+$previousarray[2];
> #then open the datafile and write new values.
>
> I keep getting "use of unititialized values" errors, and "needs
> explicit package name" errors, and an empty datafile.
>
> That's why I came to this forum for help. I also neglected to note in
> my original post that I need to access these new values elsewhere in
> the script.

I'm not sure why you write the new values to a file.   You could leave
the new values in an array, then later in your program you could
retrieve the new values from the array.


data1.txt
------------
0~s10~s100

====================

use strict;
use warnings;
use 5.010;


open my $IN_FILE, '<', 'data1.txt'
    or die "couldn't open data1.txt for reading: $!";

chomp (my $line = <$IN_FILE>);
close $IN_FILE;

my @numbers = split /~s/, $line;
say "@numbers";   #0 10 100

for (@numbers) {
    $_ += 1;
}
say "@numbers";   #1 11 101

my $output = join '~s', @numbers;
say $output;   #1~s11~s101

open my $OUT_FILE, '>', 'data1.txt'
    or die "couldn't open data1.txt for writing: $!";

say $OUT_FILE $output;

close $OUT_FILE;


data1.txt
-------------
1~s11~s101


print() is your friend.

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to