LINUX.ORG.RU

Функция хочет знать, как её зовут

 , oopshit, oopsucks,


1

3
(my $s=[caller(undef)]->[3])=~s/(??{ __PACKAGE__ }):://;

Или:

my $s=[caller(undef)]->[3];
substr($s,0,rindex($s,"::")+2)="";

Есть подспудное ощущение, что оба способа немного ужасны.

Собственно, вопроса даже 2:

1) Почему caller с параметром, например, «4» (циферкой) - возвращает пустую строку, хотя тут http://perldoc.perl.org/functions/caller.html говорят, что так быть не должно

2) Нельзя ли как-то сразу получить имя функции, очищенное от имени пакета?

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 1)

Ответ на: комментарий от outtaspace

Функции надо использовать своё имя, поскольку оно как минимум говорит о том, что она делает :)

Однострочник с функцией, которая счастливо узнала своё имя и теперь знает, что ей нужно делать :)

sub g { print do { my $s=[caller(undef)]->[3]; substr($s, rindex($s,"::")+2) },"\n" }; sub f { g() }; f()

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от outtaspace

А не знаете, что за фигня с вызовом caller(4) - ведь должно же возвращать массив из 5-и элементов, а возвращает полный нихил.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Пайтон-то куда говёнее выглядит, пайтон больше всего похож на скороговорки старшины срочной службы: ортогонально, бессодержательно, с претензией на грубую оригинальность, но в итоге всё равно сотрясение воздуха.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от Stil

Ну, это куда лучше, чем написать 100500 строк описания класса, потом наследований, потом примеси... А в итоге всё равно какую-то тормозную муть будут выполнять всего 5 строчек.

Функциональный стиль = «меньше слов - больше дела».

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от Stil

Поток данных там тоже не при чем.

anonymous
()
Ответ на: комментарий от DRVTiny

с функцией, которая счастливо узнала своё имя и теперь знает, что ей нужно делать :)

У вас функции с тонкой душевной организацией? Полное имя не подходит чтобы правильно делать что-то полезное?

package main;

x();
main::x();
outtaspace ★★★
()
Ответ на: комментарий от DRVTiny

Почему caller с параметром, например, «4» (циферкой)
например

массив из 5-и элементов

Ты вообще читал, то что там написано? Какие 5 элементов? без аргумента 3, с аргументом 11. И аргумент там совсем не «например»:

The value of EXPR indicates how many call frames to go back before the current one

disarmer ★★★
()
Ответ на: комментарий от DRVTiny
anonymous: Перл -- гавно
DRVTiny: Но вот зато Питон ещё хуже!
anonymous
()
Ответ на: комментарий от DRVTiny

В манямирке пожирателей перловки врагом номер один почему-то всегда представляется пистон. Наверное, потому что похапе и раби смиренно переняли довольно много ФИЧ СИНТАКСИСА пердла, а у Гнидо хватило ума не жрать говно, бггггг.

Deleted
()
Ответ на: комментарий от outtaspace

Ё-моё, уровень вложенности же! :)

Спасибо!

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от outtaspace

У меня имя функции используется как часть имени файла, из которого читается время последнего запуска этой функции, поэтому main:: здесь совсем не в тему.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Как бы стек-трейс :)

#!/usr/bin/perl
use strict;
use warnings;

sub f1;
sub f2;
sub f3;

sub f1 {
 f2()
}

sub f2 {
 f3()
}

sub f3 {
 my $i=0;
 my @s;
 my $p=length(__PACKAGE__)+2;
 while ( my @a=caller($i++) ) {
  unshift @s, substr($a[3],$p);
 }
 print '['.join(".",@s).']',"\n"
}

f1();
DRVTiny ★★★★★
() автор топика

Почему caller с параметром, например, «4» (циферкой) - возвращает пустую строку

http://www.perlmonks.org/?node_id=953409 сорри, не дружу с инглишем.

Нельзя ли как-то сразу получить имя функции, очищенное от имени пакета?

чем тебе мешает имя пакета, особенно если оно осмысленно названо?

( split /::/, [caller 0]->[3] )[-1]
Deleted
()
Ответ на: комментарий от DRVTiny

Maybe, стоит сначала выучить язык, а потом научиться читать на этом языке?

Maybe стоит сначала выучить Ооп, прежде чем писать оопшит и оопсакс в тегах к вопросу, который к Ооп отношения не имеет?

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Maybe стоит сначала выучить Ооп, прежде чем писать оопшит и оопсакс в тегах к вопросу, который к Ооп отношения не имеет?

Ответ: НЕТ, - устроит?

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

