They iterate over the (keys of the) hash, skipping the first one
Update: ...which I now see isn't what you asked. In fact, I don't know what you are trying to do. I don't see what the hash has to do with anything. As best as I can tell, you want a variation of
for my $skip (0..$#names) {
print("-------\n");
for my $i (0..$#names) {
next if $i == $skip;
my $n = $names[$i];
print("$n, $hash{$n}\n");
}
print("* Note removal of element $skip\n");
print("\n");
}
| [reply] [d/l] |
What i want to do is:
1. Given the names in the array, assign a random 4 digit number to each one (which i could do with a hash).
2. Print out that full list of names and numbers
3. Print out that list of names and numbers but without the first element Greg
4. Print out that list of names and numbers but without the second element Caroline
5. Do that for the whole array.
Eventually, i will get round to emailing each person in the array, a list without the their name and number in, so as they dont know what it is.
Hope that is clearer
| [reply] |
That's what my update does minus step 2. Just add
for my $n (@names) {
print("$n, $hash{$n}\n");
}
%hash needs a better name. I don't know what the number represents, so I can't help. | [reply] [d/l] [select] |
$ perl -e'
my $range = 8_999;
my $min = 1_000;
my @names = qw( Greg Caroline Joe Dom Mary );
my %hash;
for my $n ( @names ) {
my $r = $min + int rand $range;
$hash{ $n } = $r;
}
print map( "$_: $hash{$_}\n", @names ), "\n";
for my $i ( 0 .. $#names ) {
my @temp = @names;
splice @temp, $i, 1;
print map( "$_: $hash{$_}\n", @temp ), "\n";
}
'
Greg: 7719
Caroline: 8762
Joe: 2774
Dom: 2003
Mary: 8821
Caroline: 8762
Joe: 2774
Dom: 2003
Mary: 8821
Greg: 7719
Joe: 2774
Dom: 2003
Mary: 8821
Greg: 7719
Caroline: 8762
Dom: 2003
Mary: 8821
Greg: 7719
Caroline: 8762
Joe: 2774
Mary: 8821
Greg: 7719
Caroline: 8762
Joe: 2774
Dom: 2003
| [reply] [d/l] |
Remember "first element," "second element," etc are meaningless for hashes. You could use an array, which would maintain order, with the array indexed by id number (and having lots of elements that are undefined, potentially having several thousand empty array elements). Since your list is fairly small -- only 105-1 elements -- this is not likely to be too onerous. You could then store the (sparse) array as {id,name} pairs, with a convenient separator. You could, similarly, store them in a hash indexed by id number (just give yourself an id number of '0000' and Caroline one of '0001', so sort(keys(%hash)) returns these two names first and second).
Revising your specifications somewhat (and making them more general), what you seem to require is to generate a list of names and an associated unique numerical identifier, and then be able to print the list with one or more specific names omitted. For this, a tied hash is probably the optimum solution, as it will permit you to keep a permanent, and easily maintained, list.
Information about American English usage here and here. Floating point issues? Please read this before posting. — emc
| [reply] |