Первое видео
Второе видео
Второе видео
runtime! debian.vim
syntax on
set hls
set tabstop=4
set shiftwidth=4
set smarttab
set et
" переносить длинные строки
set wrap
" наследовать отступы предыдущей строки
set autoindent
" умные отступы на основе синтаксиса
set smartindent
"подсветка любых пробелов на конце строки
au BufNewFile,BufRead * let b:mtrailingws=matchadd('ErrorMsg', '\s\+$', -1)
"подсветка табуляций, перед которыми или после которых есть пробелы
au BufNewFile,BufRead * let b:mtabbeforesp=matchadd('ErrorMsg', '\v(\t+)\ze( +)', -1)
au BufNewFile,BufRead * let b:mtabaftersp=matchadd('ErrorMsg', '\v( +)\zs(\t+)', -1)
" не разрешать курсору выходить за последний символ при выделении
set selection=old
if filereadable("/etc/vim/vimrc.local")
source /etc/vim/vimrc.local
endif
set tabpagemax=15
map <F4> <Esc>:tabnext<CR>
map <F3> <Esc>:tabprevious<CR>
map <F5> <C-W>p
map <F6> <C-W>w
sub mysub {
my ( $a, $b ) = @_;
return $a or $b;
}
интерпретатором будет воспринят как
sub mysub {
my ( $a, $b ) = @_;
( return $a ) or $b;
}
т.е. функция/метод всегда будет возвращать $a в не зависимости от того, истиннен он или ложен. Поэтому в данном случае надо использовать оператор || вместо or хотя я всегда считал, что два обозначения одного и того же оператора.
И в итоге наша функция будет выглядеть так:
sub mysub {
my ( $a, $b ) = @_;
return $a || $b;
}
package MyModuleParent;
use strict;
use warnings;
use Attribute::Protected;
sub new {
my $class = shift;
return bless {}, $class;
}
sub _private_method : Private {
print "This is private method in package " . __PACKAGE__ . "\n";
}
sub _protected_method : Protected {
print "This is protected method in package " . __PACKAGE__ . "\n";
}
sub public_method {
print "This is public method in package " . __PACKAGE__ . "\n";
}
1;
package MyModule;
use strict;
use warnings;
use parent 'MyModuleParent';
sub mymethod {
print "This is simple method in package " . __PACKAGE__ . "\n";
}
sub call_protect_method {
my $self = shift;
$self->_protected_method;
}
sub call_private_method {
my $self = shift;
$self->_private_method;
}
1;
#!/usr/bin/perl
use strict;
use warnings;
use MyModule;
use MyModuleParent;
my $parent_object = MyModuleParent->new;
my $object = MyModule->new;
$object->public_method; # OK
$object->mymethod; # OK
$object->call_protect_method; # OK
$object->call_private_method; # NOT OK
$parent_object->public_method; # OK
$parent_object->_protected_method; # NOT OK
$parent_object->_private_method; # NOT OK
Объект "$object" может вызвать публичный метод класса "MyModuleParent", т.к. от него наследуется класс "MyModule". Также, данный объект вызывает методы "call_protect_method" и "call_private_method", вызывающие в свою очередь protect и private методы класса "MyModuleParent" соответственно. Вызов метода "call_private_method" завершится с ошибкой _private_method() is a private method of MyModuleParent!, вызов метода "call_protect_method" завершится успешно.
Прямой вызов из скрипта private и protected методов класса "MyModuleParent"(через объект $parent_object) завершится с ошибкой.
use File::Spec;
my $mod_dir = (File::Spec->splitpath( __FILE__ ))[1];
Вызов File::Spec->splitpath( __FILE__ ) возвращает массив, в котором первым аргументом является имя файла, а вторым как раз будет полный путь от "/" до модуля.
git remote update origin --prune1.2. Затем переключимся на ветку
git checkout --track origin/<имя ветки>или для старых версий Git
git checkout -b <имя ветки> origin/<имя ветки>или так
git checkout master
git pull
git checkout <имя ветки>
git rm -r --cached FILE3. Посмотреть файл командой blame до указанного коммита
git commit -m "delete file from index"
git push origin master
git blame commitID~1 filename4. Удалить ветку на сервере
git push -d origin [имя ветки]5. Посмотреть историю между коммитами
git log --oneline commitID1..commitID2
$VAR1 = bless( {
'DOMAINS' => {
'yandex.ru' => 1,
'INVALID' => 5,
'rambler.ru' => 1,
'vk.com' => 1,
'mail.ru' => 2
},
}, 'MyModule' );
необходимо выводить данные хеш-массива DOMAINS, отсортированные по значениям(values) данного массива.
foreach my $domain (sort { $self->{DOMAINS}->{$b} cmp $self->{DOMAINS}->{$a} }
keys $self->{DOMAINS}) {
print $domain . "\t" . $self->{DOMAINS}->{$domain} . "\n";
}
В результате получаем то, что требовалось:
INVALID 5
mail.ru 2
yandex.ru 1
rambler.ru 1
vk.com 1
import sublime, sublime_plugin
class RunBuildCommand(sublime_plugin.WindowCommand):
def run(self, build_system):
self.window.run_command( "set_build_system", {"file": build_system } )
self.window.run_command( "build" )
{
"cmd": ["/usr/bin/perl", "$file"],
"file_regex": ".* at (.) line ([0-9])",
"selector": "source.perl"
}
{
"cmd": ["/usr/bin/perl", "-c", "$file"],
"file_regex": ".* at (.) line ([0-9])",
"selector": "source.perl"
}
[
{
"keys": ["alt+c"],
"command": "run_build",
"args": {
"build_system": "Packages/User/Perl-check.sublime-build"
}
},
{
"keys": ["alt+b"],
"command": "run_build",
"args": {
"build_system": "Packages/User/Perl-build.sublime-build"
}
}
]
После этого у вас на комбинациях alt-c и alt-b появляются проверка синтаксиса и выполнение скрипта соответственно.