понедельник, 18 октября 2010 г.

Блог закрыт!

Я вдоволь наигрался с Блоггером и решил что лучше своего родного ВордПресса нет ничего!

Все записи с этого дневника перенесены в мой основной блог http://andrey.opeykin.ru/. Новые записи будут публиковаться только там =)

пятница, 15 октября 2010 г.

Linux Mint книга на русском!


Для тех кто интересуется Linux и в частности Mint - думаю будет полезно почитать. 

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

купить на books.ru

среда, 13 октября 2010 г.

Бывает и такое!

Вы используете VirtualBox для разработки ? Прекращайте немедленно!
За два дня этот долбанный VirtualBox 2 раза проебал все мои данные.
А дело происходит вот как: при "жестком" выключении ноутбука (завис пару раз), если в этот момент была запущена виртуалка - ее образ бьется и ВМ работать перестает.
Вот сегодня утром, я так хорошенько "покодил", а после обеда виртуалбокс наебнулся! И все! Приехали! Начинать 6 часовой рабочий день снова!

Ubuntu 10.10 VirtualBox 3.2.8 ОС на виртуалке - Debian какой-о там.

пятница, 8 октября 2010 г.

Dancer Perl фреймворк. Презентация.

Dancer Perl фреймворк. Презентация.

Как обновить все Perl-модули за один раз ?

Вы следите за обновлением CPAN модулей, которые используются в ваших приложениях ? Нет!?!?
Думаю, не стоит объяснять для чего нужно их обновлять! Вы ведь обновляете свою операционную систему?! Ну да ладно! Речь не о том!

Для того чтобы узнать список Perl-модулей для которых доступны свежие версии - воспользуемся утилитой cpan, а чем же еще! В консоли вводим: cpan. Откроется cpan shell, в который вводим команду 'r', в результате получим список модулей для которых имеются обновления.
Для обновления - просто вводим команду 'upgrade' и идем пить чай, переодически поглядывая на консоль, так как процесс обновления может потребовать вашего участия.

Для обновления конкретного модуля в cpan shell вводим команду:

upgrade -ИМЯ_МОДУЛЯ-


Не хотите запускать cpan shell...нет проблем - обновляемся из командной строки linux.

Вводим команду:

perl -MCPAN -e 'CPAN::Shell->install(CPAN::Shell->r)'

В результате этого все модули будут обновлены (у меня заняло около 30-45 минут).

p.s. ВНИМАНИЕ! ГЛОБАЛЬНОЕ ОБНОВЛЕНИЕ МОЖЕТ СЛОМАТЬ ВАШЕ ПРИЛОЖЕНИЕ, ЕСЛИ ВЕРСИИ МОДУЛЕЙ НЕСОВМЕСТИМЫ!!!

use Perl or die;

Обработчик для ссылок

Каждый раз когда для ссылки назначается JavaScript-обработчик, необходимо предпринять некоторые дополнительные действия, чтобы страница не "передергивалась".
Отчмечу, что установка атрибута href в значение '#' (href='#') не помогает =(.

Правильные варианты:
1 JavaScript обработчик должен вернуть false
2 Атрибут href прописать следующим образом: href='javascript:void(0)'

среда, 6 октября 2010 г.

Полезность мониторинга ошибки 404

Каждый раз, когда передаю свои сайты заказчику или просто выкладываю в онлайн, все время оставляю отсылку email-уведомлений, при возникновении ошибок. В Yii это деалется очень просто. Подробнее вот здесь, раздел 'Отсылка ошибок почтой'.
Бывает за одну ночь приходит по 100-150 писем =). Вот что интересного удалось извлечь из этой кучи "спама".

1 Обязательно в корень каждого сайта добавляйте robots.txt, я часто забывал нем.
2 Обязательно в корень каждого сайта добавляйте favicon.ico,о нем тоже частенько забывают.

Особенно мне понравились попытки обратится по адресам типа вот таких:
http://mysite.ru/wp-admin/...
http://mysite.ru/showthreads/...

Очевидно кто-то сканирует сайты на известные cms и форумные движки.

Сегодня даже было обращение к адресу вида:

http://mysite.ru/.svn/...

Так что не забываем в паблик выкладывать не рабочую копию,
а экспортированные исходники (svn export).

Вот такие дела!

вторник, 5 октября 2010 г.

Печать фотографий через интернет в Ногинске

В Ногинске теперь можно заказать печать фотографий через Интрнет.

Очень удобно! Сам испытал!

Создал заказ, отправил, пришел и получил =)

Сайт (по уверению заказчика, это первая версия - "пробочная"), разрабатывался мной, так что, прошу любить и жаловать

http://pechat-noginsk.ru/

И да..если найдете ошибку - пишите тоже мне!

Удачного всем отдыха, хороших впечатлений и фотографий!

http://pechat-noginsk.ru/

понедельник, 13 сентября 2010 г.

Поправил мелкие баги на sprosiotvechu.ru

На сайте SprosiOtvechu.ru исправил некоторые мелкие баги.
После того как вернусь из отпуска, возьмусь серьезно за этот проект.
Есть куча идей, которые хочется реализовать.
А на то, что уже есть аналоги - нам наплевать =) Много, ведь не мало =)

п.с. Если будут предложения или замечания - пишите мне!

суббота, 11 сентября 2010 г.

Django или не Django !?

Почти закончил выполнять тестовый пример из Django туториала, все понравилось, я почти проникся Жангой.
Но тут наткнулся на горячее обсуждение вот такого вопроса http://softwaremaniacs.org/forum/django/23887/. Стало интеренсо =) !

Ради интереса зашел в баг-треккер Жанги и...ооо ужас! Некоторые тикеты висят вот уже 4-5 лет!

Например вот этот http://code.djangoproject.com/ticket/2504 !

Неужели все так плохо !? Или я просто чего-то не понимаю ?

пятница, 10 сентября 2010 г.

Django is a business ?

We're in the business of making Web frameworks, not Web servers.

Ну вот =(! А если бизнесс рухнет, то и Жанге хана ?

Catalyst и перегенарция моделей DBIx::CLASS

Как бы не ругали Catalyst, а тем более Perl - все же это очень удобные инструменты!

Взять только одну перегененрацию моделей!

Подробнее тут

Django url

Читаю документашку по Жагне =) Буду постить то, что запомнилось!

Finally, a performance note: these regular expressions are compiled the first time the URLconf module is loaded. They're super fast.

четверг, 9 сентября 2010 г.

Perl. Как узнать версию модуля ?

Вот один из вариантов:

perl -MMojo -e 'print Mojo->VERSION'

Здесь Mojo - название модуля, версию, которого мы хотим узнать, его с успехом можно заменить на CGI или что-то еще.

Как запустить Catalyst приложение в отладочном режиме и не перезапускать при изменении файлов

./script/myapp_server.pl -r -d

./script/myapp_server.pl --help - покажет много других полезных опций

В данном примере приложение называется MyApp.

среда, 8 сентября 2010 г.

Изучаем Perl. Упражнения к главе 3.

Перечитывая в 3-ий раз "Изучаем Perl" решил пройтись по всем упражнениям, которые там приводятся. Бубликую здесь свои варианты решения.

п.с. Парсер блогера вырезает строку STDIN, заключенную в знаки <> =(


1.
use strict;
use warnings;
use 5.010;

say 'Enter some lines!';

my @lines = 'STDIN'; #  STDIN в ><
@lines = reverse @lines;

say "Reversed lines is @lines";

2.
use strict;
use warnings;
use 5.010;

my @names = qw/Perl Php Python Ruby C++ C Shell/;

say 'Enter some numbers:';

chomp(my @numbers = 'STDIN'); # STDIN в ><

say 'You favorite languages is:';

foreach(@numbers){
    say $names[$_] if $names[$_];   
}
3.
use strict;
use warnings;
use 5.010;

say 'Input some strings!';

chomp(my @strings = 'STDIN');

@strings = sort @strings;

say "Sorted strings is: @strings";

понедельник, 6 сентября 2010 г.

jQuery создаем фильтры

Короткий и простой видео-ролик о том, как создавать фильтры в jQuery.

http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-dissecting-jquery-filters/

Особенно запомнилась проверка на "пустоту" объекта в JavaScript:

var data = {}; // создаем объект
 for(var i in data) return true;
 // если входим в цикл - значит что-то есть в объекте

четверг, 2 сентября 2010 г.

Perl. Восстановление переменной в цикле

use strict;
use warnings;
use 5.010;

my @languages = qw/Perl PHP Ruby/;

my $lang = 'Python';

foreach $lang (@languages){
    say $lang;
}

say '===========Loop is end!==========';
say $lang;

В результате получим:
Perl
PHP
Ruby
===========Loop is end!==========
Python

Таким образом Perl, при входе в цикл foreach сохраняет значение управляющей переменной, а после выхода из цикла восстанавливает ее.
Кроме того при модификации управляющей переменной - меняется и элемент массива:

use strict;
use warnings;
use Data::Dumper;
use 5.010;

my @languages = qw/Perl PHP Ruby/;

my $lang = 'Python';

foreach $lang (@languages){
    $lang = "$lang is cool!" if $lang eq 'Perl';
    say $lang;
}


say Dumper(\@languages);

Получим:
Perl is cool!
PHP
Ruby
$VAR1 = [
'Perl is cool!',
'PHP',
'Ruby'
];

среда, 1 сентября 2010 г.

Perl VS PHP холиварим

Коллега сегодня изрек. Расшифровка "ПХП":

'Пхп - Хуевый Перл'

p.s. языки можно поменять местами, кому как больше нравится =)
p.p.s Можно и Питон сюда вкорячить.

понедельник, 30 августа 2010 г.

Yii хотелки и меньше лапше-кода

Довольно часто, при работе с сессией в Yii, приходится писать код вот такого плана:

$nickName    = Yii::app()->user->getState('nickName');
$accessLevel = Yii::app()->user->getState('accessLevel');
.........................................................

Аналогично и при установке этих значений.


Было бы здорово иметь возможность передавать методам getState и setState массив параметров:

$data = Yii::app()->user->getState(array(
       'nickName',
       'accessLevel' 
));

или

Yii::app()->user->setState(array(
       'nickName'     => 'xoma',
       'accessLevel'  => 'superAdmin' 
));

воскресенье, 29 августа 2010 г.

JavaScript экономим на if или очередная экономия на спичках

Чем меньше по объему внешний JavaScript-файл, тем лучше (он быстрее загружается браузером и возможно (!) быстрее выполняется).

Мало какие сценарии JavaScript обходятся без конструкции if...else.

Типично она выглядит вот так (использую jQuery):

if($(this).is(':checked')){
    $('span.noAnonym').hide();
}else{
    $('span.noAnonym').hide();
}

Как видно из примера в блоках if и else всего по одному выражению.
В этом случае, конструкцию if...else можно заменить тернарным оператором ? :.

Перепишем предыдущий пример:

$(this).is(':checked') ? 
$('span.noAnonym').hide() :
 $('span.noAnonym').show();


Экономим 10 символов !!!

пятница, 27 августа 2010 г.

Yii. Конфликт имени модуля и контроллера.

Есть Yii приложение, у которого в настройках прописан модуль 'Page':

'page' => array(
     'class'  => 'application.modules.page.PageModule',
     'layout' => 'application.views.layouts.column2'
),

Так же есть простой контроллер 'PageController', расположенный в каталоге приложения 'controllers'.

При обращении по url типа: http://localhost/page/about - возникает ошибка, так как Yii пытается вызвать контроллер 'about' из модуля 'Page', а его нет.

При обращении по url http://localhost/Page/about (Page вместо page) - Yii вызывает контроллер Page и его экшн 'about' что мне и требовалось =).

Увеличиваем производительность труда =)

Всем, наверное, известно, что всякие твиттеры, жаберы, скайпы и прочие мессенджеры/социалки отнимают очень много рабочего времени. Для борьбы с этим, я в последнее время стараюсь не пользоваться всем выше перечисленным без острой необходимости. Твиттер, например, я читаю по пути домой (полтора часа в электричке способствуют этому =) ), хотя все же изредка пишу туда. Но сейчас речь не о том. Для разработки я использую Komodo Edit и он мне очень нравится, так вот, включив в нем полноэкранный режим (View->Full Screen) я заметил, что стал меньше отвлекаться на всякую ерунду, типа просмотра страниц/новостей и т.д. Все пространство занято рабочей областью редактора и ничего постороннего туда не пробивается, это помогает сосредоточиться на работе и не отвлекаться на всякий "шум".

Мораль: ИСПОЛЬЗУЙТЕ ПОЛНОЭКРАННЫЙ РЕЖИМ В ВАШИХ IDE!!!

qw - 'Quoted Words' или 'Quoted by Whitespace'

my @data = qw /Mojolicious Catalyst Dancer/;

Perl интерпретирует данные в выражении qw как строки в апострофах, т.е. там нельзя использовать интерполяцию переменных и символы типа '\n'

qw удалет пропуски (пробелы, табуляции, символы новой строки), а все остальное преобразует в список.

Для включения в список символа ограничителя - необходимо экранировать его с помощью '\'

  my @data = qw !Google Yahoo \! Rambler!;

Отрицательные индексы в массивах Perl

В Perl есть прекрасная возможность отсчитывать индексы не с начала массива, а с конца.

Пример:

   my @languages = ('Perl','Python','Php');
   say $languages[-3];
   #тоже самое что и $languages[0] - выведет "Perl"

Для обращения к последнему элементу массива вместо конструкции:

$#languages;
#конструкция $#имя_массива - вернет последний индекс массива

Можно использовать вот такую:

$languages[-1];

четверг, 26 августа 2010 г.

Вот нашел!

Нашел вот такой свой комментарий в файле с JavaScript-кодом =)

Больше 3-х лет прошло =)

Вы бы видели код!!! Ужос!!! Про jQuery я тогда и не знал =)


// JavaScript Document
// скрипт для проверки полей формы
//my function 8.06.2007

//================================================

среда, 25 августа 2010 г.

Flash-сообщения

Прикрутил к нашему самописному Perl-овому движку возможность использовать flash-сообщения.

Алгоритм прост:
1. Записать сообщение в сессию.
2. При следующем чтении этого сообщения - удалить его из сессии.

Вот и все! Жизнь стала проще и веселее =)!

MojoX::Validator первое знакомство

На CPAN есть вот такой замечательный модуль для валидации данных (!) MojoX::Validate . Как видно из названия модуль предназначен для использования в фреймворке Mojolicious. Однако и отдельно от него он прекрасно работает, хотя и тащит за собой Mojo =(.

Пример использования:

use MojoX::Validator;

#создаем новый объект
my $validator = MojoX::Validator->new;        
#массовое добавдение полей для проверки
$validator->field([qw/ID USER_ID/])->each(sub{
   shift->required(1)->regexp(qr/^\d+$/)
});
#правило для одного поля 
$validator->field('NAME')->length(1,20);
#валидируем
$validator->validate({NAME => $name});
#получаем ошибки
$validator->errors;

Маленькая особенность.

Если в конструкции:
$validator->field([qw/ID USER_ID/])->each(sub{
shift->required(1)->regexp(qr/^\d+$/)
});  
указать только одно поле (в списке полей) - работать не будет!

Для одного поля используйте запись вида:
$validator->field('NAME')->length(1,20); 

Бложик индексируется

Этот мой маленький бложик начал индексироваться гуглом!
Скоро я захвачу мир =) !

вторник, 24 августа 2010 г.

Коварство rules urlManager в Yii

Долго мучился с проблемой, все описано вот тут

Валидируем UTF-ые строки в Yii

Начиная с версии 1.1.1 CStringValidator может принимать параметр "encoding". Выдержка из API:
the encoding of the string value to be validated (e.g. 'UTF-8'). Setting this property requires you to enable mbstring PHP extension. The value of this property will be used as the 2nd parameter of the mb_strlen() function. Defaults to false, which means the strlen() function will be used for calculating the length of the string.
Используйте его при валидации текстовых строк на русском языке.

Пример (часть метода rules модели):

array('question, answer', 'length', 'max'=>255,'encoding' => 'utf-8'),

И не забудьте прочитать статью о том, как включить поддержку Юникод в Yii

Оператор повторения строк в Perl

Оператор повторения строк в Perl - x.

Пример:

$str = 'xoma';
say $str x 3; #xomaxomaxoma

Пробел между переменной-строкой и знаком "x" обязателен.
Иначе возникнет неоднозначность и программа работать не будет.

Изучаем Perl. Упражнения к главе 2.

