La función de substr() en Perl

En el lenguaje de programación Perl tiene integrada la función de substr(). Esta función se utiliza cuando se trabaja con cadenas. Con esta función se puede obtener parte de la cadena, o de reemplazar parte de una cadena con otra cadena de caracteres.

He aquí un ejemplo de cómo una parte de la cadena:

▶ Run
#!/usr/bin/perl

my $str = 'Hello, world!';

print "'" . substr($str, 7, 5) . "'";

Este programa mostrará en pantalla el texto 'world'. La llamada a la función substr($str, 7, 5) dice que es necesario sacar de la cadena de $str cinco caracteres a partir de la séptima posición. De este modo, la el valor de la $str no cambia.

Cuando se utiliza la función substr() con cuatro argumentos se produce un cambio en el valor de la variable. He aquí un ejemplo del uso de substr() para el reemplazo:

▶ Run
#!/usr/bin/perl

my $str = 'Hello, world!';

print "'" . substr($str, 7, 5, 'you') . "'\n";
print $str;

La salida del programa:

'world'
Hello, you!

El valor devuelto cuando se llama a substr($str, 7, 5, 'you') de la misma como cuando se llama a substr($str, 7, 5), pero la llamada con cuatro argumentos de la otra y se ha cambiado el valor de la variable. La palabra world ha sido reemplazado por el you. Ten en atención, que la sustitución ha pasado correctamente, incluso a pesar de que en la inicial de la palabra y en la nueva palabra de un número diferente de de letras.

Los argumentos

my $str1 = substr($str, $offset);
my $str2 = substr($str, $offset, $length);
my $str3 = substr($str, $offset, $replacement);

La función de substr() debe especificar dos, tres o cuatro argumentos.

Si intenta utilizar la característica de substr() sin argumentos, o con una el argumento, lo que se producirá un error:

Not enough arguments for substr at script.pl line 3, near "substr()"
Execution of script.pl aborted due to compilation errors.

Si utiliza dos argumentos substr($str, $offset) , la función devuelve el todos los caracteres de la cadena $str a partir de un carácter en la posición de la $offset y hasta el final de la línea.

Cuando se utiliza tres argumentos substr($str, $offset, $length) , la función devuelve el $length caracteres de la cadena $str a partir de un carácter en la posición de la $offset.

Cuando se utiliza substr() con dos o tres argumentos, el valor predeterminado es la cadena no se cambia.

En cuatro argumentos substr($str, $offset, $replacement)función devuelve lo mismo que en el caso de tres de los argumentos, pero, adicionalmente sustituye en la cadena de valor recibido en $replacement.

El valor devuelto

La función de substr() puede devolver o undef, o una cadena.

undef se devuelve en caso de tratar de sacar un elemento de la cadena de según el índice que más de la longitud de la cadena. He aquí un ejemplo de un programa que devuelve undef:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $str = 'Hello, world!';
my $str1 = substr($str, 10000);

warn Dumper $str1;

En el caso de que en el código del programa sería use warnings;, el programa todavía adicionalmente ha sacado a la pantalla de advertencia:

substr outside of string at script.pl line 8.

Los valores negativos $offset

La función de substr() permite especificar los valores negativos para el segundo argumento. Programa de ejemplo:

▶ Run
#!/usr/bin/perl

my $str = 'Hello, world!';
print substr($str, -3);

En la pantalla aparecerá el texto ld! — es los últimos tres caracteres de la cadena de Hello, world!.

Negativo el segundo argumento indica que la posición se considera desde el final de la línea.

La entrada substr($str, -3) es completamente similar a la de los substr($str, -3, 3).

Los valores negativos $length

El tercer argumento puede ser negativo. He aquí un ejemplo del trabajo:

▶ Run
#!/usr/bin/perl

use feature qw(say);

my $str = 'Hello, world!';

say substr($str, 7, -1); # world
say substr($str, 7, -2); # worl
say substr($str, 7, -3); # wor

La documentación oficial

He aquí el resultado del comando perldoc -f substr:

    substr EXPR,OFFSET,LENGTH,REPLACEMENT
    substr EXPR,OFFSET,LENGTH
    substr EXPR,OFFSET
            Extracts a substring out of EXPR and returns it. First character
            is at offset zero. If OFFSET is negative, starts that far back
            from the end of the string. If LENGTH is omitted, returns
            everything through the end of the string. If LENGTH is negative,
            leaves that many characters off the end of the string.

                my $s = "The black cat climbed the green tree";
                my $color  = substr $s, 4, 5;      # black
                my $middle = substr $s, 4, -11;    # black cat climbed the
                my $end    = substr $s, 14;        # climbed the green tree
                my $tail   = substr $s, -4;        # tree
                my $z      = substr $s, -4, 2;     # tr

            You can use the "substr" function as an lvalue, in which case
            EXPR must itself be an lvalue. If you assign something shorter
            than LENGTH, the string will shrink, and if you assign something
            longer than LENGTH, the string will grow to accommodate it. To
            keep the string the same length, you may need to pad or chop
            your value using "sprintf".

            If OFFSET and LENGTH specify a substring that is partly outside
            the string, only the part within the string is returned. If the
            substring is beyond either end of the string, "substr" returns
            the undefined value and produces a warning. When used as an
            lvalue, specifying a substring that is entirely outside the
            string raises an exception. Here's an example showing the
            behavior for boundary cases:

                my $name = 'fred';
                substr($name, 4) = 'dy';         # $name is now 'freddy'
                my $null = substr $name, 6, 2;   # returns "" (no warning)
                my $oops = substr $name, 7;      # returns undef, with warning
                substr($name, 7) = 'gap';        # raises an exception

            An alternative to using "substr" as an lvalue is to specify the
            replacement string as the 4th argument. This allows you to
            replace parts of the EXPR and return what was there before in
            one operation, just as you can with "splice".

                my $s = "The black cat climbed the green tree";
                my $z = substr $s, 14, 7, "jumped from";    # climbed
                # $s is now "The black cat jumped from the green tree"

            Note that the lvalue returned by the three-argument version of
            "substr" acts as a 'magic bullet'; each time it is assigned to,
            it remembers which part of the original string is being
            modified; for example:

                my $x = '1234';
                for (substr($x,1,2)) {
                    $_ = 'a';   print $x,"\n";    # prints 1a4
                    $_ = 'xyz'; print $x,"\n";    # prints 1xyz4
                    $x = '56789';
                    $_ = 'pq';  print $x,"\n";    # prints 5pq9
                }

            With negative offsets, it remembers its position from the end of
            the string when the target string is modified:

                my $x = '1234';
                for (substr($x, -3, 2)) {
                    $_ = 'a';   print $x,"\n";    # prints 1a4, as above
                    $x = 'abcdefg';
                    print $_,"\n";                # prints f
                }

            Prior to Perl version 5.10, the result of using an lvalue
            multiple times was unspecified. Prior to 5.16, the result with
            negative offsets was unspecified.

Temas relacionados

Otros articulos