Co je “ deklarovat ” v Bashi?

Po přečtení odpovědi ilkkachu na tuto otázku jsem se dozvěděl o existenci declare (s argumentem -n) vestavěný shell.

help declare přináší:

Nastavit hodnoty a atributy proměnných.

Deklarovat proměnné a dát jim atributy. Pokud nejsou uvedeny žádné JMÉNA, zobrazte atributy a hodnoty všech proměnných.

-n … učinit z NAME odkaz na proměnnou pojmenovanou podle její hodnoty

I požádat o obecné vysvětlení pomocí příkladu týkajícího se declare, protože nerozumím man. Vím, co je proměnná a rozšiřuji ji, ale stále mi chybí man na declare (atribut proměnné?).

Možná byste to chtěli vysvětlit na základě kódu ilkkachu v odpovědi:

#!/bin/bash function read_and_verify { read -p "Please enter value for "$1": " tmp1 read -p "Please repeat the value to verify: " tmp2 if [ "$tmp1" != "$tmp2" ]; then echo "Values unmatched. Please try again."; return 2 else declare -n ref="$1" ref=$tmp1 fi } 

Komentáře

Odpověď

Ve většině případů to stačí s implicitní deklarací v bash

asdf="some text" 

Někdy však chcete, aby hodnota proměnné byla pouze celé číslo (takže v případě, že by se později změnila, i automaticky, mohla by být změněna pouze na celé číslo, v některých případech výchozí), a lze použít:

declare -i num 

nebo

declare -i num=15 

Někdy chcete pole a pak potřebujete declare

declare -a asdf # indexed type 

nebo

Dobré výukové programy o polích najdete v bash při procházení internetu pomocí vyhledávacího řetězce“ bash array tutorial „(bez uvozovek), pro příklad

linuxconfig.org/how-to-use-arrays-in-bash-script


Myslím, že toto jsou nejčastější případy, kdy deklarujete proměnné.


Všimněte si také, že

  • ve funkci, declare učiní proměnnou lokální (ve funkci)
  • bez jakéhokoli názvu, vypíše všechny proměnné (v aktivním prostředí)

    declare 

Nakonec získáte stručné shrnutí funkcí integrovaného příkazu prostředí declare v bash s příkazem

help declare 

Komentáře

  • Dobrý den z OP! Myslím, že vaše odpověď je skvělá, hlasoval jsem pro ni a děkuji vám za tuto, dle mého názoru, velmi didaktickou odpověď. Právě jsem navrhl menší editaci, která podle mého skromného názoru umožní ještě snadnější a přístupnější čtení pro nováčky; projděte prosím tento návrh.
  • Právě jsem viděl, že user:muru hlasoval pro odmítnutí úpravy; Mějte prosím na paměti, že já a muru jsme “ několikrát střetli “ v různých částech tohoto webu a předpokládám, že jeho odmítnutí není ‚ t cíle a je ve skutečnosti škodlivý na rozdíl od přímých změn uvedených na stránce s návrhy úprav zde: unix.stackexchange.com/review/suggested -edits / 325749
  • @JohnDoea, viděl jsem, že vaše úpravy odmítl i jiný uživatel. Myslím, že některé vaše úpravy jsou dobré, ale některé z nich změní poselství oproti tomu, co jsem zamýšlel, takže bych je neměl rád. Mohu upravit odpověď tak, aby obsahovala i to, co považuji za dobré úpravy.
  • děkuji; jak pravděpodobně víte, odmítání úprav je v SE mnohem častější než jejich přijímání (i částečné); děkuji, že jste mi dali vědět, že jiný uživatel úpravu odmítl (neviděl jsem to ‚ upřímně) a že jste zvážil vložení alespoň některých svých úprav do vaší odpovědi; Velmi to respektuji,

Odpověď

Výstup help declare je docela strohý. Jasnější vysvětlení lze najít v man bash nebo info bash – druhé je zdrojem toho, co následuje.

Nejprve několik definic. O proměnných a atributech :

parametr je entita, která ukládá hodnoty. … proměnná je parametr označený name. Proměnná má hodnotu a nula nebo více atributů . Atributy jsou přiřazovány pomocí integrovaného příkazu declare

A o declare integrovaném :

declare

 declare [-aAfFgilnrtux] [-p] [name[=value] …]  

Deklarovat proměnné a dát jim atributy. Pokud nejsou uvedeny žádné názvy, zobrazte místo nich hodnoty proměnných.

-n
Každému dejte name the nameref attribute, což je název odkaz na jinou proměnnou. Tato další proměnná je definována hodnotou name . Všechny odkazy, přiřazení a úpravy atributů name , s výjimkou těch, které používají nebo mění samotný atribut -n, se provádějí na proměnné, na kterou odkazuje hodnota názvu . …

Upozorňujeme, že proměnné reference na název jsou k dispozici pouze v Bash 4.3 nebo novějším 1 .

Také pro užitečný úvod do declare a proměnných atributů v Bashi vás odkazuji na toto odpovězte na “ Co dělají declare name a declare -g? “ (který se však zaměřuje hlavně na rozsah proměnných).


V zásadě 2 , declare name=[value] je ekvivalentní přiřazení name=[value], které pravděpodobně znáte. V obou případech je name přiřazena hodnota null hodnota, pokud value chybí.

Upozorňujeme, že mírně odlišný declare name místo toho nenastaví proměnná name 3 :

 $ declare name ## With the -p option, declare is used to display ## attributes and values of variables $ declare -p name declare -- name ## "name" exists ## Parameter expansion can be used to reveal if a variable is set: ## "isunset" is substituted to "name" only if unset $ echo "${name-isunset}" isunset  

Proměnná name tedy může být:

  • deklarována a unset , po declare name;
  • deklarováno a nastaveno pomocí null jako hodnotu, po name= nebo declare name=;
  • deklarovaném , set a s nenulovou hodnotou po name=value nebo .

Obecněji declare [options] name=value

  1. vytvoří proměnnou name – což je parametr s názvem, který je zase jen část paměti, kterou můžete použít k ukládání informací 4 ;
  2. přiřadí hodnota value k tomu;
  3. volitelně nastaví atributy name „, které definují jak druh hodnoty, může ukládat (ne ve smyslu typu , přesně řečeno, protože Bashův jazyk není napsán) a způsoby, jak s ním lze manipulovat.

Atributy jsou pravděpodobně jednodušší vysvětlit na příkladu: použití declare -i name nastaví atribut “ celé číslo “ z name, necháme to považovat za celé číslo; citováním manuálu bude provedeno “ aritmetické vyhodnocení, když je proměnné přiřazena hodnota „:

 ## Let"s compare an ordinary variable with an integer $ declare var $ declare -i int $ var="1+1" $ int="1+1" $ echo "$var" 1+1 ## The literal "1+1" $ echo "$int" 2 ## The result of the evaluation of 1+1  

Ve světle výše se v kódu ilkkachu děje to, že:

  1. Je deklarována proměnná s názvem ref s “ nameref “ sada atributů a obsah $1 (první poziční argument) je přiřazen it:

     declare -n ref="$1"  

    Cíl referenční proměnné názvu, například ref je držet název jiné proměnné, která by obecně nebyla známa předem, možná proto, že chceme, aby byla dynamicky definována (např. Protože chceme znovu použít část kódu a mít ji aplikován na několik proměnných) a na poskytují pohodlný způsob, jak na něj odkazovat (a manipulovat s ním). (Není však jediný: indirection je alternativa; viz Rozšíření parametrů shellu ).

  2. Kdy hodnota proměnné tmp1 je přiřazena ref:

     ref=$tmp1  

    je implicitně deklarována další proměnná, jejíž název je hodnotou ref. Hodnota tmp1 je také nepřímo přiřazena implicitně deklarované proměnné pomocí tohoto explicitního přiřazení k ref .

V rámci vaší propojené otázky volání read_and_verify as

 read_and_verify domain "Prompt text here..."  

deklaruje proměnnou domain a přiřaďte mu hodnotu tmp1 (tj. vstup uživatele). Je přesně navržen tak, aby znovu použil kód, který s uživatelem interaguje, a využil proměnnou nameref deklarovat domain a několik dalších proměnných.

