LINUX.ORG.RU

Новые переспективы нового Perl'а


0

0

На прошлой неделе прошла пятая конференция, посвященная языку Perl, на которой, в частности, были рассмотрены перспективы новой, разрабатываемой в настоящее время версии языка Perl 6. В своем докладе создатель языка Ларри Уолл описал нововведения и изменения, которые, вероятно, появятся в Perl 6.

>>> Подробности

anonymous

Проверено:

Не понимаю зачем язык постоянно менять..

От этого только проблемы несовместимости. Вот в C например никаких кардинальных изменений (типа исчезания ключевых слов) уже давно небыло. Из последних помню только //-комментарии и unicode.

anonymous
()

Не нравится мне perl. Это же убожество каждую переменную $ обозначать. Единственный + это регулярные выражения, but их в С\С++ реализовать тоже можно. Также мне не по душе AT&T синтаксис ассемблера (movl 0x20(%ebx),%eax - ну не уродство ли? куда приятнее Intel синтаксис mov eax,[ebx+20h] ;-).

Проще надо быть, а не держа кнопку shift другой рукой тянутся к 4ке, чтобы написать этот долбанный $. ;-)

Высказал все ,что наболело... теперь легче ;-))

logIN
()

"От этого только проблемы несовместимости." а представляешь как рады разроботчики которые нaписали большие проекты.. теперь им надо править и синтаксис и структуру программы. =( Если так пойдет дальше от перла откажутся.

logIN
()

2logIN: Если программа на perl написана и работает, а тем более большие проекты, то менять версию perl просто никто не станет, зачем? Ты в курсе как переходили perl4->perl5? Больно, но радостно, я на этом perl4 нифига не могу понять как люди могли писать ;-) В заголовках стояло #! /usr/bin/perl4 или #! /usr/bin/perl5, соответственно, вот и все дела, одновременно у тебя на машине может стоять несколько версий perl без проблем. "Это же убожество каждую переменную '$' обозначать" -- не каждую ;-) Есть ещё '@' и '%' ;-) Надо просто привыкнуть и все дела, я же не кричал, что в Алгол-68 перед каждым ключевым словом надо '.' ставить, а на бумаге подчеркивать ;-) Зато там можно было идентификаторы с пробелами пользовать ;-)

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

а кто заставляет переписывать старые проекты? можно просто #!/usr/bin/perl5 и #!/usr/bin/perl6 делать. Вот вот модуля переписать возможно прийдётся. Но опять же, конвертор из perl5 в perl6 сделать не сложно. И вообще Ларри Уолл достаточно умён чтоб это всё учесть. Да и эти архитектурные изменения perl'а уже давно созрели и сделаны дабы остаться конкурентно способными по отношению к Pithon и Rubi, многое полезное из нихбудет перенесено в perl6. Вообщем должна получиться вещь. Да, а перл я люблю :)

anahoret
()

"В заголовках стояло #! /usr/bin/perl4 или #! /usr/bin/perl5, соответственно, вот и все дела, одновременно у тебя на машине может стоять несколько версий perl без проблем."
"можно просто #!/usr/bin/perl5 и #!/usr/bin/perl6 делать"

А.. ну правельно, теперь мне надо ставить и perl5 и 6, ведь одни пакеты перейдут на perl6 а другие до конца века останутся на 5ом (я о том, что всякие пакеты типа xfree\qt\kde e.t.c. требуют перла для компилинга). + Как сказал Ларри pure perl без модулей - бесполезен. Будет ли в поставку perl6.tar.gz входить модули? Или я должен ползать по фтп серверам в поисках нужного модуля? Этого гемороя (сорри) мне достаточно с обычными lib'ами. =)

"Надо просто привыкнуть и все дела"

Привыкнуть можно ко всему, но это очередной барьер для тех кто хочет писать на перле (я не хочу ;-). Все должно быть логично, и тем более без лишних знаков припинания.

"Вот С\С++ - правильный язык" (с) реклама пива =)

logIN
()

Реализуй на С

это регулярные выражения, but их в С\С++ реализовать тоже можно.

