Ответ 1
print
, open
, split
не являются подпрограммами. Они не приводят к подзаголовкам. Они даже не присутствуют в таблице символов (в main::
или в противном случае, хотя вы можете ссылаться на них как CORE::split
и т.д.), И нельзя получить ссылку на их код (хотя выполняется работа по созданию прокси-подсистем для них в CORE::
, если вы хотите рассматривать их как подпрограммы). Они являются операторами, как +
.
$ perl -MO=Concise,-exec -e'sub f {} f()'
1 <0> enter
2 <;> nextstate(main 2 -e:1) v:{
3 <0> pushmark s
4 <#> gv[*f] s
5 <1> entersub[t3] vKS/TARG,1 <--- sub call
6 <@> leave[1 ref] vKP/REFC
-e syntax OK
$ perl -MO=Concise,-exec -e'split /;/'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 </> pushre(/";"/) s/64
4 <#> gvsv[*_] s
5 <$> const[IV 0] s
6 <@> split[t2] vK <--- not a sub call
7 <@> leave[1 ref] vKP/REFC
-e syntax OK
$ perl -MO=Concise,-exec -e'$x + $y'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <#> gvsv[*x] s
4 <#> gvsv[*y] s
5 <2> add[t3] vK/2 <--- Just like this
6 <@> leave[1 ref] vKP/REFC
-e syntax OK
Они известны под разными названиями:
- встроенные функции
- Функции
- встроенные команды
- названные операторы
И большинство из них считается одним из следующих:
- Оператор списка
- названный унарный оператор
Подпрограммы часто называются функциями (как в C и С++), поэтому "функция" является двусмысленным словом. Эта двусмысленность, по-видимому, лежит в основе вашего вопроса.
Что касается while
, for
, unless
и т.д., они являются ключевыми словами, используемыми "операторами управления потоком"
while (f()) { g() }
и "модификаторы операторов"
g() while f();