/ / Perl-Jak podzielić linię na podstawie długości znaków - perl, split

Perl-Jak podzielić linię na podstawie długości znaków - perl, split

Chcę podzielić linię na podstawie wielu długości znaków i zapisać je w osobnych zmiennych.
Na przykład:$myString = "Mickey 24 USA alive
Tutaj pierwsze 12 znaków to nazwa użytkownika, następne 2 to wiek, następne 23 znaki to kraj, a następne 7 to status.
Czy istnieje sposób, aby je zapisać oddzielnie przy użyciu ich split() lub s///?
Dzięki,

Odpowiedzi:

3 dla odpowiedzi № 1

Użyj dopasowanego wyrażenia regularnego lub substr:

my $myString = "Mickey      24                    USA alive";

if ($myString =~ /(.{12})(.{2})(.{23})(.*)/) {
$name = $1;
$age = $2;
$country = $3;
$status = $4;

print "<$name><$age><$country><$status>";

} else {
warn "line not long enough";
}

Wyjścia:

<Mickey      ><24><                    USA>< alive>

Aby usunąć odstępy ze zmiennych po fakcie, po prostu użyj innego wyrażenia regularnego:

$value =~ s/^s+|s+$//g;

Można to zrobić nawet w jednym wierszu, używając:

s/^s+|s+$//g for ($name, $age, $country, $status);

8 dla odpowiedzi № 2

Rozpakowywanie pól o stałej szerokości odbywa się najprościej i najskuteczniej przy użyciu unpack wbudowana funkcja.

Lubię to

use strict;
use warnings;

my $my_string = "Mickey      24                    USA alive";

my ($username, $age, $country, $status) = unpack "a12 a2 a23 a7", $my_string;

print <<__END_OUTPUT__;
"$username"
"$age"
"$country"
"$status"
__END_OUTPUT__

wydajność

"Mickey      "
"24"
"                    USA"
" alive"

1 dla odpowiedzi nr 3

Tim Toady był zajęty tym zadaniem: rozwijaj swoje własne z rozpakowywaniem, jak opisano powyżej na poprzednich plakatach lub użyj jednego z wybranych modułów CPAN, które sprawiają, że ten rodzaj pracy jest bardzo szybki.

Także dostępny - Dane :: FixedFormat - AnyData :: Format :: Naprawiono - Text :: FixedWidth


-1 dla odpowiedzi № 4

Jeśli masz pola o stałej szerokości, użyj funkcji rozpakuj.

Coś jak:

my ($username, $age, $country, $status) = unpack("A12A2A23A7", $myString);