Abychom se podrobněji podívali na implicitní část, můžeme postup krok za krokem reprodukovat:

 ## Assign a value to the first positional argument $ set -- "domain" ## Declare the same "tmp1" variable as in your code $ tmp1="value for domain" ## Declare a "ref" variable with the nameref attribute set and ## assign the value "domain" to it $ declare -n ref="$1" ## Note that there is no "domain" variable yet $ declare -p domain bash: declare: domain: not found ## Assign a value to "ref" and, indirectly, to the "domain" variable ## that is implicitly declared $ ref=$tmp1 ## Verify that a variable named "domain" now exists, and that ## its value is that of "tmp1" $ declare -p domain declare -- domain="value for domain" ## Verify that "ref" is actually a reference to "domain" $ domain="new value" $ echo "$domain" new value $ declare -p ref declare -n ref="domain" $ echo "$ref" new value  

1 Odkaz: ZMĚNY soubor, sekce “ 3. Nové funkce v Bash „, bod “ w „.
Může to být relevantní: například CentOS Linux 7.6 (aktuálně nejnovější verze) je dodáván s Bash 4.2 .

2 Jako obvykle u shell builtins, vyčerpávající a stručné vysvětlení je nepolapitelné, protože provádějí různé, možná heterogenní akce. Zaměřím se pouze na deklaraci, přiřazení a nastavení atributů a seznam, stanovení rozsahu a odebrání atributů budu považovat za mimo rozsah této odpovědi.

3 Toto chování declare -p bylo zavedeno v Bash 4.4. Odkaz: Soubor CHANGES , část “ 3. Nové funkce v Bash „, bod “ f „.
Jako G-Man zdůraznil v komentářích, v Bash 4.3 declare name; declare -p name přináší chybu. Stále však můžete zkontrolovat, zda name existuje s declare -p | grep "declare -- name".

4 FullBashGuide, Parametry na mywiki.wooledge.org

Komentáře

  • (1) Nemohu reprodukovat výsledky, které ukazuješ ve svém prvním bloku kódu: declare name následovaný declare -p name získá „bash: declare: name: not found“. (Ačkoli declare -p | grep na přináší declare -- name.) (2) Domnívám se, že je trochu zavádějící představovat echo "${name-isunset}" v kontextu declare name, jelikož zachází s nedeklarovanou (tj. nedefinovanou) proměnnou stejně jako s deklarovanou ale deaktivovat proměnnou. (3) Možná budete chtít zmínit, že namerefs jsou k dispozici pouze v bash verzi 4.3 a vyšší.
  • @ G-Man Děkuji za vaše poznámky! I ‚ oslovím je, jakmile to bude možné, a ‚ případně aktualizuji svoji odpověď. Pokud jde o (1), můj GNU bash, version 5.0.7(1)-release (x86_64-pc-linux-gnu) na Arch Linuxu stále přináší výsledky, které jsem ukázal. Možná, že toto chování bylo představeno teprve nedávno, to ‚ prozkoumám.
  • Ano; ‚ Používám pouze verzi 4.3.
  • @ G-Man Odpověď aktualizována poznámkami o (1) a (3). O (2): Chtěl jsem ilustrovat, že declare x nenastavuje ‚ t x, zatímco declare x= ano. Nemohl jsem ‚ najít žádný odkaz na podporu tvrzení, že declare -- x (jako výstup declare -p x) znamená “ nenastaveno „, zatímco declare -- x="" znamená “ set „; přinesl jsem tedy ${parameter-word} expanzi, i když nemůže rozlišovat mezi “ unset “ a “ neexistuje ‚ „, jak podotknete. I ‚ si nejsem jistý, jak to mohu ve své odpovědi objasnit (aniž bych to čtenáře rozptylovalo od bodu).

Odpověď

Pokusím se to vysvětlit a pokusím se to vysvětlit, ale odpusť mi, pokud nebudu následovat příklad, který jsi uvedl. Raději se vás pokusím vést svým vlastním, odlišným přístupem.

Říkáte, že už rozumíte konceptům jako „proměnné“ a „jejich rozšiřování“ atd., Takže některé z nich jen prozkoumám základní znalosti, které by jinak vyžadovaly hlubší zaměření.

Začnu tedy tím, že základní level, příkaz declare je jen způsob, jak říct Bashovi, že potřebujete proměnnou hodnotu (tj. hodnotu, která se může během provádění skriptu změnit) a že budete odkazujte na tuto hodnotu pomocí konkrétního názvu, přesně podle názvu, který uvedete vedle samotného příkazu declare.

To znamená:

 declare foo="bar"  

řekne Bashovi, že chcete, aby proměnná s názvem foo měla hodnotu bar.

