Majoritatea celorlalți au răspuns bine la întrebarea dvs. Luate împreună, acestea creează o explicație foarte detaliată a problemei și recomandă soluții. Problema este că pragma Perl "foloseste constantă" creează într-adevăr o subrutină în pachetul actual, al cărui nume este primul argument al pragmei și a cărui valoare este ultima.
În Perl, odată ce o subrutină este declarată, ea poate fi numită fără parente.
Understanding that "constants" are simply subroutines, you can see why they are not interpolated in strings and why the "fat comma" operator "=>" which quotes the left-hand argument thinks you've handed it a string (try other built-in functions like time() and keys() sometime with the fat comma for extra fun).
Din fericire, puteți invoca constanta folosind punctuație explicită, cum ar fi parente sau ampersand sigil.
Cu toate acestea, am o întrebare pentru dvs.: de ce folosiți constante pentru cheile hash?
Mă pot gândi la câteva scenarii care te-ar putea duce în această direcție:
-
Aveți nevoie de control asupra tastelor care pot fi în hash.
-
Doriți să eliminați numele cheilor în cazul în care acestea se modifică ulterior
În cazul numărului 1, probabil că constantele nu vor salva hash-ul. În schimb, luați în considerare crearea unei clase care are setteri publici și getters care utilizează un hash vizibil numai pentru obiect. Aceasta este o soluție foarte asemănătoare cu cea a Perl, dar foarte ușor de făcut.
În cazul numărului 2, aș susține în continuare puternic pentru o clasă. Dacă accesul la hash este reglat printr-o interfață bine definită, numai implementatorul clasei este responsabil pentru obținerea corectă a numelor cheilor hash. În acest caz, nu aș sugera folosirea constantelor.
Sper că acest lucru vă ajută și vă mulțumim pentru timpul acordat.