Back to site

Што здарылася з Perl

Перш чым мы пачнем

Проста да ведама, перш чым працягнуць: гэта заснавана на маім асабістым вопыце з Perl. Я ведаю, іншыя людзі і іншыя меркаванні гэтай мовы, і яны вітаюць іх. Я проста хачу, каб маё сапраўднае, таму што я бачу шмат паведамленняў на Usenet ад людзей, якія, здаецца, збіраецца вучыцца Perl і мне ўсё хочацца сказаць ім, што, магчыма, гэта не вельмі добрая ідэя. Такім чынам, я напісаў гэты артыкул, каб атрымаць гэта ад маёй грудзей раз і назаўжды.

Калі вы думаеце, што нічога ў гэтым артыкуле, аб'ектыўна не так, то калі ласка, напішыце мне пра гэта. Я хацеў бы гэтую артыкул, каб быць як фактычнай дакладнасці, як гэта магчыма. Калі вы проста не згодныя са мной вы можаце сказаць мне, што занадта.

Я, магчыма, варта патлумачыць, чаму я маю на Perl як "Camel": Бібліі на ўсе рэчы Perl з'яўляецца Лары Сцены "Праграмаванне на Perl", якая апублікаваная O'Reilly. O'Reilly звычайна ставіць добрыя гравюры дзевятнаццатага стагоддзя жывёл на вокладцы сваёй кнігі. "Праграмаванне на Perl" атрымаў вярблюда і быў вядомы як "вярблюд кнігі" да гэтага часу. Лары Уол таксама часта спасылаецца на Perl, як вярблюд.

Артыкул павінен быць у курсе, як з Python 1.5.2 і Perl 5.005. Калі што-небудзь змянілася з тых версій, не саромейцеся сказаць мне пра гэта.

Знаёмства з Camel

Я даведаўся, Perl 5 у пачатку 97. Я спампаваў Патрык М. Райанс выдатнае ўвядзенне ў Perl і выявілі, што шмат рэчаў, якія я рабіла цяжкі шлях з C, Pascal і Java было нашмат прасцей у Perl. Для апрацоўкі тэксту і доступу да функцый сістэмы Perl падобны рэальнага Бога паслаць. Вялікі, я думаў, і купіў сабе "Learning Perl", па Рэндал Шварц. (Таксама вядомы як "ламы кніга".)

Я чытаў Яго даволі хутка І высмактаў усё гэтыя выдатныя Новыя функцыі. Першы праграма я чытаў Часопіс вэб-сервера І лічыў, колькі разоў кожная старонка была звярталіся. Я напісаў Яе за паўгадзіны, І ён працаваў адразу! Яна не Толькі працаваць, алё таксама здавалася Perl, мог не заўважыць неістотныя памылкі, а не грукат Або перапыненні Як C / Pascal / праграм Будзе Java.

(Гэтая праграма была выпушчана Ў шматлікіх варыянтах, І было даволі Шмат карыстальнікаў. Так Perl не бескарысна, простая нязручна.)

Як не любіць Camel

Я быў сапраўды зачараваны гэтай мовай І пачаў выкарыстоўваць Яго ўсё вялікую І вялікую. Аднака дзела, як я працягваў выкарыстоўваць Яго я працягваў адкрываць Новыя рэчы, Якія я не хацеў. Празь некаторы гадзіну Яна дадала, ды даволі знакавых спісу.

Неразборліва сінтаксіс

Хоць я прызнаю, чытальнасць пакутуе крыху...

- Лары Уол Ў <2969@jato.Jpl.Nasa.Gov>

Адна з Першы рэчаў, я выявіў, Што не спадабалася, сінтаксіс. Гэта Вельмі складаны І Ёсць Шмат аператараў І спецыяльнага сінтаксісу. Гэта азначае, Што вы атрымаеце кароткі, алё складаны код з вялікай колькасцю памылак сінтаксісу, Што спатрэбіцца некаторы час, Каб разабрацца.

Гэта таксама азначае, Што чытанне кода хто-то elses Цяжка. Вы не можаце лёгкая зразумець, хто-то elses сцэнарыі І адаптаваць ІХ пад сваё патрэбы, ні вы можаце лёгкая ўзяць на абслугоўванне праграмы хто-то elses.

Я пішу даволі чысты код Perl, таму што я застацца ў баку ад большасці Obfuscating асаблівасці, але ўсё ж гэта становіцца даволі цяжка чытаць. Гэта адзін звычайны прыклад:

foreach $Key (@SearchEngines) {
    if ($fields[11] =~ /$Key/i) {
	  $HitFrom[4]++;           #Yes, search engine
	  $SEReferrals{$SENames{$Key}}++;
	  $PageRefs{$fields[6]}{$SENames{$Key}}++;
	  $found=1;
	  last;
    }
}

Гэта нават не асабліва дрэнны прыклад. Вось функцыі па размеркаванні Perl, які вырабляе значэнне Soundex ад імя або словы:

sub soundex
{
  local (@s, $f, $fc, $_) = @_;
 
  push @s, '' unless @s;	# handle no args as a single empty string
 
  foreach (@s)
  {
    tr/a-z/A-Z/;
    tr/A-Z//cd;
 
    if ($_ eq '')
    {
      $_ = $soundex_nocode;
    }
    else
    {
      ($f) = /^(.)/;
      tr/AEHIOUWYBFPVCGJKQSXZDTLMNR/00000000111122222222334556/;
      ($fc) = /^(.)/;
      s/^$fc+//;
      tr///cs;
      tr/0//d;
      $_ = $f. $_. '000';
      s/^(.{4}).*/$1/;
    }
  }
 
  wantarray ? @s: shift @s;
}

Аднак, нават гэта не вельмі дрэнна. Perl Journal правяло конкурс Obfuscated Perl. Пераможцы тут. Будзьце асцярожныя, аднак. Гэтыя праграмы дае слова чытаецца зусім новыя і раней няўяўныя значэння. (І няма, гэта не аргумент для Perl час чытаецца, але ў асноўным, уключаныя ў якасці смешны і цікаўны пункт.)

Праграмісты і чытальнасць

Некаторыя людзі чытаюць гэтую скардзіліся, што "Але любы чалавек можа напісаць нечытэльны код на любой мове! і гэта, безумоўна, дакладна. Аднак у некаторых мовах, здаецца, заахвочваць цяжка чытаць код, а іншыя не заахвочваюць яго.

З таго, што я бачыў кода мае ўласныя, а чужыя Perl сапраўды заклікае цяжка чытаць праграм. Напрыклад Soundex вышэй паходзіць ад Perl размеркавання і была знойдзеная толькі выпадкова гледзячы праз 2 ці 3 файлаў. Гледзячы праз гэта зноў цяпер я бачу шмат іншых прыкладаў (напрыклад, Lib / Пад / text.pm і Lib / файл / copy.pm), хоць большасць сцэнарыяў занадта кароткае, каб быць цяжка чытаць.

Некаторыя сцвярджаюць, што Perl больш падобная на натуральных мовах, чым большасць моў праграмавання, і гэта, вядома, уяўляецца правільным для мяне. І мне, што гэта недахоп: натуральны мова з'яўляецца надзвычай складанай, неадназначнай і поўнай тонкіх нюансаў і сэнсаў. Я, вядома, не хачу, каб мае праграмы, каб быць такім, але здаецца, што некаторыя робяць. Я думаю, чытачу давядзецца высветліць для сябе, да якой катэгорыі ён / яна належыць цалі

Занадта шмат спецыяльных канструкцый

Многія з асаблівасцяў мовы Perl ўбудаваныя прама ў мову само ядро, а не змяшчаюцца ў асобныя бібліятэкі. Адным з прыкладаў гэтага з'яўляецца апрацоўкі рэгулярных выразаў, для якіх існуе спецыяльны сінтаксіс. Гэта мае тое перавага, што Ёсць некаторыя зручныя спосабы зрабіць рэчы, якія робяцца часцей за ўсё, але гэта таксама азначае, што вы не атрымаеце перавагі аб'ектаў.

Прывядзём адзін прыклад, Perl мае спецыяльную канструкцыю, званую фарматы, якія з'яўляюцца свайго роду шаблоны, якія можна выкарыстоўваць для стварэння добра тэкставых справаздач. Даволі зручна, але ўбудаваны ў мову. Такім чынам, вы не можаце стварыць спіс фарматаў, вярнуць іх ад функцый і гэтак далей, якія ў многіх выпадках сур'ёзныя нязручнасці.

Я думаю, што вы можаце рабіць усе гэтыя рэчы з файл ручкамі, але, паколькі яны таксама разглядаюцца як прыватныя выпадкі Я ніколі не быў у стане высветліць, якім чынам. Я паспрабаваў з дапамогай спасылак, але так і не зрабіў сваю працу.

Цяжка будаваць структуры дадзеных

У Perl дакументацыі ёсць асобныя старонкі кіраўніцтва аб тым, як ствараць масівы ў масівы і хэшы ў хэшаў. І гэта сапраўды неабходна. У мяне было шмат болю, спрабуючы зразумець, як зрабіць гэта, нават пасля чытання яго некалькі разоў. Гэта тое, што сапраўды ўразіла мяне, таму што ў іншых мовах гэта тое, што вы проста, не думаючы пра гэта.

У Lisp, гэта устанаўлівае зменную ў спіс:

(setq a '(1 2 3 4))

Тут мы ствараем спіс B, дзе першы элемент яшчэ адзін спіс:

(setq b '((0.8 0.9 1) 2 3 4))

Вось першы спіс у Perl:

@a=(1,2,3,4);

А Вось другі:

@b=((0.8,0.9,1),2,3,4);

(@ S да імёны зменных Perl кажа, што гэта масіў пераменных.) Гэта было не так ужо дрэнна, ці не так? Ну, давайце паспрабуем выкарыстаць гэта.

Каб выбраць першы элемент першага спісу ў Ліспе, вы проста напісаць

(first a)

Lisp і дае вам

1

Каб атрымаць першы элемент другога спісу вы пішаце

(first b)

Lisp і дае вам

(0.8 0.9 1)

Давайце паспрабуем гэта ў Perl.

$a[0]

дае нам

1

$ Перад імем зменнай кажа Perl, што мы хочам аднаго значэння (скалярнаму ў жаргоне Perl), а не масіў. [0] кажа Perl, што мы хочам першае значэнне масіва. Perl, як і многія іншыя мовы і інтэрфейсы API налічвае ад 0.

Тады мы робім

$b[0]

Perl і шчасліва дае нам

0.8

Гэта дакладна, Perl уварваўся ў спіс ўнутры спісу B і атрымаць першае значэнне гэтага. Ці, хутчэй, гэта плоскі б у адзін спіс, калі мы стварылі яго, так што цяпер сапраўды адзін паслядоўны спіс з 6 элементаў.

Каб зрабіць гэта правільна, мы павінны мець пісьмовыя

@b=([(0.8,0.9,1)],2,3,4);

калі мы стварылі спіс. [] S ўвесці спасылку на ўнутраны спіс у якасці першага элемента спісу, а не знешняй уплощения ўнутранага спісу ў вонкавай.

OK. Так што мы стараемся яшчэ раз:

$b[0]

gives us

ARRAY(0xb75eb0)

Так, відавочна, нам удасца знайсці масіў, але што-то яшчэ ідзе няправільна на гэтым шляху. Праблема ў тым, што мы выкарыстоўваем $ B, што робіць Perl думаю, што мы хочам скалярнага і таму ён дае спасылку на масіў замест сам масіў (які не скаляр).

Ага! Вядома! Мы павінны выкарыстоўваць

@b[0]

таму @ кажа Perl мы хочам значэнне масіва. Гэта не так. Мы атрымліваем

ARRAY(0xb75eb0)

яшчэ раз. Я так і не ўдалося зразумець, чаму гэта так, і ў гэты момант я кінуў на ўсю рэч.

Некалькі тыдняў праз я ўбачыў карысныя размяшчэння на no.perl: адзін павінен запытаць спасылку на масіў, як гэта

@{$b[0]}

which actually gives us

(0.8 0.9 1)

Цяпер спытайце сябе: няўжо вы думаеце, вы павінны прайсці праз усё гэта, каб пакласці аднаго спісу ў іншы?

Вызначэнне інтэрфейсаў

Яшчэ адным важным недахопам Perl з'яўляецца тое, што функцыі (або падпраграмы, у Perl жаргон) подпісы, ці, дакладней, адсутнасць подпісаў. У большасці моў праграмавання пры аб'яўленні функцыі вы таксама заявіць аб сваёй подпісам, з указаннем назвы параметраў і ў некаторых мовах таксама іх тыпы. Perl не робіць гэтага.

Так што ў Java з'яўляецца

public String substring(String str, int from, int to) {

becomes

sub substring {
  local($str, $from, $to) = @_;

У Perl. Іншымі словамі, вам давядзецца ўручную дэкадаваць спіс параметраў. Perl ў апошні час была пашырана з паняццем прататыпы, што азначае, што вы можаце напісаць

sub substring($, $, $) {
  local($str, $from, $to) = @_;

і Perl праверыць, што лік аргументаў з'яўляецца правільным. Гэта не з'яўляецца абавязковым, хоць і існуе шмат Perl код, які не выкарыстоўвае гэты сінтаксіс.

Недахопы не спыняцца на дасягнутым, хоць. Многія праграмісты не destructure масіў параметраў, як у прыведзеным вышэй прыкладзе, што робіць код нашмат цяжэй чытаць з першага погляду, і гэта таксама робіць немагчымым аўтаматычнае стварэнне добрай дакументацыі.

І, больш таго, вы не атрымаеце перавагі больш прасунутых моў з функцый, такіх як ключавыя аргументы (без паўторнага іх рэалізацыі сябе хэш). Напрыклад, калі вы хочаце стварыць хэш-табліцу ў Common Lisp вы называеце зрабіць хэш-табліцы функцыі, якая прымае наступныя аргументы па ключавой фразе:

Гэта азначае, што ўсе наступныя выклікі будуць стварыць хэш-табліц правільна:

  (make-hash-table)
  (make-hash-table:test #'eq)
  (make-hash-table:size 1000)
  (make-hash-table:rehash-size 2.0:rehash-threshold 0.7)

Гэта таксама азначае, што вы можаце мець функцыі, якія прымаюць вялікая колькасць параметраў (зрабіць масіў займае 7) і захаваць як чытальнасць і прастату выкарыстання. Вы можаце зрабіць тое ж самае ў Perl, але вы, вядома, не рэкамендуецца, прылады працы з дакументацыяй не разумею, чытачы могуць не альбо, і гэта, вядома, не зручна па параўнанні з так яно і ёсць у Common Lisp:

(defun make-hash-table(&key test size rehash-size rehash-threshold)

Не зусім аб'ектна-арыентаванага

Хоць аб'ектна-арыентаванага праграмавання не гэтак фантастычнай, як многім хацелася б нам думаць, Perl падтрымлівае яго. Тым не менш, ён робіць гэта толькі вяла, паколькі аб'екты былі дададзеныя даволі позна ў жыцці мову.

Вынікам гэтага з'яўляецца тое, што звычайныя файлы, разеткі, хэшы і спісы не з'яўляюцца аб'ектамі, гэта азначае, што інтэрфейсы для іх не так зручна, як яны маглі б быць. Новыя версіі Perl пастаўляюцца з аб'ектна-арыентаваных модуляў з абалонкамі для гэтых відаў аб'ектаў, а гэта значыць, што Perl мае пратакол для такіх аб'ектаў, і Вы можаце напісаць свой уласны рэалізацый гэтых пратаколаў. Аднак, гэта таксама азначае, што неабходна праводзіць адрозненне паміж звычайным файлам ручкі і файлавыя аб'екты, што крыху няёмка.

Іншая справа, што пры стварэнні аб'ектаў неабходна відавочна ўпраўлення ўнутраных вашых аб'ектаў. У Perl, стварэнне аб'ектаў ўручную. Клас абвешчаны як пакет, і функцыі ў пакеце, то сталі метады класа. Каб стварыць аб'ект, вы робіце хэш-табліцы, а затым блаславіў яе (з дапамогай убудаванай функцыі "дабраславіць"), каб зрабіць яго аб'ектам. "Perlobj" чалавек старонку, якая тлумачыць асаблівасці Perl аб'екта, рэкамендуе гэтую форму инициализатор аб'екта: object initializer:

package MyClass;
sub new {
    my $class = shift;
    my $self = {};
    bless $self, $class
    $self->initialize();  # do initialization here
    return $self;
}

Ёсць і іншыя спосабы зрабіць ініцыялізацыі аб'екта, некаторыя з якіх выклікаюць праблемы для атрымання ў спадчыну. Асабіста я знаходжу гэта дзіўным, што такога роду рэчы павінны быць неабходна на ўсіх. Вышэй эквівалентна гэты код Python:

class MyClass:
    pass
;

Вынікам з'яўляецца тое, што можна лёгка атрымаць аб'ект будаўніцтва няправільна (напрыклад, не харчаванне для атрымання ў спадчыну), якія вызначаюць класы нязручна і цяжка сказаць, калі з кода класа вызначаецца (як для чалавечага чытачоў і праграмных сродкаў дакументацыі).

Падводзячы вынікі

Увогуле, гэта азначае, што Perl з'яўляецца вялікі і складаны мову, які займае шмат часу, каб навучыцца правільна. На мой погляд, гэтая складанасць з'яўляецца непатрэбным і просты мова была б нашмат лепш. Я думаю, што гэта таксама азначае, што шматлікіх не-эксперта Perl распрацоўнікам пісаць код субоптимальным.

Іншая справа, што я думаю, некалькі Perl распрацоўшчыкаў (у працэнтных адносінах) напісаць агульнага і шматразовага модуляў, таму што вы павінны вывучыць мову добра, перш чым рабіць гэта так, то, што дастаткова складана і займае шмат часу. Іншая справа, што сам мова не спрыяе гэтаму.

Адкрываючы Python

Programming languages teach you not to want what they cannot provide. You have to think in a language to write programs in it, and it's hard to want something you can't describe. When I first started programming - in BASIC - I didn't miss recursion, because I didn't know there was such a thing. I thought in BASIC. I could only conceive iterative algorithms, so why should I miss recursion?

--Paul Graham, ANSI Common Lisp.

Такім чынам, пасля адкрыцця ўсе гэтыя дрэнныя рэчы пра Perl, што ж мне рабіць? Я трымаў яго выкарыстання. У рэшце рэшт, так дрэнна, як гэта было, гэта было яшчэ лепш, чым рабіць апрацоўкі тэксту і вэб-праграмавання з C, Pascal або Java, і не было лепшай альтэрнатывы.

Ці я так думаў. У кніжным магазіне універсітэта была гэтая кніга пад назвай "Інтэрнэт Праграмаванне Python". Будучы абодва мовы вырадак і інтэрнэт вырадак я падумаў, што гэта было цікава і падняў яго. Дзесьці ў пачатку кнігі быў анекдот пра тое, праграміст Python, які напісаў усе свае Python праграм, з тым, што, калі адбылася памылка (гэта значыць: калі выключэнні) апрацоўшчык памылак назваў свой гукавы сігнал.

Нічога сабе, падумаў я. Гэта гучыць цікава. Я пайшоў дадому, выявіў Python падручнік, надрукаваны яго і пачаў гуляць з Python. У тую ноч я напісаў POP3 кліенцкай бібліятэкі ў Python. Проста так. Пасля класціся спаць, я прыйшла ў галаву думка: не было б шмат лепш, калі я кэшаваныя паведамленні і зрабіў гэта незаўважна для карыстальніка? Раніцай я дадаў, што праз паўгадзіны.

З тых часоў я выкарыстаў гэтую бібліятэку для выдалення электроннай пошты, не загружаючы яго, рухаючыся 150 паведамленняў з аднаго рахункі на іншы POP і многае іншае. (Так, я зрабіў невялікую бібліятэку SMTP, а таксама.) Я нават магу выкарыстаць яго ў якасці паштовага кліента выкарыстаннем інтэрпрэтатара Python ў якасці каманднага радка.

Я ўсё выкарыстаннем Python больш і больш пасля гэтага. Я напісаў спасылку праверкі, што падышоў мой вэб-старонак праверкі іх на наяўнасць памылак і працягваў дадаваць больш пратаколаў і функцый для гэтага. Праз некаторы час я падумаў: гэтая праграма марнуе шмат часу на чаканне адказаў сервера. Можа быць, я магу паскорыць яго, выкарыстоўваючы шматструменнасць, каб ён мог пачакаць некалькі сервераў у той жа час?

Я ніколі не выкарыстоўваў шматструменнасць і раней, але ведаў тэорыі за ім. Я дадаў гэтую спасылку праверкі ў гадзіну, і што ўключае ў сябе капацца ў дакументацыі бібліятэкі і выдаленне некалькіх памылак я зрабіў ўвесці. (Шматпаточнасьці з'яўляецца значна больш складаным, чым здаецца на першы, таму што рэчы адбываюцца адначасова. Гэта не віна Python, хоць.)

Прачытаўшы гэта, Вы можаце зараз быць упэўненыя, што я настаўнік, а не што Python з'яўляецца вялікі мова праграмавання для такога роду рэчы. Асабіста я не думаю, што гэта праўда. (Памятаеце, я хлопец, які не можа нават зрабіць Perl вяртання падпраграмы дэскрыптар файла.) Акрамя таго, як я чуў, многія іншыя людзі мелі падобны досвед з Python. Вось адзін прыклад:

У маіх першых 15 хвілін праграмавання Python я напісаў праграму, якая б загрузіць усе артыкулы ў тэлеканферэнцыі ў MH тэчку для мяне - і comp.lang.python быў мой першы навін!

- Томас Корбіна, у прыватных ліст аўтару

Закахаўшыся ў Python

Стандартныя бібліятэкі

Хіба гэта спыняцца на гэтым? Гэта, вядома, гэтага не зрабілі. З тых часоў я знайшоў гэтыя рэчы ў бібліятэках Python:

І гэтыя рэчы, якія прыходзяць з стандартны дыстрыбутыў Python! Perl таксама вялікая частка гэтага матэрыялу, але ён не прыйшоў з перакладчыкам і якасць дакументацыі і інтэрфейсаў вар'іруецца.

- Томас Корбіна, у прыватных ліст аўтару

Закахаўшыся ў Python

Стандартныя бібліятэкі

Хіба гэта спыняцца на гэтым? Гэта, вядома, гэтага не зрабілі. З тых часоў я знайшоў гэтыя рэчы ў бібліятэках Python:

І гэтыя рэчы, якія прыходзяць з стандартны дыстрыбутыў Python! Perl таксама вялікая частка гэтага матэрыялу, але ён не прыйшоў з перакладчыкам і якасць дакументацыі і інтэрфейсаў вар'іруецца.

У мове Python вы атрымліваеце не толькі гэтыя рэчы пастаўляцца з перакладчыкам, у камплекце з дакументацыяй, яны таксама надзвычай простая ў выкарыстанні і забяспечваюць менавіта роду рэчы, якія звычайна хоча. Скажам, вы пішаце вэб-робат і робат URL для бягучай старонкі ў радку (cur_url) і адноснага URL з гэтай старонкі на наступную старонку ў іншы (next_url) і вы хочаце, каб вылічыць абсалютны адрас наступная старонка. Гэта код:

next_url=urlparse.urljoin(cur_url,next_url)

Python таксама падтрымлівае інтэрфейс праграмавання з дапамогай Tk на Win32, Mac і Unix. Гэта вельмі простая ў ўстаноўцы, але не занадта добра дакументаваны. Ёсць таксама на многіх іншых спосабаў зрабіць графічны інтэрфейс праграмавання Python. (Так, ёсць на Perl, а.)

SIGs

Python можа стаць такім жа вялікім, як Perl або Tcl. Гэта больш "прывабны", чым тыя, - хоць, магчыма, таксама больш спрэчным. Яна мае надзвычай падтрымкі супольнасці карыстальнікаў, і гэта тое, што зробіць яго вялікім.

- Гвіда ван Россум, стваральнік Python

Калі яны хочуць стварыць новыя бібліятэкі або "стандартаў", Pythoners форме групы спецыяльных інтарэсаў добраахвотнікаў, якія кожны можа далучыцца. Некаторыя з вынікаў гэтага да гэтага часу агульны API для модуляў баз дадзеных (што азначае, што вы можаце выкарыстоўваць модуль Sybase, а затым абмяняць яго з Oracle адно і толькі змяніць 2 радкоў кода), IDL да Python для адлюстравання CORBA, агульны тэкставы фармат для радкоў дакументацыі і агульных інструментаў і інтэрфейсаў API для разбору XML знаходзяцца ў стадыі распрацоўкі.

Python Software

Але, калі гэты мова сапраўды настолькі вялікая, не павінны людзі напісалі некалькі даволі вытанчаны праграмнага забеспячэння ў ім? Ну, у іх ёсць. Вось некалькі прыкладаў:

Асабіста мой бягучы праект у Python з'яўляецца цалкам праверку XML-парсер.

Няўжо гэта лепш, чым Perl?

Я уключыў гэты падзел у выпадку, калі вы хочаце ведаць, як Python ручкі рэчы, якія я скардзіўся на Perl.

Чытэльнасць

Python з'яўляецца самым чытэльным мовай я калі-небудзь запраграмаваны цалі Мне спатрэбілася паўгадзіны, каб зразумець Медуза (хоць гэта даволі дзіўна ў канцэпцыі) і яшчэ паўгадзіны, каб змяніць яго так, што я магу карту URL шляху ў вэб-сервер на Python функцый. Праз гадзіну пасля таго, што я мог чытаць мае скрынкі Gnus пошту праз вэб-сервер. Яшчэ гадзіна, і я мог чытаць навіны праз яго.

Вось мой ўласную рэалізацыю Soundex функцыя, напісаная ў лістападзе 97-га, калі я быў яшчэ новага ў гэтым:

# no_tbl is an array I've constructed that maps characters to numbers
# is_letter is written by me, but I've since discovered that Python
# has it
 
def soundex(string):
    """Returns the Soundex code of the string. Characters not A-Z skipped."""
    string=lower(string)   
 
    if not is_letter(string[0]): string=string[1:]
    last=no_tbl[ord(string[0])-97]
    res =upper(string[0]) # This is where the result will end up
 
    for char in string[1:]:
	if is_letter(char):
	    new=no_tbl[ord(char)-97]
	    if (new!="0" and new!=last):
		res=res+new
	    last=new
 
    if len(res)<4:
	return res+"0"*(4-len(res))
    else:
	return res[:4]

Дакументацыя

Існуе праграма Python, які генеруе Javadoc-як дакументацыю радкоў дакументацыі ў праграмах Python. Ён можа выдаваць вынік у HTML, просты тэкст і FrameMaker фармаце.

Што тычыцца нарматыўнай дакументацыі бібліятэкі, вы можаце бачыць самі.

Адключэнне буферызацыі высновы не стала відавочным, але не занадта складана, альбо. Вы даволі хутка даведацца, што sys.stdout, sys.stdin і sys.stderr файлавыя аб'екты, якія ўяўляюць стандартны вывад, стандарт і стандартная памылка. Такім чынам, паколькі стандартны вывад з'яўляецца звычайным аб'ектам файл, ён павінен паводзіць сябе як адзін па адносінах да буферызацыі высновы, а таксама. І ён робіць. Гэтыя аб'екты не маюць метадаў, каб выключыць буферызацыю, але вы можаце флэш дадзеных з флэш метад:

sys.stdout.flush()

Калі вы выявіце, што няёмка ёсць ключ каманднага радка для інтэрпрэтатара, які дазваляе выключыць буферызацыю. Аднак, вы павінны запусціць інтэрпрэтатар з "Python -? каб даведацца гэта, так што я сапраўды не мог сцвярджаць, што гэта занадта добра дакументаваны.

Убудаваныя модулі

Python мае вельмі мала ўбудаваных функцый па параўнанні з Perl. Рэгулярныя выразы прыходзяць у асобны модуль і рэалізаваны ў выглядзе аб'ектаў. Вось спіс скампіляваных рэгулярных выразаў:

reg_list=[re.compile("foo"),re.compile("[Bb][Aa][Rr]"),re.compile("ba[z]")]

Файлы таксама аб'екты, як і Python модулі і большасць іншых рэчаў. Гэта азначае, што вы можаце перадаць іх у якасці параметраў, запіхваць іх у спісы, падклас іх і нават ствараць класы з тымі ж метадамі і выкарыстоўваць іх дзе код чакае, што аб'ектны файл або модуль.

Структуры дадзеных

Гэта два спісу прыкладаў у Python, (=> паказвае, што вынікі):

a=[1,2,3,4]
a[0]                  => 1
b=[[0.8,0.9,1],2,3,4]
b[0]                  => [0.8,0.9,1]

Python таксама хэш-табліц, набораў (фіксаванай даўжыні спісаў) і поўнай аб'ектна-арыентаванага праграмавання.

Напрыканцы

Што думаюць іншыя

Вы можаце пачуць, што думаюць іншыя людзі, так што тут некаторыя спасылкі на іншыя думкі на Perl і Python:

Апошняе папярэджанне

Вярблюды паслухмяны, калі належным чынам падрыхтаваныя і апрацаваныя, але, асабліва ў сезон гону, схільныя прыступам лютасці. Яны пляваць, калі раздражнёны і можа ўкусіць і ўдар небяспечна.

- Энцыклапедыя Britannica.

Калі пасля ўсяго гэтага, вы ўсё яшчэ хочаце выкарыстоўваць Perl, то быць маім госцем і ісці прама наперад. Я не збіраюся, каб спыніць вас. Вы былі папярэджаныя, аднак.

Аднак, вы, магчыма, будзе цікава, што Брытанская энцыклапедыя павінен сказаць пра пітонаў? Вось ён:

... Monty Python Flying Circus трупы, якая ўсталявала стандарт на працягу 1970-х гадоў для яго мудрагелісты пародыі і дурных гумару на тэлебачанні, а затым у фільмах.

- Энцыклапедыя Britannica

Гэта дакладна. Python быў названы ў гонар камедыі трупа, а не пасля непрыемных рэптылій. Вось чаму Ёсць так шмат дзіўных імёнаў і прыкладаў у падручнікі Python і зыходны код.:-)

Прыкладання

Падзякі

Дзякуючы:

Popular Links
Published (Last edited): May 18 , source: http://www.garshol.priv.no/download/text/perl.html