Sasa Stupar wrote:
> 
> Hi!

Hello,

> I am new to perl. I have written a script to automatically subscribe to
> the mailing list. The part of the script is here:
> ---------------------------------------------

[changed formating to make it more readable]

> open (FILE,"/var/www/mlusers.tab");

You should ALWAYS verify that the file opened correctly.

open FILE, '/var/www/mlusers.tab' or die "Cannot open
'/var/www/mlusers.tab' $!";


> @linesaddr=<FILE>;

You don't really need to read the whole file into an array.

> $countaddr=@linesaddr;
> if ($countaddr!=0) {

There is no need for the $countaddr variable, you can use the array
directly.

if ( @linesaddr ) {


>     foreach $lineaddr (@linesaddr) {
>         @itemaddr=split(/\t/,$lineaddr);
>         my $testn = @itemaddr[0];
                      ^^^^^^^^^^^^
If you had warnings enabled this would have triggered one.  You should
use a scalar not an array slice here.

        my $testn = $itemaddr[0];


>         $testn1 = "\"".$Config{'email'}."\"";

You could use an alternate quoting method so you don't have to escape
the double quotes.

        $testn1 = qq("$Config{'email'}");


>         if ($testn eq $testn1){
>             $alrd = 1;
>             }
>         }
>     }
> close (FILE);
> if ($alrd == 1) {&already_subscribed}
                   ^
You shouldn't use an ampersand to call subs.

if ($alrd == 1) {already_subscribed()}

perldoc perlsub


> else {
>     open(STAT,">> /var/www/mlusers.tab");

You should ALWAYS verify that the file opened correctly.

    open STAT, '>> /var/www/mlusers.tab' or die "Cannot open
'/var/www/mlusers.tab' $!";


>     print STAT "\"".$Config{'email'}."\""."\t"."\"RW\""."\n";

You could use an alternate quoting method so you don't have to escape
the double quotes.

    print STAT qq("$Config{'email'}"\t"RW"\n);

Is there any particular reason that you enclose both fields in double
quotes?

>     close(STAT);
>     &return_html;

    return_html();

>     }
> -------------------------------------------------------

I would probably write it like this:

use warnings;
use strict;
use Fcntl qw(:seek);

my $file = '/var/www/mlusers.tab';
my $alrd;

open my $fh, '+<', $file or die "Cannot open $file: $!";

while ( <$fh> ) {
    if ( /^"\Q$Config{'email'}\E"\t/ ) {
        $alrd = 1;
        last;
        }
    }

if ( $alrd ) {
    already_subscribed();
    }
else {
    seek $fh, 0, SEEK_END or die "Cannot seek on $file: $!";
    print $fh qq("$Config{'email'}"\t"RW"\n);
    close $fh;
    return_html();
    }


> Now I would like to also write to automatically unsubscribe from the
> mailing list but I am stuck. I don't know and I didn't find how to
> remove one complete line from the text file.
> Here the text file is mlusers.tab. So each line has to have <NEWLINE>
> mark and in between the filled lines there should not be empty lines.
> Can somebody help me with this ?

You could use perl's in-place edit feature:

use warnings;
use strict;

( $^I, @ARGV ) = ( '.bak', '/var/www/mlusers.tab' );

while ( <> ) {
    next if /^"\Q$Config{'email'}\E"\t/;
    print;
    }


Or you could use the Tie::File module:

use warnings;
use strict;
use Tie::File;

my $file = '/var/www/mlusers.tab';

tie my @data, 'Tie::File', $file or die "Cannot open $file: $!";

@data = grep !/^"\Q$Config{'email'}\E"\t/, @data;




John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to