И да, хотелось бы отметить, что религию невозможно выучить, ей можно только анально подчиниться.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

ну вот, руки же не отвалились? можешь, если хочешь, даже на перле по-человечески писать.

еще вокруг «=» пробелы научись ставить и отступы побольше сделай.

MyTrooName ★★★★★
()
Ответ на: комментарий от DRVTiny

Пайтон-то куда говёнее выглядит

Давайте выбирать язык по тому как он выглядит, вот это критерий я понимаю.

loz ★★★★★
()
Ответ на: комментарий от loz

Мы же о синтаксисе говорили, вот я и сравнил синтаксис.

А язык вообще обычно не выбирают - на чём заставят, на том и напишешь :)

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

Собственно, знаменитая книга с верблюдом как раз призывает писать и думать на Perl, а не «по человечески». Да и если посмотреть на LISP-программы - что в них человеческого? Тем не менее, никто же не призывает рубить руки LISP-программистам :)

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

Безусловно, грустно, что в программировании систематически берут вверх самые тормозные, самые многословные и самые ориентированные на стадную разработку технологии.

Думаю, это связано с тотальным потреблядством и «вынужденным» подчинением всего и вся идеологии «побеждает тот, кто предлагает больше дешёвого говна для удовольствий и лезет с этим говном в окно, когда его выставили за дверь!!!»

Собственно, сколько я свою жизнь написал тех же конечных автоматов - ни разу даже не задумывался ни о каком ООП применительно к ним. А тут, оказывается, конечный автомат без ООП - прямо какой-то не такой, без слов «class», «new», «inherit» и прочей подобной хрени оно будет работать как-то совсем не так хорошо, как надобно.

DRVTiny ★★★★★
() автор топика
Последнее исправление: DRVTiny (всего исправлений: 1)
Ответ на: комментарий от DRVTiny

на чём заставят, на том и напишешь

В таких случаях надо становится тем кто диктует правила. Заставляют писать на X? Для начала можно сказать X говно потому, а Y не говно поэтому, тут нужно иметь умение убеждать, авторитет и прочее. В конце концов можно просто поменять работу, с этим вроде проблем нет.

loz ★★★★★
()
Ответ на: комментарий от DRVTiny

Собственно, сколько я свою жизнь написал тех же конечных автоматов - ни разу даже не задумывался ни о каком ООП применительно к ним

А сложнее автоматов писал что-нибудь?

автомат без ООП - прямо какой-то не такой, без слов «class», «new», «inherit» и прочей подобной хрени оно будет работать как-то совсем не так хорошо, как надобно.

ООП - это вовсе не «class», «new», «inherit».

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

А сложнее автоматов писал что-нибудь?

А тебя мама в детстве не учила не задавать тупые вопросы?

ООП - это вовсе не «class», «new», «inherit».

Спасибо, кэп.

Да, ООП - это груда говёного декларативного кода, который может вообще нихрена полезного не делать, но при этом его объём будет увеличиваться вместе со стоимостью проекта, а начальство бует довольно тем, что «работа идёт и все при деле».

Я с ужасом вспоминаю копания в исходниках на Java, где те строки кода, которые делают что-то полезное и нужное пользователю (что и нужно было модифицировать) - требовалось отыскать по принципу иголки с стоге... гм, дурно пахнущего сена.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от loz

В таких случаях надо становится тем кто диктует правила.

Правила всегда диктует тот, кто зарабатывает деньги :)

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

А тебя мама в детстве не учила не задавать тупые вопросы?

А тебя мама в детстве не учила основам культурного поведения в обществе?

yoghurt ★★★★★
()
Ответ на: комментарий от DRVTiny

Тем не менее, никто же не призывает рубить руки LISP-программистам :)

лютое 4.2

MyTrooName ★★★★★
()
Ответ на: комментарий от DRVTiny

Я сразу не врубился, что за «call frames»...

Воздержись от комментариев о других языках пару лет.

zz ★★★★
()
Ответ на: комментарий от yoghurt

Меня мама ещё учила держаться подальше от общества людей определённого сорта, не буду тыкать в тебя пальцем, но... в общем, именно таких.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от loz

Интегратор зарабатывает на всём подряд :) Кстати, удивительно, но от наших программистов ни разу не слышал ничего мутного, ООП-ориентированного. Все почему-то решают практические задачи, а не то, как и от чего им там унаследовать.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Меня мама ещё учила держаться подальше от общества людей определённого сорта, не буду тыкать в тебя пальцем, но... в общем, именно таких.

О, вот за это спасибо, держись, пожалуйста :)

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.