Funkcja length() w Perl

W języku programowania Perl jest wbudowana funkcja length(). Ta funkcja zwraca długość ciągu znaków, która przekazana argumentem w tej funkcji.

Oto przykład:

▶ Run
#!/usr/bin/perl

print( length('Hello') );

Ten program wypisze na ekran liczba 5. W wierszu 'Hello' pięć znaków.

Argumenty

my $length = length($str);

Jeśli funkcje length() przekazać jeden argument, to funkcja będzie z nim pracować.

Jeśli nie oddać ani jednego argumentu funkcja będzie działać z дефолтной zmiennej $_. Oto przykład (program wyświetli liczbę 4):

▶ Run
#!/usr/bin/perl

$_ = 'asdf';

print( length() );

Jeśli funkcje length() przekazać więcej niż jeden argument, to będzie błąd:

Too many arguments for length at script.pl line 3, near "'a') "
Execution of script.pl aborted due to compilation errors.

Wartość zwracana

Funkcja length() zwraca albo undef, albo dodatnią liczbą całkowitą. Funkcja zwraca undef tylko, jeżeli w niej przekazali undef.

Oto trzy programy, w każdej z nich length() zwraca undef. Wszystkie one są równoznaczne.

▶ Run
#!/usr/bin/perl

use Data::Dumper;

warn Dumper length(undef);
▶ Run
#!/usr/bin/perl

use Data::Dumper;

$_ = undef;

warn Dumper length();
▶ Run
#!/usr/bin/perl

use Data::Dumper;

warn Dumper length();

Unicode

Funkcja length() zwraca liczbę znaków w wierszu, a nie ilość bajtów, ale trzeba aby wiersz został z flagą, który mówi o tym, że w wierszu jest Unicode. Taka flaga pojawia się automatycznie i wierszy opisanych w kodzie jeśli w programie jest use utf8;. Oto program, który zwraca liczbę 7 — to poprawną ilość znaki w tym wierszu:

▶ Run
#!/usr/bin/perl

use utf8;

print( length('АБВГДЕЁ') );

Ale jeśli w programie nie ma use utf8;, to ciąg określonych w programie uważane za sekwencją bajtów i funkcja length() zwraca liczbę bajtów. Oto program który korzysta z tej samej linii co w poprzednim przykładzie, ale ten program wyświetla na ekranie liczbę 14 (w wierszu 7 liter, każda litera zajmuje dwa bajty):

▶ Run
#!/usr/bin/perl

print( length('АБВГДЕЁ') );

Przykłady

Oto program, który pokazuje kilka przykładów funkcji length():

▶ Run
#!/usr/bin/perl

use feature qw(say);

my $arr = [1, 2, 3];
my $hash = { a => 1 };
my $sub = sub { return 1 };

foreach my $var ('12', 12, 0xff, 0b1000, 'S', 'String', $arr, $hash, $sub ) {
    say $var . ' - ' . length($var);
}

Wynik działania tego programu:

12 - 2
12 - 2
255 - 3
8 - 1
S - 1
String - 6
ARRAY(0x561a04e48578) - 21
HASH(0x561a04e60cf8) - 20
CODE(0x561a04e61370) - 20

Funkcja length() zwraca tę samą wartość dla i dla wiersza '12' i liczby 12 (liczba 2). Liczba szesnastkowa 0xff to 255 stałe całkowite w formie dziesiętnej systemu miar i length() zwraca liczbę 3. Dokładnie tak samo działa i liczbę zapisaną w systemie dwójkowym.

Funkcja length() nie można użyć, aby policzyć liczbę elementów w tablicy lub хеше. To jak to zrobić jest opisane na stronach:

Dla ARRAYREF i HASHREF funkcja length() zwraca liczbę znaków w wierszach rodzaju 'ARRAY(0x561a04e48578)'.

Oficjalna dokumentacja

Oto wynik polecenia perldoc -f length:

       length EXPR
       length  Returns the length in characters of the value of EXPR.  If EXPR
               is omitted, returns the length of $_.  If EXPR is undefined,
               returns "undef".

               This function cannot be used on an entire array or hash to find
               out how many elements these have.  For that, use "scalar
               @array" and "scalar keys %hash", respectively.

               Like all Perl character operations, length() normally deals in
               logical characters, not physical bytes.  For how many bytes a
               string encoded as UTF-8 would take up, use
               "length(Encode::encode_utf8(EXPR))" (you'll have to "use
               Encode" first).  See Encode and perlunicode.

Tematy pokrewne

Inne artykuły