Ответы на упражнения к главе 2.


1
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;

use constant PI => 3.141592654;

my $radius = 12.5;
say 2 * PI * $radius;
2
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;

use constant PI => 3.141592654;

say 'Input radius:';

chomp(my $radius = <STDIN>);

say 2 * PI * $radius;
3
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;

use constant PI => 3.141592654;

say 'Input radius:';

chomp(my $radius = <STDIN>);

my $circ = 2 * PI * $radius;

if($radius < 0){
    $circ = 0;
}

say $circ;

4
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;

say 'input one number:';

chomp(my $one = <STDIN>);

say 'input second number:';

chomp(my $second = <STDIN>);

my $result = $one * $second;

say "$one * $second = $result";
5
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;

say 'input one string:';

chomp(my $string = <STDIN>);

say 'input repeat number:';

chomp(my $number = <STDIN>);

my $result = $string x $number;

say "result is $result";

Особо запомнилась конструкция вида:
chomp(my $radius = <STDIN>);

10 лет прошло

Составление концепции проекта

Казалось бы что может быть проще!
Есть проект, необходимо его описать и составить некую концепцию.
Для меня концепция - это краткое описание цели проекта, его преимуществ и достоинств. Однако на деле все оказывается не так просто.
Есть разрабатываемый проект - портал о достопримечательностях всего мира (http://ru.worldpoi.info/), необходимо изложить в письменном виде концепцию этого проекта.

Открываю новый текстовый файл в надежде, что сейчас слова потекут рекой...но не тут то было! Полнейший ступор! Я не знаю с чего и как начать!


Блин...думаю...думаю...Если что надумаю - выложу тут =)

понедельник, 23 августа 2010 г.

Доступ к настройкам модуля в Yii

При разработке на Yii довольно часто приходится иметь дело с модулями.
Каждый модуль может иметь свои настройки (переменные уровня модуля). Для получения доступа к такого рода настройкам из самого модуля я использую конструкцию типа вот такой:

Yii::app()->controller->module->propertyName;
Однако если настройки модуля необходимо получить из другого модуля этого же приложения  или из самого приложения - такой прием не подойдет, так как переменная module может быть не определена, если текущий контроллер  не принадлежит модулю.
Для этого применяется конструкция вида:
Yii::app()->getModule('user')->propertyName;

Здесь 'user' - название модуля, замените его на название своего модуля.
ВНИМАНИЕ!!! 
Название модуля пишется только в нижнем регистре, иначе не работает!

Второй вариант более универсальный и переносимый - стараюсь использовать только его.

Запарился с почтой от mail.ru

Все почтовики (Яндекс, Гугл и т.д.) "хавают" письма нормально, нет вот mail.ru начинает кочеврежиться. Косяк то конечно мой (лишняя запятая в хедере), но блин, все нормально переваривают, а мыло не хочет.

п.с. и рамблер !

Списки и массивы в Perl

Я все время путался в терминах, что такое список и что такое массив в Perl.  
Перечитывая "Изучаем Perl" обнаружил, что там дается простое и понятное определение.
Список содержит упорядоченную коллекцию скалярных значений. 
Массив представляет собой переменную для хранения  списка. 
Список - это данные, а массив - переменная. 
В программе можно создать списочное значение, которое не хранится в массиве, но любая переменная массива содержит список.

воскресенье, 22 августа 2010 г.

Отдача нескольких файлов через PHP

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

суббота, 21 августа 2010 г.

Mojo 0.999929

