от Курс за ССОК
Увод в програмирането на Perl
Лекция #2 Скалари и основни оператори
Пример 1 - „Hello, world!“ на Perl
#!/usr/bin/perl
#hello_world.pl
#Prints a Hello World statement
print „Hello, world\n“;
- # дава началото на коментар; всичко след него до края на реда е коментар
- добре е програмите да са добре документирани, но не повече от необходимото
- #! се нарича shebang конструкция; след нея се дава пътеката до Perl интерпретатора на съответната система (задължително се слага в началото на всяка програма)
- print е стандартна вградена функция; по подразбиране работи със стандартното устройство за изход;
- \ сигнализира началото на escape последователност (индикира че след него има някакъв специален символ). Някои от основните escape последователности са:
- \n - нов ред.
- \t - хоризонтална табулация.
- \r --> премества курсора в началото на текущия ред(carriage return)
- \$ --> escape последователност за $
- \\ --> escape последователност за \.
- \“ --> двойни кавички
- \' --> двойни кавички
- Всички програми на Perl трябва да се поставят във файл с разширение .pl
- Когато се стартира програмата със командата perl тя преминава през два ключови етапа:
- Компилация до операционен код(op codes)
- Ако компилацията завърши успешно, операционният код се интерпретира по време на етапа на изпълнение от интерпретатора на Perl. Той интерпретира програмата, изпълнявайки по един операционен код в един момент.
- -c flag (компилира и тества за синтактични грешки).
Пример 2 - Отпечатване
Следващия пример илюстрира разнообразието на Perl синтаксиса за реализиране на отпечатване:
#!/usr/bin/perl
#hello_print.pl
#Prints a few lines
print(„1. From the East to the West TU is the best\n“);
print „2. From the East to the West TU is the best\n“;
print „3. From the East to“, „ the West TU is „, „ the best\n“;
print „4. From the East to the West“;
print „ TU is the best\n“;
print „5. From the East to the West TU is the best\n“;
print „6. From the\n East to the West\n TU is\n the best\n“;
- Първият print показва, че функцията може да бъде използвана както без скоби, така и със скоби
- Втория print показва, че интервалите между името на функцията и аргументите й се пренебрегват
- Третия print показва, че функцията може да приема както един така и повече от един аргумент. Ако има повече от един аргумент, те впоследствие се сливат
- Всяка последователност от оператори, терминирана с ; се нарича твърдение (statement).
Пример 3 - Събиране
#!/usr/bin/perl
#simple_addition.pl
#Accepts 2 nums from user and sums them
print „Enter the first number: “;
$first = <STDIN>;
chomp($first);
print „Enter the second number: “;
$second = <STDIN>;
chomp($second);
$sum = $first + $second;
print(„The sum is: $sum\n“);
- Всяка променлива има име, тип, и стойност
- $first и $second са скаларни променливи. Скаларната променлива реферира местоположение в паметта на компютъра, където може да се запазва стойност за употреба на по късен етап
- Типовия идентификатор $ определя, че променливата е скалар.
- Операторът = е оператор за присвояване, записва в $first и $second стойностите, зададени от потребителя
- STDIN е съкращение за standard input(стандартен вход)
- Изпълнението на програмата спира докато докато се изчаква въвеждане
- Потребителя въвежда желаната стойност и натиска Enter. Тогава стойността на $first ще е въведеното число плюс escape последователността за нов ред (например „45\n“)
- Именно защото искаме да елиминираме този нов ред накрая, ползваме функцията chomp, която премахва новия ред накрая, ако има такъв
- Perl прави разлика между малки и големи букви(case-sensitive)
Скаларни стойности и скаларни променливи
- Скаларните стойности в Perl са най-простите съставни части на данните в Perl. Скаларна променлива е променлива, която има за стойност скаларна стойност
- Скаларните стойности в Perl са числа, низове и препратки. Числена скаларна стойност може да бъде целочислена стойност, число с плаваща запетая. Низовете биват два вида също – ограничени с единични кавички и ограничени с двойни кавички. Разликата между двата вида е че в първия случай Perl не прави разширяване на променливи и escape последователности в низа(с изключение на /' и //) , а във втория – прави.
Аритметични оператори
- Аритметичните оператори са бинарни оператори:
- Събиране --> +
- Изваждане --> -
- Умножение --> *
- Деление --> /
- Деление по модул --> %
- Повдигане на степен --> **
- Операндите на % оператор трябва да са цели числа (ако не са, се отрязва дробната част. Например 11.2 % 4 дава 3)
- При деление, независимо от аргументите резултата е винаги число с плаваща запетая.
- Всички оператори са със лява асоциативност, освен повдигането на степен, което е с дясна асоциативност
- Скоби могат да бъдат използвани за промяна на асоциативността на операторите.
- Скобирането е със най-висок приоритет а след него повдигането на степен, след това умножението, делението, делението по модул(последните три са със равен приоритет), събиране, изваждане(също с равен приоритет).
Пример 4 - Аритметични оператори
#!/usr/bin/perl
#priority.pl
#Shows priority of arithmetic operations
$q = 5; $w = 2; $c = 4;
$d = 3; $e = 11; $f = 7;
$count = $q * $w % $c + $d / $f - $e;
print $count, „\n“;
Оператори за присвояване
- Основния оператор за присвояване е =
- Освен него, има редица други оператори за присвояване, комбиниращи присвояването с аритметична операция:
- Пример: $x += 5 е еквивалентно на $x = $x + 5;
- $x = $y = 0; е еквивалентно на $x = ($y = 0);
Оператори за увеличаване и намаляване (increment/decrement)
- Perl предоставя унарните оператори за увеличаване и намаляване на стойност ++ и --
- Те имат две форми – префиксна и постфиксна. Когато се използват като част от израз в префиксния вид те участват с новата си стойност сед изпълнение на операцията по увеличаване/намаляване, а във постфиксния участват с първоначалната си стойност и чак след пресмятането на израза се извършва операцията по увеличаване/намаляване
- Ползването на инкремент/декремент върху израз е синтактична грешка: ++($x + 1)
Пример 5 - Оператори за увеличаване и намаляване
#!/usr/bin/perl
#prefix_postfix.pl
#Shows usage of postfix/prefix operators
$var1 = 8;
$var2 = 8;
print $var1, „ “;
print $var1++, „ “;
print $var1, „\n“;
print $var2, „ “;
print ++$var2, „ “;
print $var2, „\n“;
Оператори за сравнение на числа
- >
- <
- >=
- <=
- == тества за равенство
- != тества за неравенство
- изключително важни за flow of control на програмата
Оператори за работа с низове
- lt (less than)
- gt (greater than)
- le (less than or equal)
- ge (greater than or equal)
- eq (equal)
- ne (not equal)
- изключително важни за flow of control
- сравняват стринговете лексикално, използвайки ASCII код (American Standard Code for Information Interchange)
- оператор за конкатенация --> „.“ (точка)
- оператор за мултиплициране на стринг --> „x“
- инкремента работи и върху стрингове; пример: $var = „a“; $var++;
- какво ще се случи ако $var = „aa“; $var++; ?
Пример 6 - Оператори за работа с низове
#!/usr/bin/perl
#strings_basic.pl
#Shows usage of postfix/prefix operators
$name = „Brandi“;
$welcome = „Welcome, „ . $name . „!“;
print $welcome, „\n“;
$dream = „sleep“ x 3;
print $dream, „\n“;
Числов и низов контекст
- В повечето популярни езици променливите трябва да се декларират и да съдържат определен тип данни. Примерно int counter;. Те са силно типизирани езици. За разлика от тях скаларите в Perl могат да реферират както низ, така и число, т.е. Няма нужда от предекларация. Стойността на променливата се конвертира до число или низ автоматично, в зависимост от контекста в който е използвана. Добре е да се следи в какъв контекст се използва съответната променлива.
- Няма нужда да ползваме chomp в числов контекст (защо?)
- Неинициализирани или недефинирани променливи имат стойност undef, която има различна стойност в зависимост от контекста (0 или „“)
- Стойността undef предизвиква warning, когато използваме -w flag на Perl.
Пример 7 - Числов и низов контекст
#!/usr/bin/perl
#context.pl
#illustrates undef, numeric and string context
$str = „Highest 10“;
$num = 10.0;
$sum = $num + $string; #what is sum?
print „Sum is: $sum\n“;
$concat = $num . $str; #what is concat?
print „Concat is: $concat\n“;
$sum2 = $concat + $sum; #what is sum2?
print „Sum2 is: $sum2\n“;
$undefSum = 10 + $someUndef;
print „10 + undef = $undefSum\n“;
print „The undef is $someUndef(end)\n\n“;
Сайтове и полезна информация
- http://www.freeprogrammingresources.com/perlbook.html
- http://www.perldoc.com
- Learning Perl, 4th Edition, 2005, Randal Schwartz
- Programming Perl, 3rd edition, 2000, Larry Wall
- Perl Cookbook, 2th Edition, 2000, Tom Christiansen, Nathan Torkington
Задачи
Задача 1
Да се напише програма, която позволява на потребителя да въведе две числа и да се изчисли разликата, сбора и делимото им (да има проверка за делене на 0).
Задача 2
Да се напише програма, която приема едно число с 5 цифри (да се провери че е такова) от потребителя и да се изведе петата цифра 5 пъти, четвъртата 4 пъти, третата 3 пъти, втората 2 пъти, и първата веднъж.
Задача 3
Да се напише програма, която позволява на потребителя да въведе две числа, и да се провери (и изведе) ако някое е кратно на другото.
Задача 4
Да се напише програма, която приема от потребителя едно число (по голямо от 0) и един символ ( например *, @, или #) и извежда квадрат, изграден от въведения символ, който е празен отвътре.
Например за число 1 и за символ * трябва да се изведе:
*
За 2 и за символ * трябва да се изведе:
**
**
За 5 и за символ @ трябва да се изведе:
@@@@@
@ @
@ @
@ @
@@@@@
Забележка
Може да ползвате само операторите и функциите, които са разгледани досега, т.е. употребата на конструкции за повторение, if/elsif/else, както и && и || отпадат.
Решения
- Задача 1 - http://code.google.com/p/alexx/source/browse/perl/perl-tu-zadachi/l2_z1.pl
- Задача 2 - http://code.google.com/p/alexx/source/browse/perl/perl-tu-zadachi/l2_z2.pl
- Задача 3 - http://code.google.com/p/alexx/source/browse/perl/perl-tu-zadachi/l2_z3.pl
- Задача 4 - http://code.google.com/p/alexx/source/browse/perl/perl-tu-zadachi/l2_z4.pl