Jakie są naprawdę przydatne, ale ezoteryczne funkcje językowe w Perlu, które faktycznie udało ci się wykorzystać do wykonania pożytecznej pracy?
Wytyczne:
- Spróbuj ograniczyć odpowiedzi do rdzenia Perla, a nie do CPAN
- Proszę podać przykład i krótki opis
Ukryte funkcje można znaleźć również w ukrytych funkcjach innych języków:
(To wszystko z odpowiedzi Coriona )
- do
- Urządzenie Duffa
- Przenośność i standardowość
- DO#
- Cudzysłowy dla list i ciągów znaków rozdzielanych spacjami
- Aliasable przestrzeni nazw
- Jawa
- Statyczne inicjatory
- JavaScript
- Funkcjonariusze są obywatelami pierwszej klasy
- Zakres blokowy i zamknięcie
- Wywoływanie metod i metod dostępu pośrednio przez zmienną
- Rubin
- Definiowanie metod za pomocą kodu
- PHP
- Wszechstronna dokumentacja online
- Metody magiczne
- Symboliczne odniesienia
- Pyton
- Zamiana wartości w jednym wierszu
- Możliwość zastąpienia nawet podstawowych funkcji własną funkcjonalnością
Inne ukryte funkcje:
Operatorzy:
- Quasi-operator bool
- Operator przerzutnika
- Używany również do tworzenia list
- Te
++
i unarne-
operatorzy działają na sznurkach - Operator powtórzeń
- Operator statku kosmicznego
- || operator (i operator //), aby wybrać z zestawu opcji
- Operator diamentu
- Specjalne przypadki
m//
operatora - „Operator” tyldy tyldy
Cytowanie konstrukcji:
- Operator qw
- Litery mogą być używane jako ograniczniki cudzysłowów w konstrukcjach typu q {}
- Mechanizmy cytowania
Składnia i nazwy:
- Po sigilu może być spacja
- Możesz nadać subskrybentom nazwy numeryczne z symbolicznymi odniesieniami
- Prawne przecinki końcowe
- Zgrupowane literały całkowite
- plastry haszyszu
- Wypełnianie kluczy hasha z tablicy
Moduły, Pragmy i opcje wiersza poleceń:
- używaj surowych i ostrzeżeń
- Sprawdzanie skazy
- Ezoteryczne użycie -n i -p
- CPAN
overload::constant
- Moduł IO :: Handle
- Bezpieczne przegrody
- Atrybuty
Zmienne:
- Autowifikacja
$[
zmienna- wiązanie
- Dynamiczne określanie zakresu
- Zamiana zmiennych za pomocą jednej instrukcji
Pętle i kontrola przepływu:
Wyrażenia regularne:
Inne funkcje:
- Debugger
- Specjalne bloki kodu, takie jak BEGIN, CHECK i END
DATA
blok- Nowe operacje blokowe
- Filtry źródłowe
- Signal Hooks
- mapa ( dwukrotnie )
- Zawijanie wbudowanych funkcji
- Plik
eof
funkcja dbmopen
funkcja- Przekształcanie ostrzeżeń w błędy
Inne sztuczki i meta-odpowiedzi:
Zobacz też:
perl
hidden-features
Adam Bellaire
źródło
źródło
Odpowiedzi:
Operator flip-flop jest przydatny do pomijania pierwszej iteracji podczas przeglądania rekordów (zwykle linii) zwracanych przez uchwyt pliku, bez użycia zmiennej flag:
Uruchom
perldoc perlop
i wyszukaj „flip-flop”, aby uzyskać więcej informacji i przykładów.źródło
W Perlu jest wiele nieoczywistych funkcji.
Na przykład, czy wiesz, że po sigilu może być spacja?
Albo że możesz podać nazwy numeryczne subskrybentów, jeśli używasz odniesień symbolicznych?
Istnieje również operator quasi „bool”, który zwraca 1 dla prawdziwych wyrażeń i pusty ciąg dla fałszu:
Inne interesujące rzeczy: za pomocą
use overload
możesz przeciążać literały ciągów i liczby (i na przykład uczynić je BigInts lub cokolwiek innego).Wiele z tych rzeczy jest gdzieś udokumentowanych lub logicznie wynika z udokumentowanych cech, niemniej jednak niektóre nie są zbyt dobrze znane.
Aktualizacja : Kolejna fajna. Poniżej wymieniono
q{...}
konstrukcje cytowania, ale czy wiesz, że możesz używać liter jako separatorów?Podobnie możesz pisać wyrażenia regularne:
źródło
Dodaj obsługę skompresowanych plików przez Magic ARGV :
(cytuje wokół $ _ niezbędne do obsługi nazw plików z metaznakami powłoki w)
Teraz
<>
funkcja zdekompresuje wszystkie@ARGV
pliki kończące się na „.gz” lub „.Z”:źródło
|
z wymiany.zcat |
analizowane jako polecenie przepuszczające?@ARGV
Jedną z moich ulubionych funkcji w Perlu jest używanie
||
operatora boolowskiego do wybierania między zestawem opcji.Oznacza to, że można napisać:
aby podjąć pierwszą prawdziwą wartość z
$a
,$b
i$c
, lub domyślna0
inaczej.W Perlu 5.10 jest również
//
operator, który zwraca lewą stronę, jeśli jest zdefiniowana, lub prawą, jeśli jest inaczej. Następujące wybiera pierwszy określono wartość z$a
,$b
,$c
lub0
inaczej:Można ich również używać z ich krótkimi formularzami, które są bardzo przydatne przy podawaniu wartości domyślnych:
Cheerio,
Paweł
źródło
Operatory ++ i jednoargumentowe - działają nie tylko na liczbach, ale także na łańcuchach.
wydruki -a
wydruki b
drukuje aa
źródło
--
nie działa na strunach.ord()
. Lub napisz małą klasę i przeciąż operatorów, aby zrobić to za Ciebie.Ponieważ Perl ma prawie wszystkie „ezoteryczne” części z innych list, powiem ci jedną rzecz, której Perl nie może:
Jedyną rzeczą, której Perl nie może zrobić, jest posiadanie w kodzie gołych dowolnych adresów URL, ponieważ//
operator jest używany do wyrażeń regularnych.Na wypadek, gdybyś nie wiedział, jakie funkcje oferuje Perl, oto wybrana lista być może nie do końca oczywistych wpisów:
Urządzenie Duffa - w Perlu
Przenośność i standardowość - prawdopodobnie jest więcej komputerów z Perlem niż z kompilatorem C.
Klasa manipulacji plikami / ścieżkami - File :: Find działa w jeszcze większej liczbie systemów operacyjnych niż .Net
Cytaty dla list i ciągów znaków rozdzielanych spacjami - Perl pozwala wybrać prawie dowolne cudzysłowy dla listy i ograniczników ciągów
Przestrzenie nazw z możliwością aliasów - Perl ma je poprzez przypisania globalne :
Inicjatory statyczne - Perl może uruchamiać kod w prawie każdej fazie kompilacji i tworzenia instancji obiektu, od
BEGIN
(analiza kodu) doCHECK
(po przeanalizowaniu kodu) doimport
(przy imporcie modułu) donew
(instancja obiektu) doDESTROY
(zniszczenie obiektu) doEND
(wyjście programu)Funkcje są obywatelami pierwszej klasy - tak jak w Perlu
Zakres blokowy i zamknięcie - Perl ma jedno i drugie
Wywoływanie metod i akcesorów pośrednio przez zmienną - Perl też to robi:
Definiowanie metod za pomocą kodu - Perl również na to pozwala :
Wszechstronna dokumentacja online - dokumentacja Perla jest dostępna online i prawdopodobnie również w Twoim systemie
Magiczne metody wywoływane za każdym razem, gdy wywołasz „nieistniejącą” funkcję - Perl implementuje ją w funkcji AUTOLOAD
Symboliczne odniesienia - radzimy trzymać się od nich z daleka. Zjedzą twoje dzieci. Ale oczywiście Perl pozwala ci ofiarować swoje dzieci żądnym krwi demonom.
Zamiana wartości w jednym wierszu - Perl umożliwia przypisanie listy
Możliwość zastąpienia nawet podstawowych funkcji własną funkcjonalnością
lub
źródło
Autowifikacja . AFAIK nie ma go żaden inny język .
źródło
W Perlu można łatwo zacytować prawie każdy dziwny ciąg znaków.
W rzeczywistości różne mechanizmy cytowania w Perlu są dość interesujące. Mechanizmy cytowania podobne do wyrażeń regularnych Perla pozwalają na cytowanie wszystkiego, z podaniem ograniczników. Możesz użyć prawie każdego znaku specjalnego, takiego jak #, /, lub znaków otwarcia / zamknięcia, takich jak (), [] lub {}. Przykłady:
Mechanizmy cytowania:
q: dosłowny cudzysłów; jedyną postacią, której trzeba zmienić, jest znak końcowy. qq: zinterpretowany cytat; przetwarza zmienne i znaki ucieczki. Świetne do ciągów, które musisz zacytować:
qx: Działa jak qq, ale następnie wykonuje je jako polecenie systemowe, nie interaktywnie. Zwraca cały tekst wygenerowany ze standardowego wyjścia. (Przekierowanie, jeśli jest obsługiwane w systemie operacyjnym, również pojawia się) Również wykonane z cudzysłowami wstecznymi (znak `).
qr: interpretuje jak qq, ale następnie kompiluje jako wyrażenie regularne. Działa również z różnymi opcjami wyrażenia regularnego. Możesz teraz przekazać wyrażenie regularne jako zmienną:
qw: Bardzo, bardzo przydatny operator cytatów. Zamienia zestaw słów oddzielonych spacjami w cudzysłowy w listę. Doskonały do wypełniania danych w teście jednostkowym.
Świetnie się z nich korzysta, gdy tylko wszystko staje się jaśniejsze. Dla qx, qq i q najprawdopodobniej używam operatorów {}. Najczęstszym nawykiem osób używających qw jest zwykle operator (), ale czasami pojawia się również qw //.
źródło
my $moreout = qx{type "$path" 2>&1};
... Nie wiedziałem, że możesz to zrobić! [TM]Niezupełnie ukryte, ale wielu programistów Perla na co dzień nie wie o CPAN . Dotyczy to szczególnie osób, które nie są programistami na pełny etat lub nie programują w pełnym wymiarze czasu w Perlu.
źródło
Instrukcja „for” może być używana w ten sam sposób, w jaki „with” jest używane w Pascalu:
Możesz zastosować sekwencję operacji s /// itp. Do tej samej zmiennej bez konieczności powtarzania nazwy zmiennej.
UWAGA: nierozdzielająca spacja powyżej (& nbsp;) ukryła w niej Unicode, aby obejść Markdown. Nie kopiuj, wklej go :)
źródło
Operator słowa cudzysłowu to jedna z moich ulubionych rzeczy. Porównać:
i
Dużo mniej hałasu, przyjemniejszy dla oka. Kolejną bardzo fajną rzeczą w Perlu, której naprawdę brakuje podczas pisania SQL, jest to, że końcowy przecinek jest legalny:
Wygląda to dziwnie, ale nie, jeśli w kodzie wciśniesz w inny sposób:
Dodanie dodatkowego argumentu do wywołania funkcji nie wymaga majstrowania przy przecinkach w poprzednich lub końcowych wierszach. Zmiana pojedynczej linii nie ma wpływu na otaczające ją linie.
Dzięki temu praca z różnymi funkcjami jest bardzo przyjemna. Jest to prawdopodobnie jedna z najbardziej niedocenianych funkcji Perla.
źródło
for (<a list of stuff>) { ... }
Możliwość analizowania danych bezpośrednio wklejanych do bloku DATA . Nie ma potrzeby zapisywania do pliku testowego, aby otworzyć go w programie lub podobnym. Na przykład:
źródło
Nowe operacje blokowe
Powiedziałbym, że jedną z nich jest możliwość rozszerzenia języka, tworzenia pseudobloków.
Deklarujesz prototyp dla sub, wskazując, że najpierw pobiera odwołanie do kodu:
Możesz wtedy tak to nazwać w ciele
(
Data::Dumper::Dumper
to kolejny pół-ukryty klejnot.) Zwróć uwagę, że nie potrzebujeszsub
słowa kluczowego przed blokiem ani przecinka przed hashem. Kończy się bardzo podobnie do:map { } @list
Filtry źródłowe
Istnieją również filtry źródłowe. Gdzie Perl przekaże Ci kod, abyś mógł nim manipulować. Zarówno to, jak i operacje blokowe, są w zasadzie rzeczy typu „nie próbuj tego w domu”.
Zrobiłem kilka fajnych rzeczy z filtrami źródłowymi, na przykład stworzyłem bardzo prosty język do sprawdzania czasu, zezwalając na krótkie jednowierszowe Perl do podejmowania decyzji:
Lib::TL
po prostu przeszukałby zarówno „zmienne”, jak i stałe, utworzył je i zastąpił w razie potrzeby.Ponownie, filtry źródłowe mogą być nieuporządkowane, ale są potężne. Ale mogą zepsuć debuggery coś strasznego - a nawet ostrzeżenia mogą być drukowane z niewłaściwymi numerami linii. Przestałem używać Switcha Damiana ponieważ debugger straciłby wszelkie możliwości powiedzenia mi, gdzie naprawdę jestem. Ale odkryłem, że możesz zminimalizować szkody, modyfikując małe fragmenty kodu, utrzymując je w tej samej linii.
Signal Hooks
Często się to robi, ale nie jest to wcale takie oczywiste. Oto osoba obsługująca kości, która wraca do starego.
Oznacza to, że za każdym razem, gdy jakiś inny moduł w kodzie chce umrzeć, musi do ciebie przyjść (chyba że ktoś inny dokona destrukcyjnego nadpisania
$SIG{__DIE__}
). I możesz zostać powiadomiony, że ktoś coś zrobi z błędem.Oczywiście w przypadku wystarczającej liczby rzeczy możesz po prostu użyć
END { }
bloku, jeśli wszystko, co chcesz zrobić, to posprzątać.overload::constant
Możesz sprawdzić literały określonego typu w pakietach, które zawierają Twój moduł. Na przykład, jeśli używasz tego w swoim
import
sub:będzie to oznaczać, że każda liczba całkowita większa niż 2 miliardy w wywoływanych pakietach zostanie zamieniona na
Math::BigInt
obiekt. (Zobacz overload :: constant ).Zgrupowane literały całkowite
Skoro już przy tym jesteśmy. Perl pozwala ci podzielić duże liczby na grupy po trzy cyfry i nadal uzyskać z nich parsowalną liczbę całkowitą. Uwaga
2_000_000_000
powyżej za 2 miliardy.źródło
->slice
jako metody za każdym razem, gdy potrzebny jest plasterek.Binarny „x” jest operatorem powtórzenia :
Działa również z listami:
źródło
Sprawdzanie skazy. Po włączeniu sprawdzania skażeń perl umrze (lub ostrzeże, z
-t
), jeśli spróbujesz przekazać skażone dane (z grubsza, dane spoza programu) do niebezpiecznej funkcji (otwarcie pliku, uruchomienie polecenia zewnętrznego itp.). Jest to bardzo pomocne przy pisaniu skryptów setuid lub CGI lub czegokolwiek, gdzie skrypt ma większe uprawnienia niż osoba przekazująca mu dane.Magic goto.
goto &sub
wykonuje zoptymalizowane wywołanie ogonowe.Debugger.
use strict
iuse warnings
. To może uchronić Cię przed wieloma literówkami.źródło
Bazując na sposobie implementacji przełączników
"-n"
i"-p"
w Perlu 5, możesz napisać pozornie niepoprawny program zawierający}{
:który jest wewnętrznie konwertowany na ten kod:
źródło
Zacznijmy łatwo od operatora statku kosmicznego .
źródło
($a->lname cmp $b->lname) || ($a->fname cmp $b->fname)
sortuje ludzi według ich nazwisk, ale jeśli dwie osoby mają to samo nazwisko, zostaną uporządkowane według ich imienia.To jest meta-odpowiedź, ale archiwa Perl Tips zawierają różnego rodzaju interesujące sztuczki, które można wykonać za pomocą Perla. Archiwum wcześniejszych wskazówek jest dostępne w trybie on-line do przeglądania i można je subskrybować za pośrednictwem listy mailingowej lub kanału Atom.
Niektóre z moich ulubionych wskazówek obejmują budowanie plików wykonywalnych za pomocą PAR-a , używanie autodie do automatycznego generowania wyjątków oraz używanie konstrukcji przełącznika i inteligentnego dopasowania w Perlu 5.10.
Ujawnienie: Jestem jednym z autorów i opiekunów Perl Tips, więc oczywiście bardzo wysoko o nich myślę. ;)
źródło
map - nie tylko dlatego, że czyni swój kod bardziej wyrazistym, ale dlatego, że dała mi impuls do poczytania czegoś więcej o tym „programowaniu funkcjonalnym”.
źródło
Klauzula continue w pętlach. Zostanie wykonany na dole każdej pętli, nawet tych następnych.
źródło
Mój głos skierowałby się na grupy (? {}) I (?? {}) w wyrażeniach regularnych Perla. Pierwsza wykonuje kod Perla, ignorując zwracaną wartość, druga wykonuje kod, używając wartości zwracanej jako wyrażenia regularnego.
źródło
s/(pattern)/reverse($1);/ge;
# odwraca wszystkopatterns
.uninames
,unichars
a zwłaszczauniprops
, aby zobaczyć tylko część tego, co mam na myśli.kotwica \ G. Jest gorąco .
źródło
m//
Operator ma jakieś niejasne przypadki szczególne:?
jako separatora, pasuje on tylko raz, chyba że zadzwoniszreset
.'
jako separatora, wzór nie jest interpolowany.źródło
Operator diamentu uchwytu pliku o wartości null
<>
ma swoje miejsce w tworzeniu narzędzi wiersza poleceń. Działa jak<FH>
czytanie z uchwytu, z tym wyjątkiem, że w magiczny sposób wybiera to, co zostanie znalezione jako pierwsze: nazwy plików w wierszu poleceń lub STDIN. Zaczerpnięte z Perlop:źródło
perl myscript.pl file1.txt - file2.txt
, a perl przetworzy pierwszy plik, potem stdin, a potem drugi plik.overload
<>
<$var>
Specjalne bloki kodu , takich jak
BEGIN
,CHECK
iEND
. Pochodzą z Awk, ale działają inaczej w Perlu, ponieważ nie jest oparty na rekordach.BEGIN
Blok może być użyta do określenia kodu dla fazy analizowania; jest również wykonywana podczas sprawdzania składni i zmiennychperl -c
. Na przykład, aby załadować zmienne konfiguracyjne:źródło
zmienia nazwę data.txt.part na data.txt bez konieczności powtarzania tego.
źródło
Nieco niejasny jest "operator" tylda-tylda, który wymusza kontekst skalarny.
jest taki sam jak
i inny niż
źródło
~~
, który może dokonywać dopasowań wyrażeń regularnych, może sprawdzać, czy element znajduje się w tablicy i tak dalej.tie, zmienny interfejs wiązania.
źródło
„Tryb desperacji” konstrukcji sterujących pętli Perla, który powoduje, że przeszukują stos w celu znalezienia pasującej etykiety, pozwala na kilka ciekawych zachowań, które Test :: More wykorzystuje, na lepsze lub gorsze.
Jest mało znany plik .pmc. „użyj Foo” będzie szukał Foo.pmc w @INC przed Foo.pm. Miało to na celu umożliwienie pierwszego załadowania skompilowanego kodu bajtowego, ale Module :: Compile wykorzystuje to do buforowania modułów filtrowanych według źródła w celu skrócenia czasu ładowania i łatwiejszego debugowania.
Możliwość zmiany ostrzeżeń w błędy.
To jest to, co przychodzi mi do głowy z głowy, o czym nie wspomniałem.
źródło
Operator kóz
*
:lub
Działa, ponieważ przypisanie listy w kontekście skalarnym daje liczbę elementów na przypisanej liście.
*
Uwaga, nie jest to operatorźródło