например вот это print map {s/\s+(\.|,|:|;)/$1/g, $_} <>;

Если не в курсе, что делает одна эта строчка я расскажу обрабатывает неограниченный поток текста (пару сотен мегов например) - и удаляет пробельные символы между словами и знаками препинаний.

Мои знакомые на С смогли сделать аналог в страницу текста программы, но с ограничением на объем текста.

slashzone_ru
()

2slashzone_ru: "Мои знакомые на С смогли сделать аналог в страницу текста программы"
Передай занкомым что прочитали Кернигана и Ритчи, а уж потом брались писать программы. Вот пример (пишу с ходу не компилируя и не проверяя)
/*Лицензия: данный код запрещенно использовать в программах испольузующие gpl в том или ином виде, а также фашистам и коммунистам*/
char *TrimSpaces( char *pszText )
{
char szSpaces[] = { ',', ':', ';', ' ' };
char *pcCur = pszText, *pcDst = pszText;
int i;

for( ; *pcCur; pcCur++ )
{
for( i = 0; i < sizeof(szSpaces)/sizeof(szSpaces[0]); i++ )
{
if( szSpaces[i] == pcCur )
break;
}
if( i == sizeof(szSpaces)/sizeof(szSpaces[0]) )
*pcDst++ = *pcCur;
}

*pcDst = *pcCur; /* put '\0' at the end */

return pszText;
}

Функция обрабатывает текст сколько есть. Perl сам по себе написан на С, а соответсвенн любую функциональнсоть можно реализовать без проблем.

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

1. Рекомендую:
#define N(arr) (sizeof(arr)/sizeof((arr)[0]))
Вставь в любой свой любимый хедер. Да, лицензия: Эту строчку разрешено использовать всем, даже ограм.

2. Похоже, твоя _функция_ делает таки немного не то, что просили. Просили: удалить пробелы перед знаками(список знаков прилагается) препинания. Что делает твоя функа -- для меня загадка, кажется она пытается выбросить знаки препинания с пробелами вместе. 
"Пытается" -- поскольку там явно опечатка if( szSpaces[i] == pcCur ).

3. А где чтение файла _построчно_? Хинт: чтобы читать файл построчно, тебе надо написать свою функу, которая бы боролась за конец строки и с правильным выделением памяти под эту строку. Чтобы не читать файл построчно ты можешь прочитать его целиком в память. Ты правда так и собирался сделать?

4. А где собственно открытие файла, проверка параметров и т.д.? 

Вот и получается, что целиком программа будет _не меньше_ страницы текста. А про ограничение на размер -- это да, бредок, рождённый ленью.

Casus ★★★★★
()

Что-то подобное было в их первых версиях

Однако пробельные символы - это не только (усвояемогое мясо, тьфу) пробел, то и (мех) TAB, перевод строки (\n) и каретки (\r)

Например строчка "asdfa , sdfd: \r\n\t: sdfsdf ;" преобразуется в "asdfa, sdfd:: sdfsdf;"

"Perl сам по себе написан на С," - C написан на asm (?), asm в машинных кодах, ну а все это машина тьюринга, наверно :)

slashzone_ru
()

2Casus: "1. Рекомендую:
#define N(arr) (sizeof(arr)/sizeof((arr)[0]))"
Спасибо не надо...
"2. Похоже, твоя _функция_ делает таки немного не то, что просили"
Ой не дочитал, думал что надо удалить знаки препинания и пробелы (в регэкспах ни когда не разбирался)... Замените массив пробельных символов своим набором и радуйтесь.
"3. А где чтение файла _построчно_?"
А тут вы не дочитали "обрабатывает неограниченный поток текста" не ограниченны поток, эта функция так же обрабатывает не ограниченный поток (точнее буфер).
"А где собственно открытие файла"
stdin, stdout открывать не надо
"проверка параметров и т.д.?"
Так я же сразу сказал нет проверки. Но если так нужна добавь if( pszText )
"Вот и получается, что целиком программа будет _не меньше_ страницы текста"
Хотите я в это в одну строку закатаю? :) Будет понтяно примерно атк же как и perl... :)
2slashzone_ru: "Например строчка "asdfa , sdfd: \r\n\t: sdfsdf ;" преобразуется в "asdfa, sdfd:: sdfsdf;""
Чтоб достичь требуемого результатанужно в этой программе изменить (именно изменить, а не добавить) две сторчки...

Ogr
()

2Ogr: Опа! Ладно, по порядку. 1. Зря. Гораздо читабельнее if( i < N(myArray) ), чем деление sizeof'ов 2. "удаляет пробельные символы между словами и знаками препинаний." -- почти правильное описание ;-) Правильно как я сказал: "удаляет все пробелы перед знаками препинаний", замена "массива пробельных символов" не изменяет поведение _фукции_ на нужное. 3. Я читал оригинальный текст на perl, а не вольный пересказ от slashzone_ru на русском ;-) В оригинальном коде <> означает построчное чтение. Например, имеем "поток": "aaaa \n...bbbb .\n", в оригинальной программе часть "aaa \n" изменена не будет. Мы ведь говорим о программе с идентичным поведением? 4. Просили таки программу, кроме того, <> означает stdin тока в том случае, если не были переданы имена файлов как параметры.

Я думал, что ты хоть программировать умеешь, а похоже, что тока пальцы гнуть.

Casus ★★★★★
()

To: Maxcom 

Может при постинга хотя бы самой новости сделать проверку орфографии?
Вроде пока этого нигде нет, будем первыми.

Это к вопросу о "переспективах".

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

Ну уж нет! А то даже "при постинга" не проканает ;-) Ошибки -- наше достояние!

Casus ★★★★★
()

2Casus: "1. Зря. Гораздо читабельнее if( i < N(myArray) ),"
Во-первых, для int *Tmp; Выражение N(Tmp) даст плохой результат и придется заглядывать в define что там написано.
Во-вторых, тут же будет заявлено, что 'вон еще одна строчка и в итоге получается страница'
"замена "массива пробельных символов" не изменяет поведение _фукции_ на нужное"
Я ясно написал, замена двух строчек (хотя возможно трех, не суть важно).
"Мы ведь говорим о программе с идентичным поведением"
Я читал описание на русском, т.к. с перлом/регулярными выражениями не знаком. Я указал, на то что страница ну ни как не получается.
"Я думал, что ты хоть программировать умеешь, а похоже, что тока пальцы гнуть"
Три раза Ха.

Ogr
()

So Perl 7 will be the last major revision. In fact, Perl 7 will be so perfect, it will need no revision at all. Perl 6 is merely the prototype for Perl 7. :-) (C) by Larry Wall http://dev.perl.org/perl6/apocalypse/1#rfc141

RQ
()

Вот сейчас все кинутся убеждать Огра в достоинствах #define, в том как hard links в linux делать, и в том что как все нормальные C программеры #define используют. В крайнем случае научись CPP пользоваться.
Огр, ты если K&R читаешь так и прогу в К&R пиши а не в ANSI.
Кастати программа писана на уровне выпускника 10 класса средней специализированной школы.
И по русски прочитать стоит, просили написать прогу на C которая будет _повторять_ действия перловой. Ты Огр, в лучшем случае 20% проги написал и загордился пальцами. В школе 5ку поставят ;)

anonymous
()

2anonymous (*) (2001-08-02 03:55:07.0): "что как все нормальные C программеры #define используют"
Дефайн используют там где надо, а не где попало.
Ну а оставшийся бред, бредом все равно остается, как бы анонимус пальцы не гнул.

Ogr
()

Огр, да ты так и скажи что не чего тебе ответить когда тебя опускают :)
ЗЫ: не хорохорься, облажался, так с кем не бывает.

anonymous
()

2anonymous (*) (2001-08-02 04:03:54.0): "да ты так и скажи что не чего тебе ответить когда тебя опускают"
И это говорит опущенный анонимус... Что ж поделать бред и есть бред. Из претензий единственное что я принимаю, то что не дочитал описание до конца...

Ogr
()

Ogr, admit it, you are soooo screwed %)

anonymous
()

Бля, ну Орг и ламо однако...

anonymous
()

Хых... он даже код нормально съидентить не смог :)

anonymous
()

schema rulez

anonymous
()

2Ogr: На "C" с perl regexp не повоюешь , сам пытался ;-). Трудозатраты 1000 к 1 без отлова глюков. А примерчик слабоват, раз вызвал желание у кого-то врукопашную на "C" реализовать.

eda
()

2slashzone_ru и Casus: вы ребятки между собой с начала договоитесь, что данный фрагмент делает, а то один пишет, что
"Например строчка "asdfa , sdfd: \r\n\t: sdfsdf ;" преобразуется в "asdfa, sdfd:: sdfsdf;""
А другой
имеем "поток": "aaaa \n...bbbb .\n", в оригинальной программе часть "aaa \n" изменена не будет
Так, что перевод строки будет удален или нет? Блин линуксоиды сами не могут нормально оветить на этот вопрос.
Ну а к Вам Casus вопрос, чему верить "оригинальном коде <> означает построчное чтение" или "<> означает stdin тока в том случае, если не были переданы имена файлов как параметры", а?
2eda: "На "C" с perl regexp не повоюешь"
Я и не воюю. Я возмутился когда пишут такое "Мои знакомые на С смогли сделать аналог в страницу текста программы, но с ограничением на объем текста".
Реализация по Казусу занимает 36 строчек, что ни как не страница, и уж точно ни каких ограничений.
#include <stdio.h>

int TrimSpace( int *nIsPrevSpace, char cSym1, char cSym2 )
{
char chaSpaces[] = { ' ', '\r', '\t' };
char chaNonSpace[] = { '.', ',', ':', ';' };
int nIsItSpace, nIsNoSpace;
int i, nRetVal = 1;

i = -1; while( ++i < sizeof(chaSpaces)/sizeof(chaSpaces[0]) && chaSpaces[i] != cSym1 );
nIsItSpace = (i != sizeof(chaSpaces)/sizeof(chaSpaces[0]));
i = -1; while( ++i < sizeof(chaNonSpace)/sizeof(chaNonSpace[0]) && chaNonSpace[i] != cSym1 );
nIsNoSpace = (i != sizeof(chaNonSpace)/sizeof(chaNonSpace[0]));

if( (nIsNoSpace && *nIsPrevSpace) || (nIsItSpace && *nIsPrevSpace) )
nRetVal = 0;

*nIsPrevSpace = nIsItSpace;

return nRetVal;
}

int main(int argc, char* argv[])
{
FILE *fpIn = (argc > 1) ? fopen( argv[1], "rt" ) : stdin;
FILE *fpOut = (argc > 2) ? fopen( argv[2], "wt" ) : stdout;
int nIsSpace = 0;
char cSym1, cSym2;
int nPEof = 1, nCEof;

if( fpIn && fpOut )
for( cSym1 = fgetc( fpIn ), nCEof = feof(fpIn); !nCEof || !nPEof; cSym2 = cSym1, nPEof = nCEof, cSym1 = fgetc(fpIn), nCEof = feof(fpIn) )
if( TrimSpace( &nIsSpace, cSym1, cSym2 ) && !nPEof )
fputc( cSym2, fpOut );
return 0;
}

Ogr
()

Ogr: Ты абсолютно зря воюешь - Перл для обработки текстов ГОРАЗДО
удобней чем Ц/Ц++, это по-моему признано всеми, к тому-же если тебе
станет от этого легче то он есть и под "всеми обожаемый Виндовс"
(только он там чуток хуже - уж больно эта Вин кривая).


buddha
()

Нужно быть еще тем маньяком, чтобы тексты с помощью С обрабатывать :))) Без хорошего знания алгоритмов, необходимых для реализации конкретных действий решение на С:
а) будет на порядок дольше писаться
б) на порядок дольше отлаживаться
в) будет медленнее работать :))))
Кроме, конечно, самых простых задач :)))
Поспорить можно лишь с пунктом "в".
Нафига велосипед изобретать? :)) И вообще - перл рулеззззз :)))
http://perl.oreilly.com/news/swedishpension_0601.html

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

в) будет медленнее работать :)))) ------------------------------------------------------------------- Бредишь. Не может интерпретируемый язык работать быстрее компилируемого. Perl - хороший язык, но сравнивать его с С/С++ не надо, каждому овощу свой огород.

TARANTUL
()

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

Havoc ★★★★
()

"Бля, ну Орг и ламо однако...
anonymous (*) (2001-08-02 06:02:41.0)"
клоун, ты. Орг чутли не в первый раз высказал _аргументированно_ свое мнение, и в данном случае был прав. На С\С++ реализовать regexp можно, другое дело - нужно ли? Нужно. Если мне в большом С\С++ проекте нужен regexp то, что мне надо вызывать внешний perl только для regexp'a?

"ты если K&R читаешь так и прогу в К&R пиши а не в ANSI."
А если я читал книжки по Java то и в С\С++ программах должен писать на Jave ?;-) K&R это основа, которую нужно прочитать для общего развития даже если читал ansi c.

"Только другому человеку понять, что ты там понаписывал со своими регекспами будет весьма сложно."
А зачем комуто понимать? Ты часто пытаешься понять исходники svgalib?
Просто можно реализовать библиотеку и назвать ее libRegExp. Делов то. ;-)

logIN
()

TARANTUL: не тормози - может, и еще как. Перловые регэкспы писаны на том же C, и реализованы достаточно эффективно - настолько эффективно, что вряд-ли средний программист сможет 'навскидку' закодировать более-менее нетривиальный алгоритм обработки строки, который будет работать быстрее аналогичного regexp на перле.
Мне в Перле не нравится другое - этот язык неустоявшийся, без единой линии развития, того что буржуи называют coherent design. Вносить (несовместимые!) изменения в синтаксис языка только ради синтаксиса (не затрагивая семантику) - идиотизм.
Впрочем, это видимо согласуется с подходом большинства perl mongers - решать задачи на 90%. Взять хотя бы цитату из _Learning_Perl_:
"
#!/usr/bin/perl
....
$secretword = $words{$name}; # get the secret word
if ($secretword eq "") { # oops, not found
....
Well, OK, it's the undef value, but it looks like an empty string to the eq operator. You'd get a warning about this if you used -w on the command line, which is why we omitted it here."

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

Viking (*) (2001-08-02 12:09:52.0)

"не тормози - может, и еще как. Перловые регэкспы писаны на том же C, и реализованы достаточно эффективно - настолько эффективно, что вряд-ли средний программист сможет 'навскидку' закодировать более-менее нетривиальный алгоритм обработки строки, который будет работать быстрее аналогичного regexp на перле"

---------------------------------

Скажу честно, ни разу не видел что бы прога написанная на perl делала аналог на С. Поделись примером, мнтересно будет взглянуть. Вот если кодировать, как ты говоришь "навскидку" - то конечно. А еще скажи мне, что будет выполняться эффективнее, 10000 процессов на perl или столько же С-ишных бинарников???

TARANTUL
()

Если кому-нибудь интересно: парсинг регуларных выражений (да и почти любой парсинг) реализуется с помощью построении конечного автомата.
На пальцах это выглядит так:
1. Рисуется дерево конечных состояний автомата.
2. Определяются условия перехода между состояниями.
Изображаем это на бумаге. Дальше уже дело техники.
Далее любой (средний) программист напишит по такой бумажке парсинг любой сложности.

ЗЫ. Для простейших операций регулярные выражения - изврат.
Пример: отсечение пробелов в начале и конце строки:
Сравните Perl'овский /^\s*(\S*)\s*$'/ - очень читабельно, не правдо ли :-(
и функцию Trim()

SeRGi
()

2Viking: ну и что? Это же удобно, когда у программера большой выбор.

2All:
Плохо другое... Странно и удивительно услышать о замене . на ~. Это же, как
я понимаю, сломает весь синтаксис... Опять же с =~ и ~= будут путаться
люди (или ~= не будут делать???)...

Не понятен смысл given: неужели он будет лучше (эффективнее) if/elsif/else?
Или тут какая-то дополнительная функциональность?

Опять же с модулями - странно. Например, можно было быть уверенным,
что на Unices есть DB_File, сейчас это будет так/не так? И так ведь
в 5.6 достаточно мало осталось... Ладно, чистые,
их можно в комплект поставки включить, а с исполняемыми файлами что
делать? :-(((

И так не очень комфортно программить с расчётом на сайты, на которых
сейчас стоят версии от самых первых 5.0, до 5.6...

Псевдохэши - приветствую, однако достаточно наглядно писать сейчас
$var[a]->{b}->[c]->{$key}... Сразу понятно, что $var - это массив,
а не ссылка, да и квалификаторы разделяются визуально.

allter
()
Ответ на: комментарий от TARANTUL

2TARANTUL

Еще как может, ca depеnd, как говорится. Все от задачи зависит. К тому же Perl -- не совсем интерпретируемый язык. RTFM, однако. В этом его сила в маленьких скриптах и слабость в больших.

spectator
()

Помнится на прошлогоднем Atlanta Linux Showcase Уолл слёзно обещал, что в будущем Perl будет использовать свой собственный механизм для разбора программ (парсинг), и заодно позволит создавать свои проблемно ориентированные мини-языки.

Что там вроде он даже говорил про включение элементов функционального и логического программирования (возможно ли это?).

Так что все потрясения еще впереди!

SeRGi
()

2Ogr: ты проиграл, даже не старайся. Программа на perl удаляет любое(?) количество "пробельных символов" перед "разделителями". Это за 5 минут на С не напишешь. И ограничение на размер получишь, потому что надо запоминать какие именно были "пробельные символы" и выводить их правильно, если за ними нет "разделителя". Но, realloc, нас спасет, безусловно.

Дешевая ловушка ;))

Самый плохой программер - который не вникает в спецификации. Даже если все остальное у него отлично.

ZhekaSmith
()

Про обработку потоков слышал?

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

да, мля..., спецификация это не хрен собачий, тут недавно на работу устраивался,
 ну знания типа сказали очень хорошие (я радуюсь...)
Ну а теперь, говорят, маленький 2часовой тестик на адаптабельность к новому..
и дают 2 проги писать на языке REXX Object REXX...причем проги весьма неслабые (включая полиморфизм и тд)..
Вот говорят мануал тебе...пиши наздоровье.
Всё сделал...и всё круто сделал...а вот одну мелочь упустил...(недоRTFMил так сказать)
и всё даже грамотно работало..только при создании объектов на-лету имена классов создаваемых
 не совсем правильно в файл выводились (типа со всеми суперклассами)
На работу конечно взяли и сказали что мол оченно круто, что типа даже раньше времени,
но если бы не та помарка, зарплата была бы на 150 грин больше.....
И показали соответствующую шкалу соответствия результатов теста и прибавки к
 исходному уровню...и между предпоследним (есть мелкий недочет в 1 из програм) и последним (идеально) разница 
 в 150 грин
Зарплата конечно и так не маленькая совсем :))))...но 150 грин за одну непрочитанную
 страничку спецификации...до сих пор жаба душит...

anonymous
()

А я бы не мудрил. Я бы написал чтение строк в буфер, и поиск по буферу posix регекспами. Вот и всё. Только там регекспы чутка другие, но можно.

anonymous
()

А ещё есть libpcre.a - мало места занимает, и всё перловое делает.

anonymous
()

> Скажу честно, ни разу не видел что бы прога написанная на perl делала аналог на С. Поделись примером, мнтересно будет взглянуть.
a) Перл делает канонический (не GNUшный) grep.
b) Я *не* говорил, что Perl в общем случае быстрее C.
c) Я вообще перл терпеть не могу (еще больше чем C++), но не надо делать скороспелых выводов, не разобравшись в предмете.

Viking
()
Ответ на: комментарий от Ogr

2Ogr:
0. О конкретно взятом #define: Вопрос стиля. Нет стиля -- нет вопроса.

1. Поведение твоей программы не идентично перловой. Ты изобрел не самый простой способ избавиться от пробелов ;-) Перевожу с Ц на русский:
if( (nIsNoSpace && *nIsPrevSpace) || (nIsItSpace && *nIsPrevSpace) )
абсалютно эквивалентно
if( (nIsNoSpace || nIsItSpace ) && *nIsPrevSpace )
Что по-русски будет звучать "если ( предыдущий символ пробельный или знак препинания ) и пред-предыдущий символ пробельный", далее, в этом случае ты решаешь просто не печатать символ. Это как бы не эквивалентно "удалить все пробелы перед знаками препинания". Может имелось в виду
i = -1; while( ++i < sizeof(chaNonSpace)/sizeof(chaNonSpace[0]) && chaNonSpace[i] != cSym_2_ ); ? Это как-то более придаёт смысл действу. Тогда по-русски это будет "если ( предыдущий символ пробельный или текущий символ знак препинания ) и пред-предыдущий символ пробельный". Что вобщем тоже не эквивалентно, пример: "; .".

2. Я таки настаиваю на построчном чтении.
3. Просили программу с идентичным поведением, я напомню: читает из stdin, если не передали _имён_(не обязательно одно) обрабатываемых файлов как параметры.
4. Слушай меня, а не slashzone_ru ;-)
5. Дай определение линуксоида. Почему ты считаешь, что я линуксоид?

Программёр, который не умеет решить поставленную задачу точно, он это... Булочками бы лучше торговал.

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

Ruby - sucks dick...
создали блин убожество с паскалёвой основой....епть

anonymous
()

2Ogr:

вот. даже в такой маленькой проге ты умудрился наделать ошибок :)
имхо ты все же подразумевал примерно следующее:

#include <stdio.h>

// cSym2 тут не к чему

int TrimSpace( int *nIsPrevSpace, char cSym1 )
{
char chaSpaces[] = { ' ', '\r', '\t' };
char chaNonSpace[] = { '.', ',', ':', ';' };
int nIsNoSpace, i;

// мне так больше нравится
int nIsPrevSpaceRun = *nIsPrevSpace;

i = -1; while( ++i < sizeof(chaSpaces)/sizeof(chaSpaces[0]) && chaSpaces[i] != cSym1 );

// хацкеры могут это дело прям в if занести :)
*nIsPrevSpace = (i != sizeof(chaSpaces)/sizeof(chaSpaces[0]));
if ( *nIsPrevSpace && nIsPrevSpaceRun ) return 0;

i = -1; while( ++i < sizeof(chaNonSpace)/sizeof(chaNonSpace[0]) && chaNonSpace[i] != cSym1 );
nIsNoSpace = (i != sizeof(chaNonSpace)/sizeof(chaNonSpace[0]));

return !( nIsNoSpace && nIsPrevSpaceRun );
}

int main(int argc, char* argv[])
{
FILE *fpIn = (argc > 1) ? fopen( argv[1], "rt" ) : stdin;
FILE *fpOut = (argc > 2) ? fopen( argv[2], "wt" ) : stdout;
int nIsSpace = 0;
char cSym1, cSym2;

if( fpIn && fpOut )

// и тут куча маленьких изменений для пущей ясности :)

for( cSym2 = fgetc( fpIn ); (cSym1 = fgetc( fpIn )) != EOF; cSym2 = cSym1)
if( TrimSpace( &nIsSpace, cSym1 ) )
fputc( cSym2, fpOut );
return 0;
}

о точности эмуляции перловской строчки я судить не берусь.

вобщем мораль в сей басне такова: нефиг из пушки палить по тараканам --
баги от этого только плодятся. :) open source рулез правда?! ;)

Lucky ★★
()

Ну когда же они наконец додумаются сделать компиляцию в байт-код? Цены бы не было. Всяки джавы окончательно бы ушли на помойку.

anonymous
()

Ка-акой такой паскальской основой? Я на него так посмотрел пару минут, там скорее Перлом пахнет, чем Паскалем. Или у тебя просто аллергия на "end"?

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