Ale … počkejte minutu … můžeme udělejte to bez použití declare, nemůžeme. Stejně jako v:

 foo="bar"  

Velmi pravdivé.

No , stává se, že výše uvedené jednoduché přiřazení je ve skutečnosti implicitním způsobem pro .. ve skutečnosti .. deklaraci proměnné.

( Stává se také, že výše uvedené je jedním z několika způsobů změňte hodnotu proměnné s názvem foo; je to přesně ta nejpřímější, výstižný, evidentní, přímočarý způsob .. ale není to jediný .. .. k tomu se vrátím později .. ).

Ale pak, pokud je to tak je možné deklarovat „název, který bude označovat proměnné hodnoty“ (z důvodu stručnosti dále jen „proměnná“) bez použití declare, proč byste někdy chtěli použít tento pompézní příkaz „declare“?

Odpověď spočívá ve skutečnosti, že výše uvedené znamená Způsob, jak deklarovat proměnnou (foo="bar"), to .. implicitně .. přiměje Bash uvažovat o tom, že proměnná je typu, který se nejčastěji používá v typickém scénáři použití pro shell .

Takový typ je typ řetězce, tj. posloupnost znaků bez zvláštního významu. Řetězec je tedy to, co získáte, když použijete implicitní deklaraci.

Ale vy, jako programátor, musíte někdy spíše uvažovat o proměnné jako např. O čísle .. na kterém musíte dělat aritmetiku operace .. a použití implicitní deklarace jako foo=5+6 nebude způsobí, že Bash přiřadí hodnotu 11 foo jako můžete očekávat. Spíše přiřadí foo sekvenci tří znaků 5 + 6.

Takže .. potřebujete způsob, jak říct Bashovi, že chcete, aby foo byl považován za číslo, ne za řetězec .. a k tomu se hodí explicitní declare.

Stačí říct:

 declare -i foo=5+6 # <<- note the "-i" option: it means "integer"  

a Bash s radostí provede matematiku za vás a proměnné iv id = „přiřadí číselnou hodnotu 11 085c82de67 „>

.

To znamená: vyslovením declare -i foo dáte proměnné foo atribut toho, že je celé číslo.

Deklarace čísel (přesně celá čísla, protože Bash stále nerozumí desetinným místům, plovoucím čárkám atd.) může být prvním důvodem pro použití declare, ale není to jediný důvod. Jak jste již pochopili, proměnným můžete dát několik dalších atributů. Například můžete mít Bash, aby hodnotu proměnné vždy nastavil na velká písmena bez ohledu na to: pokud řeknete declare -u foo, pak od té doby, když řeknete foo=bar Bash ve skutečnosti přiřadí řetězec BAR proměnné foo.

Aby bylo možné dát některý z těchto atributů k proměnné musíte použít příkaz declare, není jiná možnost.


Nyní ještě jedna z atributy, které můžete zadat prostřednictvím declare, je neslavný atribut „name-ref“, atribut -n. ( A nyní obnovím koncept, který jsem pozastavil dříve ).

Atribut name-ref v zásadě umožňuje programátorům Bash jiný způsob, jak změnit hodnotu proměnné. Přesněji poskytuje nepřímý způsob, jak toho dosáhnout.

Zde je jak to funguje:

Jste declare proměnná s atributem -n a je velmi doporučujeme (i když to není striktně vyžadováno, ale dělá to jednodušší), že zároveň dáte hodnotu této velmi proměnné na stejné declare. Takto:

 declare -n baz="foo"  

To Bashovi říká, že od té doby při každém použití nebo změně hodnoty proměnné s názvem baz bude skutečně použita nebo změna hodnoty proměnné s názvem foo.

Což znamená, že od té doby jo můžete říci něco jako baz=10+3, aby foo získal hodnotu 13.Za předpokladu, že foo bylo dříve deklarováno jako celé číslo (declare -i), jako jsme to udělali před pouhou minutou, jinak získá sekvenci ze čtyř znaků 1 0 + 3.

Také: pokud změníte hodnotu foo přímo, jako v foo=15, uvidíte 15 také vyslovením echo “${baz}”. Důvodem je, že proměnná baz deklarovaná jako název ref foo vždy odráží foo value.

Výše uvedený declare -n příkaz je označován jako „name-reference“, protože vytváří proměnnou baz odkazovat na název jiné proměnné. Ve skutečnosti jsme deklarovali, že baz má hodnotu „foo“, kterou kvůli možnosti -n zpracovává Bash jako název pro další proměnná.

Nyní, proč na Zemi byste to někdy chtěli udělat?

No .. stojí za to říci, že se jedná o funkci pro docela pokročilé potřeby.

Ve skutečnosti tak pokročilý, že když programátor narazí na problém, který by skutečně vyžadoval označení názvu, je také je pravděpodobné, že takový problém by měl být spíše vyřešen použitím vhodného programovacího jazyka místo Bash.

Jednou z těchto pokročilých potřeb je například to, když jako programátor během vývoje nemůžete vědět kterou proměnnou budete muset použít v určitém bodě skriptu, ale bude plně známa dynamicky za běhu. A vzhledem k tomu, že žádný programátor nemůže za běhu zasahovat, jedinou možností je zajistit předem pro takovou situaci ve skriptu a „životopis“ může být jediným životaschopným cesta. Jako obecně známý případ použití této pokročilé potřeby zvažte například zásuvné moduly. Programátor programu podporujícího „zásuvné moduly“ musí předem provést obecná opatření pro budoucí (a možná i třetí) zásuvné moduly. Programátor proto bude muset v Bashi používat zařízení, jako je ref. Jmen.

Další pokročilou potřebou je, když se musíte vypořádat s velkým množstvím dat v RAM a také musíte předat tato data kolem funkcí vašeho skriptu, které také musíte tato data během cesty upravit. V takovém případě byste určitě mohli zkopírovat tato data z jedné funkce do jiné (jako to Bash dělá, když děláte dest_var="${src_var}" nebo když vyvoláváte funkce jako v myfunc "${src_var}"), ale vzhledem k obrovskému množství těchto dat by to znamenalo obrovské plýtvání RAM a pro velmi neefektivní provoz. Řešení, pokud takové situace nastanou, je tedy použít ne kopii dat, ale odkaz na tato data. V Bash, ref. Jména Tento případ použití je ve všech moderních programovacích jazycích opravdu normou, ale je zcela výjimečný, pokud jde o Bash, protože Bash je většinou navržen pro krátké jednoduché skripty, které se většinou zabývají soubory a externími příkazy, a proto Bash skripty zřídka musí projít množství dat mezi funkcemi. A když funkce skriptu potřebují sdílet některá data (přistupovat k nim a upravovat je), obvykle se toho dosáhne pouhým použitím globální proměnné, což je ve skriptech Bash zcela běžné, stejně jako velmi zastaralé ve správných programovacích jazycích.

Potom může existovat pozoruhodný případ použití jmen v Bash a (možná ironicky) je přidružen, když používáte ještě jiné typy proměnných:

  1. proměnné, které jsou deklarovány jako „indexovaná pole“ (declare -a)
  2. proměnné, které jsou deklarovány jako „asociativní pole“ (declare -A).

Jedná se o typ proměnných, které lze snadněji (a také efektivněji) předávat funkcím používáním názvů namísto běžného kopírování, i když nepřenášejí obrovské množství dat.

Pokud všechny tyto příklady zní divně a stále nepochopitelně, je to jen proto, že názvové odkazy jsou skutečně pokročilé téma a vzácná potřeba typického scénáře použití B. popel.

Mohl bych vám říci o příležitostech, pro které jsem pro jednoho našel použití pro jména v Bash, ale zatím to byly většinou pro „esoterické“ a komplikované potřeby, a já obávám se, že kdybych je popsal, komplikoval bych vám to pouze v tomto bodě vašeho učení. Stačí zmínit nejméně složité (a možná ne esoterické): vrácení hodnot z funkcí. Bash tuto funkci opravdu nepodporuje, takže jsem to samé získal pomocí name-refs. Toto je mimochodem přesně to, co dělá váš příkladový kód.


Kromě toho malá osobní rada, která by se ve skutečnosti lépe hodila pro komentář, ale já jsem ji nedokázal dostatečně zhuštit. aby se vešly do limitů komentáře StackExchange.

Myslím si, že nejvíce , co byste měli v tuto chvíli udělat, je jen experimentovat s ref. jmény pomocí jednoduchých příkladů, které jsem ukázal, a možná s příkladem kódu, který jste poskytli, bez ohledu na pro tuto chvíli část „proč na zemi“ a zaměřuje se pouze na část „jak to funguje“. Trochu experimentováním může část „jak“ lépe zapadnout do vaší mysli, takže vám část „proč“ vyjasní v pravý čas, kdy (nebo jestli) budete mít skutečný praktický problém, pro nějž název – ref by se opravdu hodil.

