How do you dynamically assign array names?

Ask a Question related to PERL Beginners, Design and Development.

  1. #1

    Default How do you dynamically assign array names?

    Hi,

    I am trying to initialize a dynamically-named array, i.e. with the
    following test code (if I type "script.pl char" at the command prompt) I
    get the message "array char contains 1 2 3" but I get a warning if 'use
    strict' is on. Can anyone show me how it should be done (I would like to
    use 'use strict'!)?

    #!/usr/bin/perl -w
    #use strict;
    my ($string);

    while (<$ARGV[0]>) {
    chomp($string=$_);
    @$string = (1,2,3); #Won't work if 'use strict' pragma is used
    }

    print "array $string contains @$string\n";

    Douglas Houston Guest

  2. Similar Questions and Discussions

    1. Assign Array with Dynamic Variable Names
      I have an 2 dimensional array that I want to assign to an 1 dimensional array with a dynamic Variable Name. I can set the newarray function, but I...
    2. Getting the best answer(WAS: How do you dynamically assign array names?)
      I think this touches on an issue that people should consider when they post to this list. Often people ask a question, and instead of asking for...
    3. #26126 [NEW]: You cannot assign recursive array references.
      From: bens at effortlessis dot com Operating system: All PHP version: 4.3.2 PHP Bug Type: Feature/Change Request Bug...
    4. dynamically assign a member to a channel in the score
      Hi, Is it possible to have a member in the cast and put that member onto the stage dynamically through lingo. Currently I have 5 buttons and I...
    5. global array, can't assign values from variables
      Hi I'm just going to give the code and output. It should be self explanatory. The array, $criteria, is having the issue. I don't know what it's...
  3. #2

    Default Re: How do you dynamically assign array names?

    On Nov 14, Douglas Houston said:
    >I am trying to initialize a dynamically-named array, i.e. with the
    >following test code (if I type "script.pl char" at the command prompt) I
    >get the message "array char contains 1 2 3" but I get a warning if 'use
    >strict' is on. Can anyone show me how it should be done (I would like to
    >use 'use strict'!)?
    You need to explain WHY you want to do this. There doesn't seem to me to
    be a good reason. Use a hash of array references. Don't turn off strict.

    #!/usr/bin/perl

    use strict;
    use warnings; # perl5.6+

    my %data;
    my $name = shift;
    $data{$name} = [1,2,3];
    # or
    # @{ $data{$name} } = (1,2,3);

    And your "while (<$ARGV[0]>)" is weird, and not working why you think it
    works.

    --
    Jeff "japhy" Pinyan [email]japhy@pobox.com[/email] [url]http://www.pobox.com/~japhy/[/url]
    RPI Acacia brother #734 [url]http://www.perlmonks.org/[/url] [url]http://www.cpan.org/[/url]
    <stu> what does y/// stand for? <tenderpuss> why, yansliterate of course.
    [ I'm looking for programming work. If you like my work, let me know. ]

    Jeff 'Japhy' Pinyan Guest

  4. #3

    Default Re: How do you dynamically assign array names?

    >>>>> "Douglas" == Douglas Houston <douglas@davapc1.bioch.dundee.ac.uk> writes:

    Douglas> I am trying to initialize a dynamically-named array,
    Douglas> i.e. with the following test code (if I type "script.pl char"
    Douglas> at the command prompt) I get the message "array char contains
    Douglas> 1 2 3" but I get a warning if 'use strict' is on. Can anyone
    Douglas> show me how it should be done (I would like to use 'use
    Douglas> strict'!)?

    It should be done by not doing it. Do not use data to define metadata (like
    variable names). Down that path lies madness. "use strict" is trying
    to keep you from going mad.

    Probably what you are looking for is a hash containing arrayrefs,
    pointing at your real data.

    --
    Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
    <merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
    Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
    See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
    Randal L. Schwartz Guest

  5. #4

    Default Re: How do you dynamically assign array names?


    > Hi,
    >
    > I am trying to initialize a dynamically-named array, i.e. with the
    > following test code (if I type "script.pl char" at the command prompt) I
    > get the message "array char contains 1 2 3" but I get a warning if 'use
    > strict' is on. Can anyone show me how it should be done (I would like to
    > use 'use strict'!)?
    >
    > #!/usr/bin/perl -w
    > #use strict;
    > my ($string);
    >
    > while (<$ARGV[0]>) {
    > chomp($string=$_);
    > @$string = (1,2,3); #Won't work if 'use strict' pragma is used
    > }
    >
    > print "array $string contains @$string\n";
    >
    >
    Well that is kind of the point, you don't :-). That is specifically what
    the 'refs' part of 'strict' prevents (symbolic references), for good reason.

    perldoc strict

    In newer Perls you can shut off that portion of the stricture lexically,
    or a better idea is to store a reference to an anonymous array to a
    hash, then use the hash key as its name.

    my %hash;
    $hash{'array_name'} = [ 'one','two','three' ];

    print $hash{'array_name'}->[2];

    perldoc perlreftut
    perldoc perlref

    [url]http://danconia.org[/url]


    Wiggins D Anconia Guest

  6. #5

    Default Re: How do you dynamically assign array names?

    On Fri, 14 Nov 2003, Jeff 'japhy' Pinyan wrote:
    > On Nov 14, Douglas Houston said:
    >
    > >I am trying to initialize a dynamically-named array, i.e. with the
    > >following test code (if I type "script.pl char" at the command prompt) I
    > >get the message "array char contains 1 2 3" but I get a warning if 'use
    > >strict' is on. Can anyone show me how it should be done (I would like to
    > >use 'use strict'!)?
    >
    > You need to explain WHY you want to do this. There doesn't seem to me to
    > be a good reason. Use a hash of array references. Don't turn off strict.
    >
    WHY do I need to explain why I want to do this? There certainly isn't a
    good reason to do it with the test code I posted. If there's NEVER a good
    reason, what are the alternatives?
    > And your "while (<$ARGV[0]>)" is weird, and not working why you think it
    > works.
    >
    Can you

    a) explain how I think it works, and

    b) explain why it really works.

    Douglas Houston Guest

  7. #6

    Default Re: How do you dynamically assign array names?

    On Nov 14, Douglas Houston said:
    >On Fri, 14 Nov 2003, Jeff 'japhy' Pinyan wrote:
    >
    >> On Nov 14, Douglas Houston said:
    >>
    >> >I am trying to initialize a dynamically-named array, i.e. with the
    >> >following test code (if I type "script.pl char" at the command prompt) I
    >> >get the message "array char contains 1 2 3" but I get a warning if 'use
    >> >strict' is on. Can anyone show me how it should be done (I would like to
    >> >use 'use strict'!)?
    >>
    >> You need to explain WHY you want to do this. There doesn't seem to me to
    >> be a good reason. Use a hash of array references. Don't turn off strict.
    >
    >WHY do I need to explain why I want to do this? There certainly isn't a
    >good reason to do it with the test code I posted. If there's NEVER a good
    >reason, what are the alternatives?
    You need to explain why you want to do it is because it can create
    problems down the line. As for an alternative, I told you and showed you:
    use a hash of array references.

    $hash{foo} = [10, 20, 30];
    print $hash{foo}[2]; # 30
    >> And your "while (<$ARGV[0]>)" is weird, and not working why you think it
    >> works.
    >
    >a) explain how I think it works, and
    I don't know how you think it works, I'm just quite sure that you're using
    that construct because you think it is a standard thing to do, and it's
    not. How do YOU think it works? What if the first argument to your
    program was "foo*"?
    >b) explain why it really works.
    Perl thinks you're doing a file glob. <XXX> is a read from a filehandle
    unless XXX is something more complex than an identifier or a simple
    scalar. Thus, <$foo[$x]> is a file glob, glob($foo[$x]). If $foo[$x] has
    any wildcards or such, the shell expands that glob to all the files
    matching the pattern. But if it's just 'blah', glob('blah') returns
    'blah'. Then, the next time, it returns undef, because it's done
    returning them.

    If that sounds complex, that's because it IS. Doing what you did works in
    some cases, for a bizarre reason.

    --
    Jeff "japhy" Pinyan [email]japhy@pobox.com[/email] [url]http://www.pobox.com/~japhy/[/url]
    RPI Acacia brother #734 [url]http://www.perlmonks.org/[/url] [url]http://www.cpan.org/[/url]
    <stu> what does y/// stand for? <tenderpuss> why, yansliterate of course.
    [ I'm looking for programming work. If you like my work, let me know. ]

    Jeff 'Japhy' Pinyan Guest

  8. #7

    Default RE: How do you dynamically assign array names?

    Douglas Houston [mailto:douglas@davapc1.bioch.dundee.ac.uk]
    :
    : WHY do I need to explain why I want to do this?

    Because no one wants to give a loaded gun to
    someone who hasn't demonstrated a good grasp of
    gun safety.


    HTH,

    Charles K. Clarkson
    --
    Head Bottle Washer,
    Clarkson Energy Homes, Inc.
    Mobile Home Specialists
    254 968-8328


    Charles K. Clarkson Guest

  9. #8

    Default RE: How do you dynamically assign array names?


    > Douglas Houston [mailto:douglas@davapc1.bioch.dundee.ac.uk]
    > :
    > : WHY do I need to explain why I want to do this?
    >
    > Because no one wants to give a loaded gun to
    > someone who hasn't demonstrated a good grasp of
    > gun safety.
    >
    >
    That is a very ironic response coming from someone who based on their
    sig I assume is in the US, going to someone based on their address
    appears to be in the UK... who'd a thunk it...

    [url]http://danconia.org[/url]

    Wiggins D Anconia Guest

  10. #9

    Default Re: How do you dynamically assign array names?

    On Fri, Nov 14, 2003 at 04:30:05PM +0000, Douglas Houston wrote:
    > On Fri, 14 Nov 2003, Jeff 'japhy' Pinyan wrote:
    >> On Nov 14, Douglas Houston said:
    >>
    >>> I am trying to initialize a dynamically-named array
    >>
    >> You need to explain WHY you want to do this. There doesn't seem to me to
    >> be a good reason. Use a hash of array references. Don't turn off strict.
    >
    > WHY do I need to explain why I want to do this? There certainly isn't a
    > good reason to do it with the test code I posted.
    Probably Jeff was being polite, giving you the benefit of the doubt,
    allowing you to remain innocent-until-proven-guilty, etc. The fact is,
    there are very few good reasons to use symrefs -- exporting symbols is
    the only one I can think of -- and if you have a good reason, you'll need
    to give us some more information.
    > If there's NEVER a good reason,
    It's not that there's "NEVER" a good reason to use symbolic references.

    It's just that the code you posted doesn't have one. :-)
    > what are the alternatives?
    Use a hash of array references. Instead of this:

    @$name = (1,2,3); # gack! what if $name is "_" or "INC"?

    use this.

    $hash{$name} = [1,2,3];
    >> And your "while (<$ARGV[0]>)" is weird, and not working why you think
    >> it works.
    >
    > Can you
    >
    > a) explain how I think it works, and
    I don't know what you think the angle-brackets do here, but...
    > b) explain why it really works.
    Unless you think they do filename globbing, that code isn't working the
    way you think it works.

    --
    Steve
    Steve Grazzini Guest

  11. #10

    Default Re: How do you dynamically assign array names?

    Douglas Houston wrote:
    >
    > On Fri, 14 Nov 2003, Jeff 'japhy' Pinyan wrote:
    >
    > > On Nov 14, Douglas Houston said:
    > >
    > > >I am trying to initialize a dynamically-named array, i.e. with the
    > > >following test code (if I type "script.pl char" at the command prompt) I
    > > >get the message "array char contains 1 2 3" but I get a warning if 'use
    > > >strict' is on. Can anyone show me how it should be done (I would like to
    > > >use 'use strict'!)?
    > >
    > > You need to explain WHY you want to do this. There doesn't seem to me to
    > > be a good reason. Use a hash of array references. Don't turn off strict.
    > >
    >
    > WHY do I need to explain why I want to do this? There certainly isn't a
    > good reason to do it with the test code I posted. If there's NEVER a good
    > reason, what are the alternatives?
    Jeff's pretty sharp. Believe him. And don't be rude to people if you're
    asking for a favour.

    How can anyone suggest what the 'alternatives' may be without an
    explanation of the problem?

    Rob


    Rob Dixon Guest

  12. #11

    Default Re: How do you dynamically assign array names?

    Wiggins D Anconia wrote:
    >
    > > Douglas Houston [mailto:douglas@davapc1.bioch.dundee.ac.uk]
    > > :
    > > : WHY do I need to explain why I want to do this?
    > >
    > > Because no one wants to give a loaded gun to
    > > someone who hasn't demonstrated a good grasp of
    > > gun safety.
    > >
    > >
    >
    > That is a very ironic response coming from someone who based on their
    > sig I assume is in the US, going to someone based on their address
    > appears to be in the UK... who'd a thunk it...
    I would have thought it were more ironic the other way
    around. Everybody expects an American gun slinger to
    threaten a peaceful Dundee land owner.

    Totally :-)))))) No flames thank you.

    Rob


    Rob Dixon Guest

  13. #12

    Default Re: How do you dynamically assign array names?

    Douglas Houston wrote:
    > Hi,
    >
    > I am trying to initialize a dynamically-named array, i.e. with the
    > following test code (if I type "script.pl char" at the command prompt) I
    > get the message "array char contains 1 2 3" but I get a warning if 'use
    > strict' is on. Can anyone show me how it should be done (I would like to
    > use 'use strict'!)?
    >
    > #!/usr/bin/perl -w
    > #use strict;
    > my ($string);
    >
    > while (<$ARGV[0]>) {
    > chomp($string=$_);
    > @$string = (1,2,3); #Won't work if 'use strict' pragma is used
    > }
    >
    > print "array $string contains @$string\n";
    this normally can't be done cleanly and is generally not recommanded given
    there are other ways to accomplish bascially the same thing. but if you are
    here to see if it can be done at all, you might want to try something like:

    #!/usr/bin/perl -w
    use strict;

    my $name = shift;

    eval <<CODE;
    no strict;
    @ $name=1..3;
    print "\$_\\n" for(@ $name);
    CODE

    #--
    #-- print it again after eval
    #--
    while(my($k,$v) = each %::){
    next unless($k =~ /^$name$/);
    local *sym = $v;
    print join("\n",@main::sym),"\n";
    }

    __END__

    prints:

    1
    2
    3
    1
    2
    3

    david
    --
    $_='015001450154015401570040016701570162015401440'
    ,*,=*|=*_,split+local$";map{~$_&1&&{$,<<=1,$#.=qq~
    /63968e72w28@_[$_..$||3])=>~}}0..s,.,,g-01;*_=*#,s
    [[s/eval+w/.`9`/e]]n\\xng.print+eval(eval"qq`$_`")
    David Guest

  14. #13

    Default Re: How do you dynamically assign array names?

    On Fri, Nov 14, 2003 at 12:25:41PM -0800, david wrote:
    > Douglas Houston wrote:
    >>
    >> I am trying to initialize a dynamically-named array
    >
    > this normally can't be done cleanly and is generally not recommanded given
    > there are other ways to accomplish bascially the same thing. but if you are
    > here to see if it can be done at all, you might want to try something like:
    >
    > #!/usr/bin/perl -w
    > use strict;
    >
    > my $name = shift;
    >
    > eval <<CODE;
    > no strict;
    > @ $name=1..3;
    > print "\$_\\n" for(@ $name);
    > CODE
    Sigh... :-)

    The point is not that *symrefs* are inherently bad. The point is that
    turning data into variable names can cause huge, nightmarish maintenance
    problems. Even though your code doesn't have any symbolic references,
    it can still cause all the same maintenance problems... and it's so much
    uglier than just using symrefs in the first place!
    > while(my($k,$v) = each %::){
    > next unless($k =~ /^$name$/);
    > local *sym = $v;
    > print join("\n",@main::sym),"\n";
    > }
    For that matter, you can set the values by munging the symbol table:

    use strict;
    my $name = 'foo';

    $::{$name} = [1,2,3]; # LHS is a glob
    print "@{ $::{$name} }\n";

    no strict 'vars';
    print "@foo\n";

    But why use the symbol table at all? That's more dangerous than using
    a regular hash, and more awkward than using the symbolic references.

    --
    Steve
    Steve Grazzini Guest

  15. #14

    Default Re: How do you dynamically assign array names?

    On Fri, Nov 14, 2003 at 01:24:53PM -0800, david wrote:
    > David wrote:
    >>> this normally can't be done cleanly and is generally not recommanded
    >>> given there are other ways to accomplish bascially the same thing.
    >
    > Steve Grazzini wrote:
    >> But why use the symbol table at all? That's more dangerous than using
    >> a regular hash, and more awkward than using the symbolic references.
    >
    > didn't i already mention that? :-)
    Yeah...

    There's just a long tradition of telling people how to use eval() and %::
    to get strict-safe-symrefs, and an equally long tradition of smacking whomever
    does it. :-)

    --
    Steve
    Steve Grazzini Guest

  16. #15

    Default Re: How do you dynamically assign array names?

    David wrote:
    >> this normally can't be done cleanly and is generally not recommanded
    >> given there are other ways to accomplish bascially the same thing.
    Steve Grazzini wrote:
    >
    > But why use the symbol table at all? That's more dangerous than using
    > a regular hash, and more awkward than using the symbolic references.
    >
    didn't i already mention that? :-)

    david
    --
    $_='015001450154015401570040016701570162015401440'
    ,*,=*|=*_,split+local$";map{~$_&1&&{$,<<=1,$#.=qq~
    /63968e72w28@_[$_..$||3])=>~}}0..s,.,,g-01;*_=*#,s
    [[s/eval+w/.`9`/e]]n\\xng.print+eval(eval"qq`$_`")
    David Guest

  17. #16

    Default Re: How do you dynamically assign array names?

    Steve Grazzini wrote:
    >
    > On Fri, Nov 14, 2003 at 12:25:41PM -0800, david wrote:
    > > Douglas Houston wrote:
    > >>
    > >> I am trying to initialize a dynamically-named array
    > >
    > > this normally can't be done cleanly and is generally not recommanded given
    > > there are other ways to accomplish bascially the same thing. but if you are
    > > here to see if it can be done at all, you might want to try something like:
    > >
    > > #!/usr/bin/perl -w
    > > use strict;
    > >
    > > my $name = shift;
    > >
    > > eval <<CODE;
    > > no strict;
    > > @ $name=1..3;
    > > print "\$_\\n" for(@ $name);
    > > CODE
    >
    > Sigh... :-)
    >
    > The point is not that *symrefs* are inherently bad. The point is that
    > turning data into variable names can cause huge, nightmarish maintenance
    > problems. Even though your code doesn't have any symbolic references,
    > it can still cause all the same maintenance problems... and it's so much
    > uglier than just using symrefs in the first place!
    Thanks Steve. I agree

    There's nothing wrong with 'pass by name' code parameters
    as such. Algol 60 used to do it as a matter of course, but guess why
    it was dropped? For the same reason that "use strict 'refs'"
    prohibits it.

    Rob


    Rob Dixon Guest

  18. #17

    Default Localization problems - Re: How do you dynamically assign array names?


    On Friday, Nov 14, 2003, at 09:07 US/Pacific, Wiggins d Anconia wrote:
    >> Douglas Houston [mailto:douglas@davapc1.bioch.dundee.ac.uk]
    >> :
    >> : WHY do I need to explain why I want to do this?
    >>
    >> Because no one wants to give a loaded gun to
    >> someone who hasn't demonstrated a good grasp of
    >> gun safety.
    >
    > That is a very ironic response coming from someone who based on their
    > sig I assume is in the US, going to someone based on their address
    > appears to be in the UK... who'd a thunk it...
    p0: having been a card carrying member of the
    Haverfordwest Pistol Club, dyfed wales, allow me
    to underscore the importance of firearm safety
    in both the USA and the UK, and that contrary
    to some failures to comprehend, the reasons actually
    are independent of Nation of Origin, passport,
    gene pool number, etc, etc, etc. So when we plan
    to have these moments, remember what Uncle Drieux would say:

    Don't Make ME stop this armoured column and come back there...

    that having been said, let us return to the topic.

    p1: the messy bit in all of this is the OP's initial
    assertion

    "I am trying to initialize a dynamically-named array"

    and provided an illustration that makes us all
    jump into the slit trenches screaming

    PSYCHO ALERT!!!

    And some of us because

    a. we did that to ourselves
    b. we had to UnDO that from someone else

    at which point we arrive at the counter question:

    "WHY do I need to explain why I want to do this?
    There certainly isn't a good reason to do it with
    the test code I posted. If there's NEVER a good
    reason, what are the alternatives?"

    And that drives us back to the basic problem,

    What exactly ARE you trying to solve here?

    At one end of the issue is the question of getting
    command line arguments IN,

    cf perldoc GetOpt::Long
    # because sooner or later you will need the --WingDingDing
    # types of command line options

    Then there is that other type of Issue with how
    to do configuration files, and getting stuff in
    from a config file

    cf:
    <http://www.wetware.com/drieux/PR/blog2/Code/200311.html#id3151675135>
    as one of several problems.

    then there are the possible issues with using anonymouse arrays,
    hashes, subs, and the general issues of referencing and dereferencing..

    So yeah, it would sorta help us help you with what Exactly IS one
    really trying to do....

    p3: and while we are wandering out the door,
    try to remember boys and girls, that from
    San Francisco and Hawai'i one has to go
    to the wild wild east to find 'cowboys',
    so let's Put the Six Guns away and get
    back on the Big Bus....

    ciao
    drieux

    ---

    Drieux Guest

  19. #18

    Default Re: How do you dynamically assign array names?

    >>>>> "Charles" == Charles K Clarkson <cclarkson@htcomp.net> writes:

    Charles> : WHY do I need to explain why I want to do this?

    Charles> Because no one wants to give a loaded gun to
    Charles> someone who hasn't demonstrated a good grasp of
    Charles> gun safety.

    Well said!

    It's like you've asked "How do I remove this screw with a hammer?"

    You're going to get a lot of strange looks, and a bunch of "don't do
    that", and a few people will hand you a screwdriver instead.

    You don't get to ask the question blindly. We're watching out
    for your actual intent and continued success.

    --
    Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
    <merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
    Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
    See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
    Randal L. Schwartz Guest

  20. #19

    Default Re: How do you dynamically assign array names?

    Douglas Houston wrote:
    > On Fri, 14 Nov 2003, Jeff 'japhy' Pinyan wrote:
    >
    > > On Nov 14, Douglas Houston said:
    > >
    > > >I am trying to initialize a dynamically-named array,
    > >
    > > You need to explain WHY you want to do this. There doesn't seem to me to
    > > be a good reason. Use a hash of array references. Don't turn off strict.
    > >
    >
    > WHY do I need to explain why I want to do this?
    Because you are asking people to take valuable time to help you.

    Joseph

    R. Joseph Newton Guest

  21. #20

    Default Re: How do you dynamically assign array names? [slightly OT: enabling folly]

    Wiggins d Anconia wrote:
    > > Douglas Houston [mailto:douglas@davapc1.bioch.dundee.ac.uk]
    > > :
    > > : WHY do I need to explain why I want to do this?
    > >
    > > Because no one wants to give a loaded gun to
    > > someone who hasn't demonstrated a good grasp of
    > > gun safety.
    > >
    > >
    >
    > That is a very ironic response coming from someone who based on their
    > sig I assume is in the US, going to someone based on their address
    > appears to be in the UK... who'd a thunk it...
    Yeah. Just wish the same hesitancy was true in the converse. Lots of
    loaded guns, each equuipped with its own bio-bot, were recently placed in
    the hands of folks who clearly lacked any grasp of gun safety, or much
    else. Cheers to the UK and its top lapdog! I think a lot of Anglophones
    on either side of the river have reason to feel shame.

    Joseph

    R. Joseph Newton Guest

Posting Permissions

  • You may not post new threads
  • You may post replies
  • You may not post attachments
  • You may not edit your posts

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139