To polecenie perlform, które można uruchomić w darmowym dostawcy hostingu OnWorks, korzystając z jednej z wielu naszych darmowych stacji roboczych online, takich jak Ubuntu Online, Fedora Online, emulator online systemu Windows lub emulator online systemu MAC OS
PROGRAM:
IMIĘ
perlform - formaty Perl
OPIS
Perl ma mechanizm, który pomaga generować proste raporty i wykresy. Aby to ułatwić,
Perl pomaga Ci zakodować stronę wyjściową w sposób zbliżony do tego, jak będzie wyglądała po wydrukowaniu.
możesz śledzić takie rzeczy, jak liczba wierszy na stronie, na której stronie się znajdujesz, kiedy
wydrukuj nagłówki stron itp. Słowa kluczowe zapożyczono z FORTRAN-u: format() zadeklarować i
pisać() wykonać; zobacz ich wpisy w perlfunc. Na szczęście układ jest o wiele bardziej
czytelne, bardziej jak instrukcja PRINT USING języka BASIC. Pomyśl o tym jak o słowie dla ubogich nroff(1).
Formaty, takie jak pakiety i podprogramy, są deklarowane, a nie wykonywane, więc mogą
mogą wystąpić w dowolnym momencie programu. (Zwykle jednak najlepiej jest zachować je wszystkie razem.)
Mają własną przestrzeń nazw, poza wszystkimi innymi „typami” w Perlu. Oznacza to, że
jeśli masz funkcję o nazwie „Foo”, nie jest to to samo, co posiadanie formatu o nazwie
„Foo”. Jednak domyślna nazwa formatu powiązanego z danym uchwytem pliku to
taka sama jak nazwa uchwytu pliku. Dlatego domyślny format dla STDOUT nazywa się
„STDOUT”, a domyślny format dla uchwytu pliku TEMP nazywa się „TEMP”. Wyglądają po prostu
to samo. Nie są.
Formaty rekordów wyjściowych deklaruje się w następujący sposób:
format NAZWA =
FORMLIST
.
Jeśli nazwa jest pominięta, format „STDOUT” jest zdefiniowany. Pojedynczy znak „.” w kolumnie 1 jest używany do
zakończ format. FORMLIST składa się z sekwencji wierszy, z których każdy może być jednym z
trzy typy:
1. Komentarz oznaczony znakiem „#” w pierwszej kolumnie.
2. Linia „obrazkowa” podająca format jednej linii wyjściowej.
3. Wiersz argumentu dostarczający wartości do wstawienia do poprzedniego wiersza obrazu.
Linie obrazu zawierają definicje pól wyjściowych, przeplatane tekstem dosłownym.
linie nie podlegają żadnej zmiennej interpolacji. Definicje pól są tworzone
z zestawu znaków, do rozpoczęcia i rozszerzenia pola do pożądanej szerokości. To jest
kompletny zestaw znaków do definicji pól:
@ początek regularnego pola
^ początek pola specjalnego
< znak wypełnienia do wyrównania do lewej
| znak podkładki do centrowania
> znak wypełnienia do wyrównania do prawej
# znak wypełniający dla pola numerycznego wyrównanego do prawej
0 zamiast pierwszego #: numer padu z zerami wiodącymi
. przecinek dziesiętny w polu liczbowym
... zakończ pole tekstowe, pokaż "..." jako dowód obcięcia
@* pole o zmiennej szerokości dla wartości wielowierszowej
^* pole o zmiennej szerokości dla następnego wiersza wartości wielowierszowej
~ usuń linię ze wszystkimi polami pustymi
~~ powtarzaj wiersz, aż wszystkie pola zostaną wyczerpane
Każde pole w wierszu obrazka zaczyna się od znaku „@” (małpki) lub „^” (daszka), wskazując, co
nazwiemy odpowiednio pole „zwykłe” lub „specjalne”. Wybór znaków wypełniających
określa, czy pole jest tekstowe czy numeryczne. Operatory tyldy nie są częścią
pole. Przyjrzyjmy się szczegółowo różnym możliwościom.
Tekst Łąka
Długość pola jest ustalana poprzez uzupełnienie pola wieloma znakami „<”, „>” lub
Znaki „|” służą do określenia pola nienumerycznego z odpowiednim wyrównaniem do lewej strony,
wyrównanie do prawej lub wyśrodkowanie. W przypadku zwykłego pola wartość (do pierwszego
nowy wiersz) jest pobierany i drukowany zgodnie z wybranym wyrównaniem, przycinając nadmiar
znaków. Jeśli zakończysz pole tekstowe znakiem „...”, zostaną wyświetlone trzy kropki, jeśli
wartość jest obcięta. Specjalne pole tekstowe może być użyte do wykonania prostego tekstu wielowierszowego
wypełnianie bloku; szczegóły w sekcji „Korzystanie z trybu wypełniania”.
Przykład:
formatuj STDOUT =
@<<<<<<< @|||||| @>>>>>>
„lewy”, „środkowy”, „prawy”
.
Wyjście:
lewy środkowy prawy
Numeryczne Łąka
Użycie znaku „#” jako znaku wypełniającego określa pole numeryczne z wyrównaniem do prawej.
opcjonalny „.” definiuje pozycję przecinka dziesiętnego. Z „0” (zerem) zamiast
pierwszy „#”, sformatowana liczba zostanie uzupełniona wiodącymi zerami, jeśli będzie to konieczne.
specjalne pole numeryczne jest puste, jeśli wartość jest niezdefiniowana. Jeśli wynikowa wartość
przekroczyłoby określoną szerokość, pole jest wypełniane znakiem "#" jako dowodem przepełnienia.
Przykład:
formatuj STDOUT =
@### @.### @##.### @### @### ^####
42, 3.1415, niezdefiniowany, 0, 10000, niezdefiniowany
.
Wyjście:
42 3.142 0.000 0 ####
Pole @* dla Zmienna szerokość Wiele linii Tekst
Pole „@*” można wykorzystać do drukowania wielowierszowych, nieobciętych wartości; powinno (ale
nie musi) pojawiać się samodzielnie w wierszu. Ostatni wiersz jest odcinany, ale wszystkie inne
znaki są emitowane dosłownie.
Pole ^* dla Zmienna szerokość Jedna linia na raz Tekst
Podobnie jak „@*”, jest to pole o zmiennej szerokości. Podana wartość musi być zmienną skalarną.
Perl umieszcza pierwszy wiersz (do pierwszego „\n”) tekstu w polu, a następnie go obcina
z przodu ciągu, tak aby przy następnym odwołaniu się do zmiennej można było zobaczyć więcej
tekst może być wydrukowany. Zmienna będzie nie być przywrócone.
Przykład:
$text = "linia 1\nlinia 2\nlinia 3";
formatuj STDOUT =
Tekst: ^*
Tekst
~~ ^*
Tekst
.
Wyjście:
Tekst: linia 1
Linia 2
Linia 3
Określanie Wartości
Wartości są określone w następującym wierszu formatu w takiej samej kolejności jak na obrazku
pola. Wyrażenia dostarczające wartości muszą być rozdzielone przecinkami. Wszystkie są
oceniane w kontekście listy przed przetworzeniem wiersza, więc pojedyncze wyrażenie listy
może wygenerować wiele elementów listy. Wyrażenia mogą być rozłożone na więcej niż jeden
wiersz, jeśli jest ujęty w nawiasy klamrowe. Jeśli tak, otwierający nawias klamrowy musi być pierwszym tokenem na pierwszym
wiersz. Jeśli wyrażenie jest liczbą z częścią dziesiętną i jeśli
odpowiedni obrazek określa, że część dziesiętna powinna pojawić się na wyjściu (czyli
jest to dowolny obrazek z wyjątkiem wielu znaków "#" bez osadzony znak „.”,
używany do odmierzania miejsc dziesiętnych jest określany przez bieżącą lokalizację LC_NUMERIC, jeśli wybrano opcję „użyj lokalizacji”
jest w mocy. Oznacza to, że jeśli na przykład środowisko wykonawcze zdarzy się
określ ustawienia regionalne dla języka niemieckiego, zamiast domyślnego „.” zostanie użyte „.” Zobacz perllocale i
Więcej informacji w sekcji „OSTRZEŻENIA”.
Korzystanie z Wypełniać Moda
W polach tekstowych kursor umożliwia pewien rodzaj trybu wypełniania. Zamiast dowolnego wyrażenia,
podana wartość musi być zmienną skalarną zawierającą ciąg tekstowy. Perl umieszcza
następną część tekstu do pola, a następnie odcina przód ciągu, tak aby
że przy następnym odwołaniu się do zmiennej, można wydrukować więcej tekstu. (Tak,
oznacza to, że sama zmienna jest zmieniana podczas wykonywania pisać() zadzwoń i
(nie jest przywracany.) Następna część tekstu jest określana przez prymitywne łamanie wierszy
algorytm. Możesz użyć znaku powrotu karetki ("\r"), aby wymusić podział wiersza. Możesz
zmień znaki, które można legalnie przerwać, zmieniając zmienną $: (to jest
$FORMAT_LINE_BREAK_CHARACTERS, jeśli używasz modułu angielskiego) do listy żądanych
postacie.
Zwykle używa się sekwencji pól w pionowym stosie powiązanym z tym samym
zmienna skalarna do wydrukowania bloku tekstu. Możesz chcieć zakończyć ostatnie pole za pomocą
tekst „...”, który pojawi się w wynikach, jeśli tekst jest zbyt długi, aby wyświetlić go w całości
całość.
Tłumienie Kwestia Gdzie Wszystkie produkty Łąka Czy Unieważnić
Użycie pól kursora może powodować tworzenie linii, w których wszystkie pola są puste. Możesz takie pola pominąć
wiersze, umieszczając znak "~" (tylda) w dowolnym miejscu wiersza. Tylda będzie
tłumaczone na spację po wydrukowaniu.
Powtórzenie Format: Kwestia
Jeżeli wstawisz dwa sąsiadujące ze sobą znaki tyldy „~~” w dowolnym miejscu wiersza, wiersz będzie
powtarzane aż do wyczerpania wszystkich pól w wierszu, tj. niezdefiniowane. W przypadku specjalnych
(kursor) pola tekstowe prędzej czy później to nastąpi, ale jeśli użyjesz pola tekstowego w
różnorodność, wyrażenie, które podajesz, lepiej, żeby nie dawało za każdym razem tej samej wartości!
("shift(@f)" to prosty przykład, który zadziała.) Nie używaj zwykłego pola numerycznego (at)
w takich wierszach, bo nigdy nie będą puste.
Topy of Forma Przetwarzanie
Przetwarzanie na początku formularza jest domyślnie obsługiwane przez format o tej samej nazwie co bieżący
filehandle z dołączonym do niego "_TOP". Jest on wyzwalany na górze każdej strony. Zobacz
„napisz” w perlfunc.
Przykłady:
# raport na temat / Etc / passwd filet
format STDOUT_TOP =
Plik haseł
Nazwa Zaloguj się Biuro Uid Gid Strona główna
-------------------------------------------------- ----------------
.
formatuj STDOUT =
@<<<<<<<<<<<<<<<<<<<@|||||||| @<<<<<<<@>>>> @>>>> @<<<<<<<<<<<<<<<<<<
$name, $login, $office, $uid, $gid, $home
.
# raport z formularza zgłaszania błędów
format STDOUT_TOP =
Zgłaszanie błędów
@<<<<<<<<<<<<<<<<<<<<<<<<< @||| @>>>>>>>>>>>>>>>>>>>>>>>
$system, $%, $data
-------------------------------------------------- ----------------
.
formatuj STDOUT =
Temat: @< ...
$ temat
Indeks: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$indeks, $opis
Priorytet: @<<<<<<<<<<< Data: @<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$priorytet, $data, $opis
Od: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$od, $opis
Przypisano do: @<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$programista, $opis
~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Opis
~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Opis
~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Opis
~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Opis
~ ^<<<<<<<<<<<<<<<<<<<<<<<<<...
Opis
.
Można mieszać wydrukować()y z pisać()na tym samym kanale wyjściowym, ale będziesz
musisz sam obsłużyć "$-" ($FORMAT_LINES_LEFT).
Format: Zmienne
Bieżąca nazwa formatu jest przechowywana w zmiennej $~ ($FORMAT_NAME), a bieżący najwyższy
nazwa formatu formularza znajduje się w $^ ($FORMAT_TOP_NAME). Numer bieżącej strony wyjściowej jest przechowywany
w $% ($FORMAT_PAGE_NUMBER), a liczba wierszy na stronie wynosi $=
($FORMAT_LINES_PER_PAGE). Czy automatycznie opróżnić wyjście na tym uchwycie, jest przechowywane w $|
($OUTPUT_AUTOFLUSH). Ciąg wyjściowy przed każdym początkiem strony (oprócz pierwszego) to
przechowywane w $^L ($FORMAT_FORMFEED). Te zmienne są ustawiane na podstawie uchwytu pliku, więc
będziesz potrzebować Wybierz() do innego, aby na nie wpłynąć:
wybierz((wybierz(OUTF),
$~ = "Mój_Inny_Format",
$^ = "Mój_Najwyższy_Format"
)[0]);
Całkiem brzydkie, co? To jednak powszechne wyrażenie, więc nie bądź zbyt zaskoczony, gdy je zobaczysz.
Możesz przynajmniej użyć tymczasowej zmiennej do przechowywania poprzedniego uchwytu pliku: (to o wiele
lepsze podejście, ponieważ nie tylko poprawia się czytelność, ale także masz teraz
etap pośredni w wyrażeniu umożliwiającym debuggerowi jednokrotne przejście przez ten etap):
$ofh = wybierz(OUTF);
$~ = "Mój_Inny_Format";
$^ = "Mój_Najwyższy_Format";
wybierz($ofh);
Jeśli używasz modułu angielskiego, możesz nawet odczytać nazwy zmiennych:
używaj angielskiego;
$ofh = wybierz(OUTF);
$FORMAT_NAME = "Mój_inny_format";
$FORMAT_TOP_NAME = "Mój_Najwyższy_Format";
wybierz($ofh);
Ale nadal masz te zabawne Wybierz()s. Więc po prostu użyj modułu FileHandle. Teraz,
można uzyskać dostęp do tych specjalnych zmiennych, używając zamiast tego nazw metod pisanych małymi literami:
użyj FileHandle;
format_name OUTF "Mój_inny_format";
format_top_name OUTF "Mój_Najwyższy_Format";
Dużo lepiej!
UWAGI
Ponieważ wiersz wartości może zawierać dowolne wyrażenia (dla pól at, nie kursor)
pól), możesz przekazać bardziej zaawansowane przetwarzanie innym funkcjom, takim jak sprintf()
lub jeden z twoich. Na przykład:
formatuj Ident =
@<<<<<<<<<<<<<<
&komituj($n)
.
Aby umieścić w polu prawdziwy znak at lub daszek, wykonaj następujące czynności:
formatuj Ident =
Mam tu @.
„@”
.
Aby wyśrodkować cały wiersz tekstu, wykonaj coś takiego:
formatuj Ident =
@|||||||||||||||||||||||||||||||||||||||||||
„Jakiś wiersz tekstu”
.
Nie ma wbudowanego sposobu, aby powiedzieć „przenieś to na prawą stronę strony”, jednak
jest szeroki." Musisz określić, gdzie to idzie. Naprawdę zdesperowani mogą wygenerować swoje
własny format w locie, w oparciu o bieżącą liczbę kolumn, a następnie eval () to:
$format = "format STDOUT = \n"
. '^' . '<' x $cols . "\n"
. '$wpis' . "\n"
. "\t^" . "<" x ($cols-8) . "~~\n"
. '$wpis' . "\n"
. ".\N";
wydrukuj $format jeśli $Debugging;
ocena $format;
giń $@ jeśli $@;
Co wygenerowałoby format wyglądający mniej więcej tak:
formatuj STDOUT =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$wpis
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
$wpis
.
Oto mały program, który jest trochę podobny fmt(1):
format =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
$_
.
$/ = '';
podczas (<>) {
s/\s*\n\s*/ /g;
pisać;
}
Stopki
Chociaż $FORMAT_TOP_NAME zawiera nazwę bieżącego formatu nagłówka, nie ma
odpowiedni mechanizm, aby automatycznie zrobić to samo dla stopki. Nie wiedząc jak
duży format będzie dopóki nie ocenisz go jest jednym z głównych problemów. To jest na
lista rzeczy do zrobienia.
Oto jedna ze strategii: jeśli masz stopkę o stałym rozmiarze, możesz uzyskać stopki, zaznaczając
$FORMAT_LINES_LEFT przed każdym pisać() i wydrukuj stopkę samodzielnie, jeśli to konieczne.
Oto inna strategia: otwórz sobie kanał, używając „open(MYSELF, „|-”)” (patrz „open”
w perlfunc) i zawsze pisać() do MYSELF zamiast STDOUT. Niech twoje dziecko przetworzy
masuj jego STDIN, aby zmienić kolejność nagłówków i stopek, jak chcesz. Nie jest to zbyt wygodne,
ale wykonalne.
dostępu Formatowanie Internaliści
Aby uzyskać dostęp niskiego poziomu do mechanizmu formatowania, możesz użyć linia formularza() i uzyskaj dostęp do $^A
(zmienna $ACCUMULATOR) bezpośrednio.
Na przykład:
$str = linia <<'END', 1,2,3;
@<<< @||| @>>>
KONIEC
drukuj "Wow, właśnie zapisałem '$^A' w akumulatorze!\n";
Albo zrobić napisz() podprogram, który ma pisać() co sprintf() jest printf(), zrobić
to:
użyj karpia;
napisz pod sw {
rechocze "użycie: swrite PICTURE ARGS", chyba że @_;
mój $format = shift;
$^A = "";
liniaformatu($format,@_);
zwróć $^A;
}
$string = swrite(<<'KONIEC', 1, 2, 3);
Sprawdź mnie
@<<< @||| @>>>
KONIEC
drukuj $łańcuch;
OSTRZEŻENIA
Samotna kropka kończąca format może również przedwcześnie zakończyć wiadomość e-mail przechodzącą przez
nieprawidłowo skonfigurowany program pocztowy w Internecie (a doświadczenie pokazuje, że taka błędna konfiguracja jest regułą,
nie jest wyjątkiem). Dlatego wysyłając kod formatu pocztą, należy go wciąć tak, aby
aby kropka kończąca format nie znajdowała się na lewym marginesie; zapobiegnie to odcięciu protokołu SMTP.
Zmienne leksykalne (zadeklarowane za pomocą „my”) nie są widoczne w formacie, chyba że format
jest zadeklarowany w zakresie zmiennej leksykalnej.
Jeśli środowisko programu określa ustawienia regionalne LC_NUMERIC i obowiązuje opcja „użyj ustawień regionalnych”
gdy format jest deklarowany, ustawienia regionalne są używane do określenia znaku przecinka dziesiętnego w
sformatowane wyjście. Sformatowane wyjście nie może być kontrolowane przez "use locale" w momencie, gdy
pisać() jest nazywany. Zobacz perllocale w celu dalszej dyskusji na temat obsługi ustawień regionalnych.
W ciągach, które mają być wyświetlane w polu tekstowym o stałej długości, każdy element sterujący
znak jest zastępowany spacją. (Należy jednak pamiętać o szczególnym znaczeniu „\r” podczas używania
(tryb wypełniania). Robi się to w celu uniknięcia braku wyrównania, gdy znaki kontrolne „znikają” w niektórych
media wyjściowe.
Użyj perlform online korzystając z usług onworks.net