/ / Dlaczego chomp ($ Array [0]) usunie jakiś łańcuch zawierający w $ Array [0]? - perl

Dlaczego chomp ($ Array [0]) usunie jakiś łańcuch zawarty w $ Array [0]? - perl

Mam plik wejściowy, który wygląda tak

1a0i b.40.4.6 1a49 b.58.1.1 1a82 c.37.1.10 1pkt d.144.1.7 . . . .

Problem1

Umieszczam każdą linię w @Array

kiedy używam

$Line = chomp($Array[0]);
print $Line;

pokaż wyjście na ekranie 1

but When I use
$Line = $Array[0];
print $Line;

pokaż wyjście na ekranie 1a0i b.40.4.6

Dlaczego chomp pozwoli $ Line pozostać tylko jednemu znakowi?


Problem2

Chcę użyć b.40 jako nazwy pliku, więc tutaj jest mój kod

$ Array [0] to 1a0i b.40.4.6

$Line = $Array[0];
@Element = split(" ",$Line);
@Tiny_element = split(".",$Element[1]);
$File_name = join(".",splice(@Tiny_element,0,2));

ale drukuję $ nazwa_pliku, ale nic nie pokazuje, używam Dumper @Tiny_element , ale jest pusty ja print $Element[1] , pokazuje b.40.4.6, używam index($Element[1],".") to pokazuje 1, więc wiem, że zawiera „.” ale może „nie oddzielić się od”.

próbuję split(".",$Element[1]) ; split(".",$Element[1]) wcześniej, ale wciąż nie rozwiązuję ....

Co jest z tym nie tak?

dzięki

Odpowiedzi:

2 dla odpowiedzi № 1

Odpowiedz na problem 1:

Posługiwać się:

chomp($Array[0]);
$Line = $Array[0];

zamiast:

$Line = chomp($Array[0]);

To dlatego, że wartość zwracana chomp nie jest łańcuchem, ale liczbą końcowych znaków usuniętych z ciągu.

Odpowiedz na problem 2

$File_name = $1 if ($Line =~ /s([^.]+.[^.]+)/);

3 dla odpowiedzi № 2

Być może mógłbyś spróbować przeczytać dokumentację używanej funkcji, a nie tylko zgadywać jej zachowanie.

The dokumentacja do chomp mówi to:

Zwraca całkowitą liczbę znaków usuniętych ze wszystkich argumentów

Ciąg jest edytowany na miejscu.


1 dla odpowiedzi nr 3

Jeśli chodzi o drugi problem, jeśli miałbym wyjaśnić kod, zmieniając pierwszy parametr podzielonych instrukcji w następujący sposób:

 $Line = $Array[0];
@Element = split(/ /,$Line);
@Tiny_element = split(/./,$Element[1]);
$File_name = join(".",splice(@Tiny_element,0,2));

i przypomniałem ci o tym . jest znakiem wieloznacznym w wyrażeniach regularnych, czy lepiej rozumiesz swój błąd?

BTW: /[.]/ to świetny regex do wyszukiwania okresów literalnych.