--- trunk/lib/WebPAC/Input.pm 2007/02/04 15:09:01 799 +++ trunk/lib/WebPAC/Input.pm 2007/05/27 19:10:43 860 @@ -16,11 +16,11 @@ =head1 VERSION -Version 0.17 +Version 0.18 =cut -our $VERSION = '0.17'; +our $VERSION = '0.18'; =head1 SYNOPSIS @@ -286,7 +286,9 @@ # return unless defined($l); # return $l unless ($rec_regex && $f_nr); - warn "-=> $f_nr ## $l\n" if ($debug); + return unless ( defined($l) && defined($f_nr) ); + + warn "-=> $f_nr ## |$l|\n" if ($debug); $log->debug("-=> $f_nr ## $l"); # codepage conversion and recode_regex @@ -299,16 +301,21 @@ my $c = 0; foreach my $r (@{ $rec_regex->{$f_nr} }) { my $old_l = $l; - eval '$l =~ ' . $r; + $log->logconfess("expected regex in ", dump( $r )) unless defined($r->{regex}); + eval '$l =~ ' . $r->{regex}; if ($old_l ne $l) { - $log->debug("REGEX on $f_nr eval \$l =~ $r\n## old l: [$old_l]\n## new l: [$l]"); - warn "*** $r |$old_l| -> |$l|\n" if ($debug); + my $d = "|$old_l| -> |$l| "; # . $r->{regex}; + $d .= ' +' . $r->{line} . ' ' . $r->{file} if defined($r->{line}); + $d .= ' ' . $r->{debug} if defined($r->{debug}); + $log->debug("MODIFY $d"); + warn "*** $d\n" if ($debug); + } $log->error("error applying regex: $r") if ($@); } } - $log->debug("<=- $f_nr ## $l"); + $log->debug("<=- $f_nr ## |$l|"); warn "<=- $f_nr ## $l\n" if ($debug); return $l; }); @@ -512,7 +519,8 @@ my $out = join("\n", map { - my $f = $_ || die "no field"; + my $f = $_; + die "no field in ", dump( $s->{fld} ) unless defined( $f ); my $v = $s->{fld}->{$f} || die "no s->{fld}->{$f}"; $max_fld = $v if ($v > $max_fld); @@ -532,7 +540,7 @@ } $o; - } sort { $a cmp $b } keys %{ $s->{fld} } + } sort { $a <=> $b } keys %{ $s->{fld} } ); $log->debug( sub { dump($s) } ); @@ -551,21 +559,22 @@ return unless $self->{ll_db}; - if ($self->{ll_db}->can('dump_rec')) { + if ($self->{ll_db}->can('dump_ascii')) { return $self->{ll_db}->dump_ascii( $self->{pos} ); } else { return dump( $self->{ll_db}->fetch_rec( $self->{pos} ) ); } } -=head2 modify_record_regexps +=head2 _get_regex -Generate hash with regexpes to be applied using L. +Helper function called which create regexps to be execute on code. - my $regexpes = $input->modify_record_regexps( - 900 => { '^a' => { ' : ' => '^b' } }, - 901 => { '*' => { '^b' => ' ; ' } }, - ); + _get_regex( 900, 'regex:[0-9]+' ,'numbers' ); + _get_regex( 900, '^b', ' : ^b' ); + +It supports perl regexps with C prefix to from value and has +additional logic to skip empty subfields. =cut @@ -582,14 +591,30 @@ $from = '\Q' . $from . '\E'; } if ($sf =~ /^\^/) { + my $need_subfield_data = '*'; # no + # if from is also subfield, require some data in between + # to correctly skip empty subfields + $need_subfield_data = '+' if ($from =~ m/^\\Q\^/); return - 's/\Q'. $sf .'\E([^\^]*?)'. $from .'([^\^]*?)/'. $sf .'$1'. $to .'$2/'; + 's/\Q'. $sf .'\E([^\^]' . $need_subfield_data . '?)'. $from .'([^\^]*?)/'. $sf .'$1'. $to .'$2/'; } else { return 's/'. $from .'/'. $to .'/g'; } } + +=head2 modify_record_regexps + +Generate hash with regexpes to be applied using L. + + my $regexpes = $input->modify_record_regexps( + 900 => { '^a' => { ' : ' => '^b' } }, + 901 => { '*' => { '^b' => ' ; ' } }, + ); + +=cut + sub modify_record_regexps { my $self = shift; my $modify_record = {@_}; @@ -607,10 +632,11 @@ foreach my $from (keys %{ $modify_record->{$f}->{$sf} }) { my $to = $modify_record->{$f}->{$sf}->{$from}; #die "no field?" unless defined($to); - $log->debug("transform: |$from| -> |$to|"); + my $d = "|$from| -> |$to|"; + $log->debug("transform: $d"); my $regex = _get_regex($sf,$from,$to); - push @{ $regexpes->{$f} }, $regex; + push @{ $regexpes->{$f} }, { regex => $regex, debug => $d }; $log->debug("regex: $regex"); } } @@ -671,7 +697,11 @@ $log->debug("transform: |$from| -> |$to|"); my $regex = _get_regex($sf,$from,$to); - push @{ $regexpes->{$f} }, $regex; + push @{ $regexpes->{$f} }, { + regex => $regex, + file => $modify_path, + line => $., + }; $log->debug("regex: $regex"); } }