Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

write 10 files

0 views
Skip to first unread message

Ela

unread,
May 16, 2008, 5:45:21 AM5/16/08
to

The following codes are not accepted by Perl and even string concatenation
doesn't work. Any suggestions?


#!/usr/bin/perl

$infile = $ARGV[0];
foreach $k (0..10) {
$outfile = $infile . $k;
open (OFP$k, ">$outfile");
}

$i = $size/10000;
print OFP$i "something"; #0-10k, 10-20k, .... 90-100k...


A. Sinan Unur

unread,
May 16, 2008, 6:41:09 AM5/16/08
to
"Ela" <e...@yantai.org> wrote in
news:g0jl3m$cj$1...@ijustice.itsc.cuhk.edu.hk:

> The following codes are not accepted by Perl and even string
> concatenation doesn't work.

Doesn't work is not a good problem description.

> Any suggestions?

See below.

> #!/usr/bin/perl

use strict;
use warnings;

> $infile = $ARGV[0];
> foreach $k (0..10) {

You realize that loops 11 times, right?

> $outfile = $infile . $k;
> open (OFP$k, ">$outfile");

First off, you should check if open succeeded. Second, what makes you
think you can use OFP$k where Perl expects a filehandle.

This looks like a very poor attempt at using symbolic file handles (if
such a thing even exsits, I don't know).

When you find yourself wanting to index something using an integer, you
should use an array.

> }
>
> $i = $size/10000;
> print OFP$i "something"; #0-10k, 10-20k, .... 90-100k...

#!/usr/bin/perl

use strict;
use warnings;

my ($prefix) = @ARGV;
die "No prefix specified\n" unless defined $prefix;

my @out;

for my $i ( 0 .. 9 ) {
my $name = "${prefix}${i}";
if ( open my $fh, '>', $name ) {
push @out_h, { name => $name, handle => $fh };
}
else {
warn "Error opening '$name': $!\n";
}
}

for my $file ( @out ) {
my $handle = $file->{handle};
my $name = $file->{name};
print $handle "This is $name\n";
unless ( close $handle ) {
warn "Error closing '$name': $!";
}
undef $file->{handle};
}

__END__


Sinan

--
A. Sinan Unur <1u...@llenroc.ude.invalid>
(remove .invalid and reverse each component for email address)

comp.lang.perl.misc guidelines on the WWW:
http://www.rehabitation.com/clpmisc/

Ben Morrow

unread,
May 16, 2008, 7:46:48 AM5/16/08
to

Quoth "A. Sinan Unur" <1u...@llenroc.ude.invalid>:

> "Ela" <e...@yantai.org> wrote in
> news:g0jl3m$cj$1...@ijustice.itsc.cuhk.edu.hk:
>
> > open (OFP$k, ">$outfile");
>
> First off, you should check if open succeeded. Second, what makes you
> think you can use OFP$k where Perl expects a filehandle.
>
> This looks like a very poor attempt at using symbolic file handles (if
> such a thing even exsits, I don't know).

Yes, it does. A filehandle is just an unquoted string, so

open "OFP$k", ">$outfile";

'works', FSVO.

(I'm leaving this bit in just in case anyone gets the wrong idea from
this post... :) )

> When you find yourself wanting to index something using an integer, you
> should use an array.

Ben

--
I touch the fire and it freezes me, [b...@morrow.me.uk]
I look into it and it's black.
Why can't I feel? My skin should crack and peel---
I want the fire back... Buffy, 'Once More With Feeling'

Ela

unread,
May 16, 2008, 9:37:20 AM5/16/08
to

> Yes, it does. A filehandle is just an unquoted string, so
>
> open "OFP$k", ">$outfile";
>
> 'works', FSVO.
>
> (I'm leaving this bit in just in case anyone gets the wrong idea from
> this post... :) )

Does "works" mean it does not generate error but still cannot achieve the
effect of printing into different files? Because I'm able to open empty
file1, file2, ..., file10 but nothing is printed into them.


Bill H

unread,
May 16, 2008, 10:05:39 AM5/16/08
to

Unless $size is always evenly divisible by 10000 then $i will not be
the number you expect it to be (use $i = int($size/10000); instead)
and it will never print into one of the file handles you have open.
(for example, $size = 11,000 then $i = 11000/10000 will equal 1.1, not
the "1" you expect.)

Bill H

Ela

unread,
May 16, 2008, 10:59:10 AM5/16/08
to
> $i = $size/10000;
> print OFP$i "something"; #0-10k, 10-20k, .... 90-100k...

Unless $size is always evenly divisible by 10000 then $i will not be
the number you expect it to be (use $i = int($size/10000); instead)
and it will never print into one of the file handles you have open.
(for example, $size = 11,000 then $i = 11000/10000 will equal 1.1, not
the "1" you expect.)

Bill H

Yes, u a right. and I've already added int ($size/10000)


Frank Seitz

unread,
May 16, 2008, 11:00:24 AM5/16/08
to

use strict;
use warnings;

my @fh;
my $k = 0;

open $fh[$k],'>','/tmp/test.txt' or die $!;
print {$fh[$k]} "Hello\n" or die $!;
close $fh[$k] or die $!;

Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Ela

unread,
May 16, 2008, 11:23:33 AM5/16/08
to
> use strict;
> use warnings;
>
> my @fh;
> my $k = 0;
>
> open $fh[$k],'>','/tmp/test.txt' or die $!;
> print {$fh[$k]} "Hello\n" or die $!;
> close $fh[$k] or die $!;
>
> Frank

Tested and confirmed to work, but also thank Sinan's great efforts. Also the
reminder from Bill. And lastly, Ben. He always helps me a lot.


A. Sinan Unur

unread,
May 17, 2008, 7:34:32 AM5/17/08
to
Ben Morrow <b...@morrow.me.uk> wrote in
news:8q80g5-...@osiris.mauzo.dyndns.org:

>
> Quoth "A. Sinan Unur" <1u...@llenroc.ude.invalid>:
>> "Ela" <e...@yantai.org> wrote in
>> news:g0jl3m$cj$1...@ijustice.itsc.cuhk.edu.hk:
>>
>> > open (OFP$k, ">$outfile");
>>

...


>> This looks like a very poor attempt at using symbolic file handles
>> (if such a thing even exsits, I don't know).
>
> Yes, it does. A filehandle is just an unquoted string, so
>
> open "OFP$k", ">$outfile";
>
> 'works', FSVO.
>
> (I'm leaving this bit in just in case anyone gets the wrong idea from
> this post... :) )
>
>> When you find yourself wanting to index something using an integer,
>> you should use an array.

Thank you. I should have checked that myself. I am hoping that the OP
dropped the use of "OFP$k" in favor of $OFP[$k].

0 new messages