On Thu, Dec 11, 2003 at 05:53:27PM +0100, paul POULAIN wrote: > I've a MARC::Record I want to parse to change something in every > subfield value (something like uc() every value). How to do this ? (I > don't need to keep the original record). > what kind of magic foreach ? could do that ?
Well, it turns out this isn't drop dead simple, but it's also not a common thing to want to do. Without violating our object encapsulation (which is easy in Perl), here's how I would uppercase all the fields > 010. Assuming you've got your existing MARC::Record object in $oldRecord. ## create an empty record object to populate my $newRecord = MARC::Record->new(); # go through each field in the existing record foreach my $oldField ( $oldRecord->fields() ) { # just reproduce tags < 010 in our new record if ( $oldField->tag() < 10 ) { $newRecord->append_fields( $oldField ); next(); } # store our new subfield data in this list my @newSubfields = (); # go through each subfield code/data pair foreach my $pair ( $oldField->subfields() ) { # upper case the data portion and store push( @newSubfields, $pair->[0], uc($pair->[1]) ); } # add the new field to our new record my $newField = MARC::Field->new( $oldField->tag(), $oldField->indicator(1), $oldField->indicator(2), @newSubfields ); $newRecord->append_fields( $newField ); } Things could be easier if the subfields() just returned a list instead of a list of array refs. I'm guessin this was done because if it returned a list the temptation to do %subfields = $r->subfields() would be too great, which would cause problems with repeating subfields. //Ed