Поставил Mojo 0.999929.
Все хочу подробнее "поковырять" Mojo и Mojolicious - да вот все времени не хватает =(.

 Для тех кто не знал/забыл - для установки/обновления этого замечательного Perl-фреймворка введите (ubuntu):

sudo cpanp install  Mojo

пятница, 20 августа 2010 г.

Ассоциативность операторов в Perl

Я уже и забыл, что есть такая штука как "ассоциативность" операторов и что она бывает правая и левая. Ассоциативность определяет в какой последовательности выполняются операторы с одинаковым приоритетом.

Пример:

5**6**8 # в какой последовательности будет выполнено возведение в степень ?
Правильный ответ:

5**(6**8)  # так как опертатор ** имеет правую ассоциативность
В "книге с ламой" очень правильно написано:

Нужно ли заучивать таблицу приоритетов и ассоциативности ?  
НЕТ!
Никто этого не делает!

Если возникает неоднозначность - просто используйте скобки!
Тем самым вы облегчите жизнь тому, кто будет поддерживать ваш код!

Perl от ActiveState

Про Perl

Оказывается, практически любая комбинация знаков препинания используется в Perl для каких-нибдуь целей. Так что если у вас наступит творческий кризис, пустите кошку прогуляться по клавиатуре и отладьте результат.
"Изучаем Perl" стр.55

четверг, 19 августа 2010 г.

Yii как я форматирую код

При разработке на Yii очень часто приходится иметь дело с формами и с моделями.
Формы (потомки CFormModel)  и модели (CActiveRecord), как правило, принимают параметры и что-то с ними делают =). При этом часто можно видеть записи вида:

$model = new Model();
$model->attr_1 = 'attr_1';
$model->attr_2 = 'attr_2';
.......................................

Такая "кишка" присваиваний выглядит в коде не очень здорово.

Вместо этого можно и нужно использовать метод setAttributes.
Если еще и отформатировать код как-нибудь вот так:
     $registration = new Registration();
$registration->setAttributes(array(
'email'    => $email,
'nickName' => $login,
'password' => $pass,
));
if($registration->save()){
    }
Жизнь становится прекраснее!

Аналогично форматировать  можно и код  выборки данных, используя ORM Yii:
$answers = Question::model()->answered()->with('user.profile','fromUser')->findAll(array(
'condition' => 't.userId = :userId',
'limit'     => self::STREAM_PER_PAGE,
'offset'    => $already,
'params'    => array('userId' => $user),
'order'     => 't.creationDate DESC'
)); 


Пусть Ваш код будет приятным для чтения и просмотра!

--message при svn commit

Заметил в себе дурную привычку: при коммите кода в репозиторий в сообщении для коммита либо вообще ничего не указываю, либо указываю одно и тоже сообщение по 100 раз.

Вот например сегодня сделал уже 3 коммитатаким образом:

svn commit --message "Правки по схеме Станислава"

Интересно через месяц я вспомню что это за "Схема Станислава" и почему по ней около 100 коммитов в репозитории?

Сжимаем JavaScript в Yii

Очень модная и что самое главное - ПОЛЕЗНАЯ тема последнего времени в веб-разработке это "Клиентская оптимизация".
Всякие там сжатия, объединения, спрайты, оптимизация картинок и еще много много всего.

Потепенно постигая основы этого "колдовства", я пока активно применяю только сжатие JavaScript и css-файлов. Что такое сжатие ?  Это просто удаление "лишних" символов, таких как комментарии и символы, используемые для форматирования кода (пробелы, переводы строки, табуляции и прочее)...В результате размер файла сокращается, а значит увеличивается скорость его загрузки и как следствие из этого увеличивается скорость загрузки и отображения всей страницы.

В своих PHP-проектах я в основном использу фреймворк Yii и именно для него написал простую консольную команду для сжатия жабаскрипта.

скачать
краткое описание

Мой очередной бложик

Решил реанимировать этот свой бложик!

Буду писать сюда всякую очевидную ерунду, может оно кому и пригодится =)

Основные темы - Perl, Php, JavaScript и прочие страшные слова =)

Иногда буду ругаться матом - так что не удивляйтесь =)

Больших статей и заметок тут не будет - за этим посылаю вас на http://allframeworks.ru/ и http://andrey.opeykin.ru/.

Здесь же будет все то, что уже не лезет в твиттер и слишком мало для нормальной статьи.

Посмотрим что получится!

п.ы. что-то очень много смайликов наставил =) =) =)

Интерполяция переменной в Perl

В строке, заключенной в двойные кавычки, переменная интерполируется, т.е. заменяется своим значением.

my $str = 'Hello!';
print "$str world"; # Hello world!

Perl берет максимально длинное имя переменной, т.е. написав

print "$strworld";

мы не получим того что ожидали =( Так как Perl будет искать переменную $strworld, которой нет!

Для исправления этой ситуации - заключите имя переменной в фигурные скобки:

print "${str}world"; 

Обратите внимание знак $ (сигил) остается за скобками =)