• Publicidad

Buscar y reemplazar texto en un array

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Buscar y reemplazar texto en un array

Notapor tammyrey » 2009-04-20 04:54 @246

Tengo un array @newresults que contiene los datos de un registro. En algunos campos aparece <span class="term"> blablabla </span> y yo quiero eliminar esas etiquetas.

Intento hacerlo con expresiones regulares... pero no consigo que funcione. He puesto lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach (@newresults) {
        my $elimino =~ s/<span class=\"term\">//g;
        $elimino =~ s/<\/span>//g;
        next;
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿¿¿Alguien me puede ayudar, por favor??? ¡¡Gracias!!
tammyrey
Perlero nuevo
Perlero nuevo
 
Mensajes: 22
Registrado: 2009-04-15 09:30 @437

Publicidad

Notapor explorer » 2009-04-20 06:25 @309

Quizás sea así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach (@newresults) {
    s/<span class="term">\s*//g;
    s/\s*<\/span>//g;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


He añadido \s* para que elimine también posibles espacios en blanco.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor tammyrey » 2009-04-20 06:35 @315

Bueno.. te falta escapar las comillas de "term" :P

Como lo que quiero hacer es coger cada campo del array... lo he cambiado por lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $linea (@newresults) {      
        $linea =~ s/<span class=\"term\">//g;
        $linea =~ s/<\/span>//g;               
        next;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero nada... además de que el contenido de $linea es el array entero, y no línea a línea :?
tammyrey
Perlero nuevo
Perlero nuevo
 
Mensajes: 22
Registrado: 2009-04-15 09:30 @437

Notapor explorer » 2009-04-20 07:16 @344

No he escapado las comillas porque no es necesario hacerlo.

Y tenías que haber probado mi ejemplo, porque sí funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my @newresults = (
    'Este es un ejemplo 1 de texto con marcas <span class="term">span</span> dentro de otro mayor.',
    'Este es un ejemplo de <span class="term">span</span> con <span class="term">mas marcas</span>.',
    'Este es un ejemplo de texto sin marcas.',
);

foreach (@newresults) {
    s/<span class="term">\s*//g;
    s/\s*<\/span>//g;
}

print join("\n", @newresults), "\n";

__END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Hay que entender que en los bucles, la variable que obtiene el valor de cada elemento del arreglo, en realidad, es un alias a ese elemento, por lo que si modificamos la variable entonces estamos modificando el propio elemento del arreglo.

Otra cosa es que en tu $linea recibas todo el arreglo. Más bien parece que no lees de forma correcta el fichero que quieres tratar, si es que quieres guardar cada línea en cada elemento de ese arreglo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor tammyrey » 2009-04-20 08:34 @398

Jejejé. Probar tu ejemplo es lo primero que he hecho ;) pero no me ha funcionado por algún extraño motivo....

Lo de las comillas... perdona mi ignorancia... yo creí que era necesario :cry:

He intentado coger como ejemplo algo que hace un poco más arriba:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach (@newresults) {
                        my $clean = $_->{isbn} or next;
                        unless (
                                $clean =~ /\b(\d{13})\b/ or
                                $clean =~ /\b(\d{10})\b/ or
                                $clean =~ /\b(\d{9}X)\b/i
                        ) {
                                next;
                        }
                        $_ ->{'clean_isbn'} = $1;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡¡pero nada!! No consigo que funcione de ninguna manera. Bueno, voy a ponerte en situación :wink:

La declaración del array es la siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @newresults = searchResults( $query_desc,$hits,$results_per_page,$offset,$scan,@{$results_hashref->{$server}->{"RECORDS"}});
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Te muestro un ejemplo de lo que contiene el array:

Código: Seleccionar todo
$VAR1 = {
           'damagedcount' => 0,
           'illus' => ' : il.',
           'biblioitemnumber' => '17',
           'wthdrawn' => '0',
           'intransitcount' => 0,
           'items_count' => 1,
           'orderedcount' => 0,
           'notforloan' => '0',
           'isbn' => '8445315358',
           'othercount' => 0,
           'itemnumber' => '5',
           'descriptionmaterialtype' => 'Libros',
           'itemlost' => '2009-04-14 | 0 | 0 | 0',
           'barcode' => '5',
           'description' => undef,
           'imageurlmaterialtype' => '/opac-tmpl/prog/itemtypeimg/icons/book.png',
           'items.cn_source' => 'udc',
           'result_number' => 4,
           'toggle' => 1,
           'datelastseen' => '2009-04-14',
          'title' => "Campa\x{f1}a 1989",
           'publicationyear' => '1995',
           'pages' => '287 p.',
           'searchhighlightblob' => " ...  / Xunta de <span class=\"term\">Galicia</span>, Direcci\x{f3}n Xeral do Patrimonio Hist\x{f3}rico e Documental ... Arqueolox\x{ed}a (<span class=\"term\">Galicia</span>. Xunta) ... -<span class=\"term\">Galicia</span> ... -<span class=\"term\">Galicia</span> ... -<span class=\"term\">Galicia</span> ... <span class=\"term\">Galicia</span> ... ",
           'place' => '[Santiago de Compostela]',
           'homebranch' => 'LAXE1',
           'author' => undef,
           'wthdrawncount' => 0,
           'size' => ' ; 24 cm',
           'onloancount' => 0,
           'seriestitle' => "Arqueolox\x{ed}a (Galicia. Xunta)",
           'biblionumber' => '17',
           'holdingbranch' => 'LAXE1',
           'onloan_items_loop' => [],
           'damaged' => '0',
           'publishercode' => " : Direcci\x{f3}n Xeral do Patrimonio Hist\x{f3}rico e Documental",
           'other_items_loop' => [],
           'availablecount' => 1,
           'available_items_loop' => [
                                       {
                                         'imageurl' => '/opac-tmpl/prog/itemtypeimg/',
                                         'count' => 1,
                                         'location' => undef,
                                         'itemcallnumber' => undef,
                                        'branchname' => 'B.P.M. de Laxe'
                                       }
                                     ],
           'volume' => ' ; 3',
           'itemlostcount' => 0,
           'author_nospan' => undef,
           'title_nospan' => "Campa\x{f1}a 1989",
           'materialtype' => '1',
           'subtitle' => undef,
           'dateaccessioned' => '2009-04-14',
           'amazonisbn' => '8445315358',
           'notes' => undef
         };


Los campos que muestro son: title, author, pages, publishercode, place, publicationyear, isbn, descriptionmaterialtype, serialstitle, size, notes.

He observado que el tema del span aparece en la función searchResults() en varios sitios:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if (C4::Context->preference("OpacHighlightedWords")){
            my $searchhighlightblob;
            for my $highlight_field ( $marcrecord->fields ) {
   
    # FIXME: need to skip title, subtitle, author, etc., as they are handled below
                next if $highlight_field->tag() =~ /(^00)/;    # skip fixed fields
                for my $subfield ($highlight_field->subfields()) {
                    my $match;
                    next if $subfield->[0] eq '9';
                    my $field = $subfield->[1];
                    for my $term ( keys %$span_terms_hashref ) {
                        if ( ( $field =~ /$term/i ) && (( length($term) > 3 ) || ($field =~ / $term /i)) ) {
                            $field =~ s/$term/<span class=\"term\">$&<\/span>/gi;
                        $match++;
                        }
                    }
                    $searchhighlightblob .= $field . " ... " if $match;
                }
   
            }
            $searchhighlightblob = ' ... '.$searchhighlightblob if $searchhighlightblob;
            $oldbiblio->{'searchhighlightblob'} = $searchhighlightblob;
        }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y aquí:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# Add search-term highlighting to the title, subtitle, etc. fields
        for my $term ( keys %$span_terms_hashref ) {
            my $old_term = $term;
            if ( length($term) > 3 ) {
                $term =~ s/(.*=|\)|\(|\+|\.|\?|\[|\]|\\|\*)//g;
                                foreach(qw(title subtitle author publishercode place pages notes size)) {
                        $oldbiblio->{$_} =~ s/$term/<span class=\"term\">$&<\/span>/gi;
                                }
            }
        }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es probable que en uno o en ambos de estos sitios sea donde le añade la etiqueta span, ¿no? Es lo que yo veo.... sustituye $term por <span class="term"> $term </span>.

Así que algo así, pero al revés, debería funcionar...

¡¡Un saludo!!! ¡Y gracias! :wink:
tammyrey
Perlero nuevo
Perlero nuevo
 
Mensajes: 22
Registrado: 2009-04-15 09:30 @437

Notapor explorer » 2009-04-20 17:56 @789

searchResults() no devuelve un arreglo... yo lo que veo que devuelve es una referencia a un diccionario (hash).

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my $hash_ref = {
           'damagedcount' => 0,
           'illus' => ' : il.',
           'biblioitemnumber' => '17',
           'wthdrawn' => '0',
           'intransitcount' => 0,
           'items_count' => 1,
           'orderedcount' => 0,
           'notforloan' => '0',
           'isbn' => '8445315358',
           'othercount' => 0,
           'itemnumber' => '5',
           'descriptionmaterialtype' => 'Libros',
           'itemlost' => '2009-04-14 | 0 | 0 | 0',
           'barcode' => '5',
           'description' => undef,
           'imageurlmaterialtype' => '/opac-tmpl/prog/itemtypeimg/icons/book.png',
           'items.cn_source' => 'udc',
           'result_number' => 4,
           'toggle' => 1,
           'datelastseen' => '2009-04-14',
          'title' => "Campa\x{f1}a 1989",
           'publicationyear' => '1995',
           'pages' => '287 p.',
           'searchhighlightblob' => " ...  / Xunta de <span class=\"term\">Galicia</span>, Direcci\x{f3}n Xeral do Patrimonio Hist\x{f3}rico e Documental ... Arqueolox\x{ed}a (<span class=\"term\">Galicia</span>. Xunta) ... -<span class=\"term\">Galicia</span> ... -<span class=\"term\">Galicia</span> ... -<span class=\"term\">Galicia</span> ... <span class=\"term\">Galicia</span> ... ",
           'place' => '[Santiago de Compostela]',
           'homebranch' => 'LAXE1',
           'author' => undef,
           'wthdrawncount' => 0,
           'size' => ' ; 24 cm',
           'onloancount' => 0,
           'seriestitle' => "Arqueolox\x{ed}a (Galicia. Xunta)",
           'biblionumber' => '17',
           'holdingbranch' => 'LAXE1',
           'onloan_items_loop' => [],
           'damaged' => '0',
           'publishercode' => " : Direcci\x{f3}n Xeral do Patrimonio Hist\x{f3}rico e Documental",
           'other_items_loop' => [],
           'availablecount' => 1,
           'available_items_loop' => [
                                       {
                                         'imageurl' => '/opac-tmpl/prog/itemtypeimg/',
                                         'count' => 1,
                                         'location' => undef,
                                         'itemcallnumber' => undef,
                                        'branchname' => 'B.P.M. de Laxe'
                                       }
                                     ],
           'volume' => ' ; 3',
           'itemlostcount' => 0,
           'author_nospan' => undef,
           'title_nospan' => "Campa\x{f1}a 1989",
           'materialtype' => '1',
           'subtitle' => undef,
           'dateaccessioned' => '2009-04-14',
           'amazonisbn' => '8445315358',
           'notes' => undef
         };

## Extracció de los valores interesantes
my @valores_interesantes = qw(
    title author pages publishercode place publicationyear isbn
    descriptionmaterialtype serialstitle size notes
);

foreach my $clave ( @valores_interesantes ) {
    my $valor = $hash_ref->{$clave};
    $valor = (defined $valor) ? $valor : '';

    print "$clave => $valor\n";
}

## Extracción y filtrado de las marcas
my $searchhighlightblob = $hash_ref->{searchhighlightblob};

print "Antes: [$searchhighlightblob]\n";

$searchhighlightblob =~ s/<span class="term">\s*//g;
$searchhighlightblob =~ s/\s*<\/span>//g;

print "Despues: [$searchhighlightblob]\n";

__END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Sale:
Código: Seleccionar todo
title => Campaña 1989
author =>
pages => 287 p.
publishercode =>  : Dirección Xeral do Patrimonio Histórico e Documental
place => [Santiago de Compostela]
publicationyear => 1995
isbn => 8445315358
descriptionmaterialtype => Libros
serialstitle =>
size =>  ; 24 cm
notes =>
Antes: [ ...  / Xunta de <span class="term">Galicia</span>, Dirección Xeral do Patrimonio Histórico e Documental ... Arqueoloxía (<span class="term">Galicia</span>. Xunta) ... -<span class="term">Galicia</span> ... -<span class="term">Galicia</span> ... -<span class="term">Galicia</span> ... <span class="term">Galicia</span> ... ]
Despues: [ ...  / Xunta de Galicia, Dirección Xeral do Patrimonio Histórico e Documental ... Arqueoloxía (Galicia. Xunta) ... -Galicia ... -Galicia ... -Galicia ... Galicia ... ]
(con codificación iso-8859-1).

Y sí que se ve en el código que se agregan las marcas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$field =~ s/$term/<span class=\"term\">$&<\/span>/gi;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$oldbiblio->{$_} =~ s/$term/<span class=\"term\">$&<\/span>/gi;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor tammyrey » 2009-04-21 03:45 @198

Claro... en la función searchResults usan un hash. Pero yo, con lo único que cuento es con un array @newresults, que contiene los datos de los registros, y no encuentro la forma de crear un hash con los datos del array... o algo así... no sé qué hacer... estoy muy perdida :cry:
tammyrey
Perlero nuevo
Perlero nuevo
 
Mensajes: 22
Registrado: 2009-04-15 09:30 @437

¡¡Solucionado!!

Notapor tammyrey » 2009-04-21 04:16 @219

Lo he estado mirando con un compañero y ha quedado solucionado de la siguiente manera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @valores = (qw(title subtitle author publishercode place pages notes size));

foreach (@newresults) {
        foreach my $clave ( @valores ) {
                my $clean = $_->{$clave} or next;
                $clean =~ s/<span class="term">/ /gi;
                $clean =~ s/<\/span>/ /gi;

                $_ ->{$clave} = $clean;
        }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡¡Gracias por todo!!! :wink:
tammyrey
Perlero nuevo
Perlero nuevo
 
Mensajes: 22
Registrado: 2009-04-15 09:30 @437

Notapor explorer » 2009-04-21 04:54 @246

Haría falta algo más de código para determinar cómo se hace el almacenamiento de datos.

Por ejemplo, repasando este hilo pones
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach (@newresults) {
    my $clean = $_->{isbn} or next;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
con lo que entonces se confirma que @newresults sí que es un arreglo de elementos, conteniendo cada uno de ellos una referencia a un diccionario. En este código mira como está accediendo al valor de la clave 'isbn' para saber si hay algo, o pasar al siguiente elemento.

Bueno, pues una vez que sabemos eso, ahora queda por saber qué quieres hacer con todos ellos.

En tu comentario pones que quieres hacer un diccionario con los datos del arreglo. Creo que en realidad quieres decir que quieres hacer un diccionario con los datos de cada elemento del arreglo, dentro de un bucle.

Podrías, dentro del bucle que recorra @newresults, algo como esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $dato (@newresults) {
    my %hash = %{$dato};

    # ... aquí trabajas con %hash
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Actualización: este mensaje lo envié después del tuyo, en respuesta al anterior.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2009-04-23 06:39 @319

Creo que queda un poco mejor así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @valores = qw(
    title subtitle author publishercode
    place pages    notes  size
);

for my $resultado (@newresults) {
    for my $clave (@valores   ) {
        my $clean =  $resultado->{$clave} or next;
           $clean =~ s/<span class="term">/ /gi;
           $clean =~ s/<\/span>/ /gi;

        $resultado->{$clave} = $clean;
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados