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 № 1Odpowiedz 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.