Форум программистов, компьютерный форум, киберфорум
Perl
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 13
1

Переменные с двумя символами доллара ($$)

20.10.2011, 20:28. Показов 1840. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Задали лабу, вот задание: Разработать программу просмотра дерева каталогов и формирования отчета, в котором находятся имена файлов, содержащих заданную последовательность символов, а также счетчик числа таких последовательностей, обнаруженных в каждом из перечисленных файлов. Последовательность символов вводится с клавиатуры или через командную строку. Предусмотреть возможность вызова программы в двух режимах:
— с учетом регистра;
— без учета регистра.
В качестве корня дерева использовать каталог, имя которого вводится пользователем.

Код:

Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/perl -w
 
 
use Cwd;       
my($case, $node, $sampl, $temp);
 
 
unless ($node) {
    print"введите название каталога: ";
    chomp($node = <STDIN>);
} else { $node = $ARGV[0]; }
 
unless ($sampl) {
    print"введите последовательность символов: ";
    chomp($sampl = <STDIN>);
} else { $sampl = $ARGV[1]; }
 
unless ($case) {
    print"учитывать регистр (y/n): ";
    chomp($case = <STDIN>);
    if ($case eq 'y') { $case = 1; }
    else { $case = undef; }
}
 
unless ($ARGV[2]) {
    print"введите название результирующего файла: ";
    chomp($temp = <STDIN>);
    open RESOUT, ">$temp" || die "не могу открыть файл: $!\n"; 
} else {
    open RESOUT, ">$ARGV[2]" || die "не могу открыть файл $ARGV[2]: $!\n";
}
 
search_sampl(\$node, \$sampl, \$case);
close RESOUT;
 
sub search_sampl { 
    my($pnode, $psamp, $pcase) = @_;
    my(@files, $f_cur);
        my($ch, @result, $str);
        my($cur_dir, $path);
        
    opendir DIR, $$pnode;
        @files = readdir DIR;
    closedir DIR;
        chdir($$pnode) || die "не могу открыть каталог: $!\n";
        $cur_dir = cwd;
        foreach $f_cur (@files) {
        if (-f $f_cur) {
                    $path = $cur_dir."/".$f_cur;
            open IN, "<$f_cur" || warn "не могу открыть файл $f_cur. $!\n", redo;
                        $ch = 0;
                        while ($str = <IN>) {
                    if ($$pcase) {
                            @result = $str =~ m/$$psamp/g;
                            $ch += @result;
                        } else {
                            @result = $str =~ m/$$psamp/gi;
                            $ch += @result;
                        }
                }
                print RESOUT "$path  послед. { $$psamp } = $ch\n";
                close(IN);
            }
            if ((-d $f_cur) && !($f_cur =~ /^\.\.?$/)) {
                search_sampl(\$f_cur, $psamp, $pcase);
                chdir("$cur_dir") || warn "не могу открыть каталог $cur_dir. $!\n", redo;
            }
    }
}
Надыбал эту лабу, где уже не помню. Преподаватель докапался до переменных где происходит поиск с учетом регистра и без: $$psamp. Мол для чего тут два символа доллара? Сам никак не допру, помогите кто разберется пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2011, 20:28
Ответы с готовыми решениями:

FreePascal. Известна стоимость покупки и продажи доллара в банках. Найти банк, где разница между куплей и продажей доллара минимальна
В городе N банков. Известна стоимость покупки и продажи доллара в этих банках. Найти банк, где...

Строка между двумя одинаковыми символами
Здравствуйте, может кто сталкивался с такой проблемой. Мне нужно регулярными выражениями выбирать...

Вставка символа между двумя символами в файле
Добрый день. Изучая С дошел до темы файлового ввода-вывода, ни у Дейтелов, ни у Прата не нашел...

Найти количество групп с двумя и тремя символами
Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или...

6
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
21.10.2011, 03:52 2
Это разименование ссылок переданных в суб
1
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 13
21.10.2011, 20:36  [ТС] 3
Mutagen можно по подробней что это такое "разименование ссылок переданных в суб". Буду очень признательна за информацию.
0
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
22.10.2011, 13:41 4
это суб (подпрограмма)
Цитата Сообщение от lolli Посмотреть сообщение
sub search_sampl {...}
это передача в неё переменных по ссылке (\ - операция взятия ссылки)
Цитата Сообщение от lolli Посмотреть сообщение
search_sampl(\$node, \$sampl, \$case);
это забор этих ссылок внутри субки
Цитата Сообщение от lolli Посмотреть сообщение
my($pnode, $psamp, $pcase) = @_;
$$var - $ берёт значение из ссылки $var и возвращает его - это и есть операция разыменования
Цитата Сообщение от lolli Посмотреть сообщение
opendir DIR, $$pnode;
1
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 13
22.10.2011, 20:37  [ТС] 5
Спасибо большое, кое-что проясняется. Т.е это один из способов передачи переменных в функцию. Еще 1 вопрос: Почему чел который делал эту лабу не воспользовался более традиционным способом, зачем все усложнять-то?
0
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
22.10.2011, 23:51 6
Думаю что писал программист с, и у него привычка к поинтерам
1
6239 / 2114 / 334
Регистрация: 10.12.2013
Сообщений: 7,273
30.07.2018, 18:45 7
Рубрика "Листая старые страницы"

Замечание:
Передавать явно адрес скаляра большого смысла не имеет,
потому что скаляр и так передаётся по ссылке.

проверка этого утверждения:
Perl
1
2
3
4
5
sub test { $_[0] = 1000000; undef }
 
my $arg = 10;
test($arg);
print($arg);
на выходе будет что? правильно, мильон.



С практической точки зрения студенту для решения надо было воспользоваться удобной утилитой
find2perl, которая генерирует скелетон готового решения поиска файлов по дереву на языке Perl, используя соответствующие опции утилиты find, которые пользователь должен предоставить.

Bash
1
find2perl требуемый_каталог -name '*часть_имени*'
Будет сгенерирован следующий скелет:
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use strict;
use File::Find ();
 
# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.
 
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name   = *File::Find::name;
*dir    = *File::Find::dir;
*prune  = *File::Find::prune;
 
sub wanted;
 
 
 
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, 'требуемый_каталог');
exit;
 
 
sub wanted {
    /^.*часть_имени.*\z/s
    && print("$name\n");
}
Всё, что требуется - это в теле sub wanted разместить нужную функциональность
Миниатюры
Переменные с двумя символами доллара ($$)  
0
30.07.2018, 18:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2018, 18:45
Помогаю со студенческими работами здесь

Cкопировать инфу между символами табуляции в разные переменные
Снова возникла необходимость в использовании регулярных выражений. Есть таблица с примерно вот...

Удалить символы расположенные между двумя заданными символами
Подскажите пожалуйста , какой нужно использовать код , что бы удалить в строке символы после...

Как получить текст между двумя одинаковыми символами
Приветствую форумчане. Ребят, прошу вашей помощи. Доделываю форум и осталось реализовать ответ...

Удаление в текстовом файле символов между двумя известными символами
Добрый день. Не нашёл решение проблемки на форуме, а суть проблемы в следующем: есть текстовичок...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru