write 10 files

Discussion in 'Perl Misc' started by Ela, May 16, 2008.

  1. Ela

    Ela Guest

    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...
     
    Ela, May 16, 2008
    #1
    1. Advertising

  2. "Ela" <> wrote in
    news:g0jl3m$cj$:

    > 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 <>
    (remove .invalid and reverse each component for email address)

    comp.lang.perl.misc guidelines on the WWW:
    http://www.rehabitation.com/clpmisc/
     
    A. Sinan Unur, May 16, 2008
    #2
    1. Advertising

  3. Ela

    Ben Morrow Guest

    Quoth "A. Sinan Unur" <>:
    > "Ela" <> wrote in
    > news:g0jl3m$cj$:
    >
    > > 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, []
    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'
     
    Ben Morrow, May 16, 2008
    #3
  4. Ela

    Ela Guest


    > 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.
     
    Ela, May 16, 2008
    #4
  5. Ela

    Bill H Guest

    On May 16, 5:45 am, "Ela" <> wrote:
    > 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...


    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
     
    Bill H, May 16, 2008
    #5
  6. Ela

    Ela Guest

    > $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)
     
    Ela, May 16, 2008
    #6
  7. Ela

    Ela Guest

    DONE: write 10 files

    > 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.
     
    Ela, May 16, 2008
    #7
  8. Ben Morrow <> wrote in
    news::

    >
    > Quoth "A. Sinan Unur" <>:
    >> "Ela" <> wrote in
    >> news:g0jl3m$cj$:
    >>
    >> > 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].

    Sinan

    --
    A. Sinan Unur <>
    (remove .invalid and reverse each component for email address)

    comp.lang.perl.misc guidelines on the WWW:
    http://www.rehabitation.com/clpmisc/
     
    A. Sinan Unur, May 17, 2008
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.

Share This Page