Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re^4: Nested Data Structures, OOP

by programmer.perl (Beadle)
on Jul 23, 2012 at 14:18 UTC ( #983177=note: print w/ replies, xml ) Need Help??


in reply to Re^3: Nested Data Structures, OOP
in thread Nested Data Structures, OOP

Yes, I made some simple mistakes, the reason was that I was confused on complex data structures. Now, I changed:

print "Enter the student's course(s) "; $self->{"Course(s)"}=[<STDIN>]

to

print "Enter the student's course(s) delimiting them with a comma (,) "; chomp(my $cour = <STDIN>); $cour =~ s/\s+//g; my @cour = split(",", $cour); chomp($self->{"Course(s)"}->{"cour"}=[@cour]);
-----------------------------------

I renewed the push() method:

sub add_courses { my $self = shift; my $courses = shift; # $courses = ["C++", "Java"]; my $num = @{$courses}; for ($i=0; $i<$num; $i++) { push @{$self->{'Course(s)'}->{'cour'}}, $courses->[$i]; }

But, I'm having trouble with a deleting the element of an array, ofcourse :), here I'm attaching the output (error in the last line, if you see there are two commas), it seems that element is not being deleted, instead it's undefined. How to delete the element? I tried look into perldoc but I couldn't find another functions except 'delete' and 'undef'. Here in perldoc about 'delete' : WARNING: Calling delete on array values is deprecated and likely to be removed in a future version of Perl.

Output of program:

Here are the statistics for the Sino. Address: kk ID: kk Major: jj Start_Date: kk Tuition: kk Course(s): Chem, Bio, Maths, C++, Java After dropping: Chem, Bio, Maths, , Java

Code of program and module:

package Student3; sub new { my $class = shift; my $ref = {}; # Anonymous hash bless($ref, $class); return $ref; } sub set_student { my $self = shift; print "Enter the student's name "; chomp($self->{"Name"}=<STDIN>); print "Enter the student's major "; chomp($self->{"Major"}=<STDIN>); print "Enter the student's course(s) delimiting them with a comma (,) "; chomp(my $cour = <STDIN>); $cour =~ s/\s+//g; my @cour = split(",", $cour); chomp($self->{"Course(s)"}->{"cour"}=[@cour]); <...continues here...> } sub show_student { my $self = shift; print "Here are the statistics for the ", $self->{"Name"}, ".\n"; foreach $key (sort(keys %$self)) { if ($self->{$key} ne $self->{"Course(s)"}) { printf "%s: %s\n", $key, $self->{$key} unless $self->{$key} eq $self->{"Name"}; } } print "Course(s): ", join (", ", @{$self->{'Course(s)'}->{'cour'}}), "\n"; } sub add_courses { my $self = shift; my $courses = shift; my $num = @{$courses}; for ($i=0; $i<$num; $i++) { push @{$self->{'Course(s)'}->{'cour'}}, $courses->[$i]; } } sub drop_courses { my $self=shift; my $del_cour = shift; # $del_cour = ["Java"]; my $num = @{$del_cour}; if ($num == 1) { foreach $k (@{$self->{'Course(s)'}->{'cour'}}) { if ($k eq $del_cour->[0]) { $k=""; } } } print "After dropping: ", join (", ", @{$self->{'Course(s)'}->{'cour'}}), "\n"; } 1;

The code of a program

#!/usr/bin/perl -w use Student3; use warnings; use strict; my $student1 = Student3->new; $student1->set_student; $student1->show_student; $student1->add_courses(["C++", "Java"]); $student1->show_student; $student1->drop_courses(["C++"]);


Comment on Re^4: Nested Data Structures, OOP
Select or Download Code
Re^5: Nested Data Structures, OOP
by kcott (Abbot) on Jul 24, 2012 at 00:07 UTC

    It's good to see you're paying attention to deprecation warnings.

    You can use the splice function to remove elements from an array. Here's an example:

    $ perl -Mstrict -Mwarnings -E ' my @x = qw{a b c}; say "@x"; splice @x, 1, 1; say "@x"; ' a b c a c

    If you know the value you want to delete but not the array index of that value, grep may be a better option:

    $ perl -Mstrict -Mwarnings -E ' my @x = qw{a b c}; say "@x"; @x = grep { $_ ne q{b} } @x; say "@x"; ' a b c a c

    Also, an empty list will not add elements to the array, e.g.

    $ perl -Mstrict -Mwarnings -E ' my @x = ( qw{a}, (), qw{c} ); say "@x"; ' a c

    You might use this feature in, for instance, a map statement. This example shows discarding certain values and modifying the remainder:

    $ perl -Mstrict -Mwarnings -E ' my @x = qw{a b c}; say "@x"; @x = map { $_ ne q{b} ? uc : () } @x; say "@x"; ' a b c A C

    You may also find the following modules useful:

    • List::Util - A selection of general-utility list subroutines.
      This is a builtin module; you should have it already.
    • List::MoreUtils - Provide the stuff missing in List::Util.
      This is a CPAN module; you may need to install it.

    -- Ken

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://983177]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (7)
As of 2014-12-27 21:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (177 votes), past polls