in reply to Re^3: Print hash except first value
in thread Print hash except first value

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

Replies are listed 'Best First'.
Re^5: Print hash except first value
by ikegami (Patriarch) on Dec 20, 2008 at 22:36 UTC
    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.

      thank you. that does exactly what i need.
Re^5: Print hash except first value
by jwkrahn (Abbot) on Dec 21, 2008 at 03:52 UTC
    $ 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
      Hi,
      In relation to my post above, i would like to email myself with the full list, and each other person a modified list (without their name/number). If i create a hash of names and email addresses, and say, i wanted to use sendmail, could anyone show me an implementation, that sets the "To: xxx" header with the email from a hash and the Content to the modified list? I have example code that uses sendmail here:
      my $sendmail = "/usr/sbin/sendmail -t"; my $reply_to = "Reply-to: foo\@bar.com\n"; my $subject = "Subject: Confirmation of your submission\n"; my $content = "Thanks for your submission."; my $to = "bar\@foo.com\n"; my $send_to = "To: ". $to; open(SENDMAIL, "|$sendmail") or die "Cannot open $sendmail: $!"; print SENDMAIL $reply_to; print SENDMAIL $subject; print SENDMAIL $send_to; print SENDMAIL "Content-type: text/plain\n\n"; print SENDMAIL $content; close(SENDMAIL);

      Maybe Net::SMTP or another module maybe better, but i am all for the simple approach.

      TIA Joe.

        my $to = $emails{$name};
        my $content = join '', map { "$names[$_]\n" } grep { $_ != $skip } 0..$#names;

        You should be using MIME::Lite or something

Re^5: Print hash except first value
by swampyankee (Parson) on Dec 21, 2008 at 17:38 UTC

    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