Komentáře

  • LL3 Vaše odpověď se mi moc líbí a palec nahoru: Konečně chápu, co prohlašuje – – nedeklarovat proměnné, ale deklarovat jejich atributy; ale bohužel jsem ztratil přehled, když jsi začal vysvětlovat, co je to název. Nemám ponětí, co to dělá a proč to používat.
  • To je důvod – proč by někdo dal tento atribut
  • @JohnDoea vidím. Možná byste pro tuto chvíli mohli toto téma opustit. Je pravděpodobně příliš brzy pochopit tento koncept v aktuálním bodě vašeho učení. Každopádně jsem svou odpověď rozšířil o další příklady a také o malý osobní dodatek o tom, jak si myslím, že byste měli postupovat. Rovněž jsem vložil vodorovné čáry, abych oddělil obecné vysvětlení declare od konkrétního vysvětlení -n z osobního dodatku. Sem tam jsem také trochu přeformuloval, ale nic podstatného, takže si myslím, že si můžete znovu přečíst část -n a malý dodatek.
  • Děkuji, myslím, že ‚ je v pořádku, abych se o tom právě teď učil, potřebuji jen vysvětlení, kterému rozumím, a měl bych si dnes znovu přečíst celou vaši odpověď, ‚ jsem tady.
  • Uvádíte foo="bar" a declare foo="bar" . Možná byste chtěli zmínit (i když pouze v poznámce pod čarou), že ve funkci shellu declare foo="bar" vytvoří místní proměnnou a foo="bar" vytvoří globální proměnná.

Odpověď

Obecně declare v bash prostředí nastavuje (nebo odebírá nebo zobrazuje) atributy na proměnné. Atribut je druh anotace, která říká „toto je odkaz na jméno“ nebo „toto je asociativní pole“ nebo „tato proměnná by měla být vždy vyhodnocena jako celé číslo“ nebo „tato proměnná je pouze pro čtení a nemůže be re-set „, or“ this variable is exported (an environment variable) „atd.

Vestavěný typeset je synonymem pro declare v bash, protože typeset se používá v jiných skořápkách (ksh, odkud pochází, a zsh například) pro nastavení atributů proměnných.


Podíváme se blíže na příklad odkazu na název v otázka:

Funkce shellu, kterou zobrazíte, s přidanou trochou kódu, který ji používá:

#!/bin/bash function read_and_verify { read -p "Please enter value for "$1": " tmp1 read -p "Please repeat the value to verify: " tmp2 if [ "$tmp1" != "$tmp2" ]; then echo "Values unmatched. Please try again."; return 2 else declare -n ref="$1" ref=$tmp1 fi } read_and_verify foo printf "The variable "foo" has the value "%s"\n" "$foo" 

Spuštění tohoto:

 $ bash script.sh Please enter value for "foo": hello Please repeat the value to verify: hello? Values unmatched. Please try again. The variable "foo" has the value "" 

To ukazuje, že proměnná foo není nastavena na nic, když uživatel zadá dvě různé řetězce.

To ukazuje, že proměnná foo se nastaví na řetězec, který uživatel zadal, když dvakrát zadal stejný řetězec .

Způsob, jakým $foo získá hodnotu hello v hlavní části skriptu, je v následujících řádcích ve funkci shellu:

declare -n ref="$1" ref=$tmp1 

kde $tmp1 je řetězec hello zadaný uživatelem a $1 je řetězec foo předaný na příkazovém řádku funkce z hlavní části skript.

Všimněte si, že proměnná ref je deklarována s declare -n jako proměnnou odkazu na název a hodnotou foo se v této deklaraci uvádí jako hodnota. To znamená, že od tohoto okamžiku, dokud proměnná neprojde z rozsahu, bude jakékoli použití proměnné ref stejné jako použití foo. Proměnná ref je referenční proměnná názvu odkazující na foo v tomto okamžiku.

To má za následek, že přiřazení hodnoty k ref, jak je to provedeno na řádku za deklarací, přiřadí hodnotu foo.

Hodnota hello je poté k dispozici v $foo v hlavní části skriptu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *