|
Тема
|
Въпросче от новобранец - за променливи и т.н.
|
|
Автор |
bira_more (бира) |
Публикувано | 08.09.05 17:37 |
|
Буквално няма и месец от как се боря с Пърл - тоест може на воля да се хилите за тъпите ми въпроси.
Та към въпроса:
Каква е разликата между
my $creten=5
и
my ($creten)=5=7
То изреченията са по сложни де
Работил съм до сега с C/C++
А опита ми с Purl - е да променя някое готово скриптче да работи както аз бих искал - става.
Bеer? Mоre?
| |
Тема
|
Re: Въпросче от новобранец - за променливи и т.н.
[re: bira_more]
|
|
Автор | level 9 (Нерегистриран) |
Публикувано | 08.09.05 21:58 |
|
1voto e qsno
2roto e invalid - ne mojesh da promenqsh konstanti - nqmash opit s programiraneto principno, ne samo s Perl.
| |
Тема
|
Re: Въпросче от новобранец - за променливи и т.н.
[re: level 9]
|
|
Автор |
novobranec (може би?) |
Публикувано | 08.09.05 22:18 |
|
Ти пък. Човека или нещо грешно е копнал или просто се лигави.
То е ясно че това дето пита е глупост и безсмислица и не става, обаче
$creten=$oligofren=$bastun=0 и
($creten,$oligofren,$bastun)=0
си е напълно вярно, както и това че в Perl всички променливи са тип UNKNOWN за разлика от C където всичко трябва да се дефинира предварително и сакън да не се отдели някой байт повече за променлива и малко повече редове в компилатора за определяне на типа на променливите.
| |
|
Писал съм на C/C++ за ДОС и Виндовс
Писал съм на C за C8051F124 - 8051 съвместим 8 битов процесор.
my ($extension) = $agi_env{channel} =~ m{Local/(\d+)};
В същност това е истинския въпрос.
Е да ама според мен ако беше:
my $extension = $agi_env{channel} =~ m{Local/(\d+)};
Щеше да е същото.
До колкото разбрах от пърл за по малко от месец, при това между другите ми задължения, скобите биха имали смисъл само ако не е една променлива а са няколко.
Да не говорим че за мен по скоро
$agi_env{channel}
е константа, а не променлива
Знам ли какво точно означава тази конструкция?
Обикновено съм виждал
$agi_env->{channel}
Е в нормалните езици е друго:
Там имаш
int Kreten=5.
И там = е присвояване, в някои езици обаче = не е = а е ==.
както споменах в самото начало - новобранец съм в Пърл, и не съм наясно дори дали = си е = или е ==.
Bеer? Mоre?
| |
|
Ей, велик език е пърла. А конкретно в случая разлика има, макар на пръв поглед да изглежда че няма. Глей сега:
Първо, конструкцията $agi_env{channel} означава "бръкни в хеш таблицата agi_env и извади стойността, която отговаря на ключа 'channel'". Същото като $agi_env->{channel}, но разликата е че във втория случай $agi_env е референс към хеш таблицата.
Да ти го преведа на С++, разликата е като между:
some_object.member
и
pointer_to_some_object->member
Второ, конструкцията () дефинира масив (вектор). Така че
my ($x) - дефинира масив от един елемент
my $x - дефинира проста променлива (скалар)
Така, обикновено едното е равносилно на другото. Обаче в случая това не е така, както ще стане ясно след малко.
Трето, операцията
$x =~ m/alabala/;
извършва търсене на регулярния израз alabala в стойността на променливата $x. Тази операция си има и стойност (т.е. отляво на $x може да стои =). Ако погледнеш описанието на операцията =~ m// (или m{}, което е същото), ще забележиш, че в скаларен контекст връща 0 или 1, в зависимост от това дали има съвпадения, а във векторен контекст връща съответните съвпадения.
T.e.:
my $extension = $agi_env{channel} =~ m{Local/(\d+)};
означава "потърси стринга 'Local/XXXX' (където ХХХХ е низ от едно или повече числа) в стойността на channel от хеша $agi_env. Ако го намериш, запиши в $extension стойност 1, иначе -- 0". Това е така, защо отляво на = $agi_env{channel} =~ m{Local/(\d+)} стои скаларна променлива (т.е. казва се, че контекстът е скаларен)
От друга страна:
my ($extension) = $agi_env{channel} =~ m{Local/(\d+)};
означава "потърси стринга 'Local/XXXX' (където ХХХХ е низ от едно или повече числа) в стойността на channel от хеша $agi_env. Ако го намериш, запиши в $extension стойността ХХХХ, иначе не записвай нищо". Това е така, защо отляво на = $agi_env{channel} =~ m{Local/(\d+)} вече стои векторна променлива (т.е. казва се, че контекстът е векторен). В случая има само един елемент в масива и само един комплект () в търсения регулярен израз, а те ограждат именно цифровата стойност ХХХХ, т.е. тя ще бъде върната в променливата $екстеншън ако има съвпадение.
Изводът е: ако $agi_env{channel} има вида Local/ХХХХ, където ХХХХ е някакво цяло число, досега в променливата се е $extension вземало това число. Ако махнеш скобите, ще получиш просто 1 ако $agi_env{channel} има указания вид.
Ей, велик език е пърла. А между другото, ако не се лъжа, бориш един опън сорс шит за воис овър айпи телефония, нали?
Аре поздрави,
# [ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo "You live"
| |
Тема
|
Re: Е не си прав
[re: bira_more]
|
|
Автор | level 9 (Нерегистриран) |
Публикувано | 17.09.05 03:46 |
|
ti pishi ako iskash na siriiski, tova ne pomaga, kogato te myrzi da chetesh manuals.
kolkoto i da e intuitiven, Perl ochakva da imash obshta predstava ot:
perlreftut Perl references short introduction
perldsc Perl data structures intro
perllol Perl data structures: arrays of arrays
perlrequick Perl regular expressions quick start
perlretut Perl regular expressions tutorial
perlboot Perl OO tutorial for beginners
perltoot Perl OO tutorial, part 1
perltooc Perl OO tutorial, part 2
perlbot Perl OO tricks and examples
perlstyle Perl style guide
perlcheat Perl cheat sheet
perltrap Perl traps for the unwary
perldebtut Perl debugging tutorial
ako li ne - prodyljavai s 'ostroumnite' hipotezi
| |
Тема
|
Re: Е не си прав
[re: level 9]
|
|
Автор | 4iki (Нерегистриран) |
Публикувано | 19.09.05 13:31 |
|
ти па кво се правиш на много умен кат си научил некъв наркомански език
| |
Тема
|
Re: Е не си прав
[re: level 9]
|
|
Автор | vader (Нерегистриран) |
Публикувано | 14.10.05 15:53 |
|
deba 4ikijiite deba
| |
Тема
|
Re: Въпросче от новобранец - за променливи и т.н.
[re: bira_more]
|
|
Автор |
Ognen_Demon (Web-dev) |
Публикувано | 20.10.05 15:14 |
|
От прочетените мнения единствено Биpxaджия се изказа най-компетентно, но доста дълго. А с две думи отговора е:
my $abc; # taka deklarirame promenliwa
my ( $abc ) = 3 = 5;
# neprawilno, shte wurne greshka, shtoto '3' se iawiawa ako ne se
# luja anonimna konstanta na koiato se opitwame da priswoim stoinost
# '5'
my ( $abc ) = 3;
# taka deklarirame anonimen masiw, kam chiito nulew element se
# obrushtame sus skalarnata promenliwa $abc, koiato w sluchaia
# se iawiawa neshto kato pointer kam elementa
# i w posledstwie i priswoiawame stoinost '3';
# sled tozi red natatak $abc weche si e w chisto skalaren kontekst
# ...
# wsushtnost ne sam mnogo siguren dali niama da e po-prawilno da se
# kaje "obrushtame se kum promenliwata $abc w konteksta na masiw"
# no w Perl baia neshta ne sa towa koeto izglejdat :))
Междудругото конструкцията с анонимния масив е много често ползвана
за следната трикинка примерно ( поне аз най-вече за това я ползвам ):
- имаме масив @ar
- искаме от него да изкопчим конкретни елементи
my ( $a ) = @ar; # samo nulewia element
my ( $a, undef, $c ) = @ar; # nulewia i wtoria element
Ок. На пръв поглед това изглежда не-особено смислено. Ето пример от
самата практика - декларация на метод myMethod в клас,
който приема един параметър $a:
# Primeren metod
sub myMethod {
my ( $self, $a ) = @_;
} # end myMethod()
( От гледна точка на практиката така май се явява най-удобно. Иначе старите пърлари в нета не одобряват точно тази декларация на функции много много )
И един съвет от мен, макар че където и да прочетеш, ще те посъветват същото:
use strict;
Ако не го ползваш, може да не забележиш доста грешки, които на всеки се случва да допусне особено ако бърза или е уморен.
| |
|
Така е боря се с Астериск.
Лошото е че нещо се оплетох като пате в калчища.
Самия Астериск си има някои бози - тоест трябва да се ръчкат сорсове на C - a някои от функциите му са на по хиляда реда - ужас.
След това - Pеrl - хубав език наистина.
Ама аз само променям готови файлчета - писани от Mark Spencer.
Накрая почнах да мешам и едни скриптове на PHP - веселба.
Още веднъж мерси за разясненията.
Bеer? Mоre?
Редактирано от bira_more на 16.12.05 17:21.
| |
|
|
|
|