Форум программистов, компьютерный форум, киберфорум
Perl
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Заблокирован

Аргументы командной строки

30.07.2023, 19:22. Показов 1218. Ответов 9

Студворк — интернет-сервис помощи студентам
В общем , решил побаловаться и написал вот такой скриптик - делает листинг скрытых либо в текущей директории, лиюо в указанной. У программы есть флаги - флаг b и флаг f. Флаг b стоит по умолчанию, но можно применить флаг f и получить листинг где будет указан полный путь. Пример использования:
Bash
1
raku имя_программы /home/${USER} -f
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sub MAIN($x='.', $y='-b') {
 
  if $y ~~ "-b"  {
     for (dir $x)>>.basename.sort {
        if .IO.d and m/^'.'/ {
        .say ~ '/d';
    }
     }
   } elsif $y ~~ '-f' {
      for (dir $x).sort {
         if .IO.d and .basename ~~ m/^'.'/ {
        (.path ~ '/').say;
     }
      }
   } else {
      die 'only -f and -b flags are allowed'
   };
 
}
Но! Я хочу, чтобы флаг был первым аргументом, а путь вторым. Однако если я меняю местами аргументы x и y, то программка перестает работать. С чем это может быть связано?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.07.2023, 19:22
Ответы с готовыми решениями:

Распечатать переданные в программу аргументы командной строки
программа распечатывает переданные в неё аргументы командной строки. не могу понять с чего начать, и как определить командную строку в...

Программа, распечатывающая переданные в нее аргументы командной строки
Добрый вечер. Требуется написать программу, которая распечатывает переданные в нее аргументы командной строки. В интернете нашла код: ...

Программа, распечатывающая переданные в нее аргументы командной строки
Программа, распечатывающая переданные в нее аргументы командной строки.

9
 Аватар для volodin661
6625 / 2256 / 346
Регистрация: 10.12.2013
Сообщений: 7,803
31.07.2023, 16:34
явно связано с '-' перед аргументом.
0
Заблокирован
02.08.2023, 14:33  [ТС]
Цитата Сообщение от volodin661 Посмотреть сообщение
явно связано с '-' перед аргументом.
А что, есть какие-то ограничения на этот счёт?
0
 Аватар для volodin661
6625 / 2256 / 346
Регистрация: 10.12.2013
Сообщений: 7,803
03.08.2023, 06:23
то неловкое чувство,
когда надо подобрать слова для человека,
который, встав на противопехотную мину двумя ногами,
задает вопрос:
- А что, разве есть какие-то ограничения, где мне стоять ? Я свободный гражданин !

Добавлено через 16 минут
символы [space]- и [space]--
участвуют в задании опций ком. строки
и в случае разбора сигнатуры функции MAIN определяют наличие именованного аргумента.
1
Заблокирован
03.08.2023, 11:53  [ТС]
Цитата Сообщение от volodin661 Посмотреть сообщение
символы [space]- и [space]--
участвуют в задании опций ком. строки
Это я знаю. Только в чём проблема так и не понял. Я на расте уже всё написал.
Кликните здесь для просмотра всего текста

Rust
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
use std::fs;
use std::env;
use std::process;
use std::io::ErrorKind;
 
#[derive(Debug)]
enum WRN_EXT {
  TOO_MANY_ARGUMENTS = 1,
  WRONG_FLAG,
  PATH_DOSNT_EXIST,
  WRONG_USAGE,
  PERMISSION_DENIED,
  SOMETHING_WRONG
}
 
fn main() {
 
    let args = env::args().collect::<Vec<String>>();
    let length = args.len();
   
     
    if length > 3  {
        println!("{:?}", WRN_EXT::TOO_MANY_ARGUMENTS);
        println!("USAGE: ");
        println!("-h help");
        println!("-f file");
        println!("-d directory");
        println!("--------------------------");
        println!("{}", args[0]);
        println!("{} -h", args[0]);
        println!("{} -f or -d", args[0]);
        println!("{} path -f or -d", args[0]);
        process::exit(WRN_EXT::TOO_MANY_ARGUMENTS as i32);
    }    
 
    if length == 1 {
 
        let files = match fs::read_dir(".") {
            Err(error) => {
                let errorkind = error.kind();
                match errorkind {
                    ErrorKind::PermissionDenied => {
                        println!("{:?}", WRN_EXT::PERMISSION_DENIED);
                        process::exit(WRN_EXT::PERMISSION_DENIED as i32);
                    },
                    _=>  {
                        println!("{:?}: {:?}", WRN_EXT::SOMETHING_WRONG, errorkind);
                        process::exit(WRN_EXT::SOMETHING_WRONG as i32);
                    },
                }
            },
            Ok(val) => val
        };
 
      
       let (d, f): (Vec<_>, Vec<_>) = files.partition(|x|{x.as_ref().unwrap().path().is_dir()}); 
       
       println!("");
       println!("Directories:");
       println!("------------");
       for file in &d { 
           let file = file.as_ref().unwrap().path();   
           let str_file = file.file_name().unwrap().to_str().unwrap().to_string();
 
           if str_file.starts_with(".") {
               println!("{}/", str_file);
           } 
       }
       println!("");
       println!("Files:");
       println!("------------");
       
       for file in &f {
           let file = file.as_ref().unwrap().path();  
           let str_file = file.file_name().unwrap().to_str().unwrap().to_string();
 
           if str_file.starts_with(".") {
               println!("{}/", str_file);
           }
       }
       println!("");
    } else if length == 2 && &args[1] == "-h" {
        println!("USAGE: ");
        println!("-h help");
        println!("-f file");
        println!("-d directory");
        println!("--------------------------");
        println!("{}", args[0]);
        println!("{} -h", args[0]);
        println!("{} -f or -d", args[0]);
        println!("{} path -f or -d", args[0]);
        process::exit(0);
    } else if length == 2 && &args[1] == "-f" ||
                             &args[1] == "-d" {                         
                                 
        let files = match fs::read_dir(".") {
           Err(error) => {
               let errorkind = error.kind();
               match errorkind {
                   ErrorKind::PermissionDenied => {
                       println!("{:?}", WRN_EXT::PERMISSION_DENIED);
                       process::exit(WRN_EXT::PERMISSION_DENIED as i32);
                   },
                   _=>  {
                       println!("{:?}: {:?}", WRN_EXT::SOMETHING_WRONG, errorkind);
                       process::exit(WRN_EXT::SOMETHING_WRONG as i32);
                   },
               }
           },
           Ok(val) => val,
        };
            
        for file in files {
           let file = file.unwrap();
           let path_file = file.path();
           let str_file = path_file.file_name().unwrap().to_str().unwrap().to_string();
 
         if &args[1] == "-f" {
            if path_file.is_file() && str_file.starts_with(".") {
              println!("{}", str_file);
            }
         } else if &args[1] == "-d" {
            if path_file.is_dir() && str_file.starts_with(".") {
              println!("{}/", str_file);
            }  
          } else {
               println!("{:?}", WRN_EXT::WRONG_FLAG);
               println!("USAGE: ");
               println!("-h help");
               println!("-f file");
               println!("-d directory");
               println!("--------------------------");
               println!("{}", args[0]);
               println!("{} -h", args[0]);
               println!("{} -f or -d", args[0]);
               println!("{} path -f or -d", args[0]);
               process::exit(WRN_EXT::WRONG_FLAG as i32);
          }
      }      
    } else if length == 3 {
 
        if &args[2] == "-d" {
            let files = match fs::read_dir(&args[1]) {
                Err(error) => {
                    let errorkind = error.kind();
                    match errorkind {
                        ErrorKind::PermissionDenied => {
                            println!("{:?}", WRN_EXT::PERMISSION_DENIED);
                            process::exit(WRN_EXT::PERMISSION_DENIED as i32);
                        },
                        ErrorKind::NotFound => {
                            println!("{:?}", WRN_EXT::PATH_DOSNT_EXIST);
                            process::exit(WRN_EXT::PATH_DOSNT_EXIST as i32);
                        },
                        _=>  {
                            println!("{:?}: {:?}", WRN_EXT::SOMETHING_WRONG, errorkind);
                            process::exit(WRN_EXT::SOMETHING_WRONG as i32);
                        },
                    }
                },
                Ok(val) => val
            };
      
               for file in files {
                   let file = file.unwrap();
                   let path_file = file.path();
                   let str_file = path_file.file_name().unwrap().to_str().unwrap().to_string();
 
                   if path_file.is_dir() && str_file.starts_with(".") {
                      println!("{}/", str_file);
                   }
               } 
            } else if &args[2] == "-f" {
 
                let files = match fs::read_dir(&args[1]) {
                    Err(error) => {
                        let errorkind = error.kind();
                        match errorkind {
                            ErrorKind::PermissionDenied => {
                                println!("{:?}", WRN_EXT::PERMISSION_DENIED);
                                process::exit(WRN_EXT::PERMISSION_DENIED as i32);
                            },
                            ErrorKind::NotFound => {
                                println!("{:?}", WRN_EXT::PATH_DOSNT_EXIST);
                                process::exit(WRN_EXT::PATH_DOSNT_EXIST as i32);
                            },
                            _=>  {
                                println!("{:?}: {:?}", WRN_EXT::SOMETHING_WRONG, errorkind);
                                process::exit(WRN_EXT::SOMETHING_WRONG as i32);
                           },
                        }
                    },
                    Ok(val) => val
                };
 
               for file in files {
                   let file = file.unwrap();
                   let path_file = file.path();
                   let str_file = path_file.file_name().unwrap().to_str().unwrap().to_string();
 
                   if path_file.is_file() && str_file.starts_with(".") {
                      println!("{}", str_file);
                   }
               } 
            } else {
                println!("{:?}", WRN_EXT::WRONG_FLAG);
                println!("USAGE: ");
                println!("-h help");
                println!("-f file");
                println!("-d directory");
                println!("--------------------------");
                println!("{}", args[0]);
                println!("{} -h", args[0]);
                println!("{} -f or -d", args[0]);
                println!("{} path -f or -d", args[0]);
                process::exit(WRN_EXT::WRONG_FLAG as i32);
            } 
    } else {
        println!("{:?}", WRN_EXT::WRONG_USAGE);
        println!("USAGE: ");
        println!("-h help");
        println!("-f file");
        println!("-d directory");
        println!("--------------------------");
        println!("{}", args[0]);
        println!("{} -h", args[0]);
        println!("{} -f or -d", args[0]);
        println!("{} path -f or -d", args[0]);
        process::exit(WRN_EXT::WRONG_USAGE as i32);
    }
 
}


Добавлено через 35 минут
На Clojure тоже набросал
Кликните здесь для просмотра всего текста
Lisp
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
(defn read-dir [file arg] 
  (doseq [file (sort (.listFiles file))]
         (let [str-file (re-find #"\..*" (str file "/"))]
           (cond 
             (= "-f" arg)
             (do                  
               (if (and (.isFile file) str-file)
                 (println str-file)))
             (= "-d" arg)
             (do
               (if (and (.isDirectory file) str-file)
                 (println str-file)))))))
                  
 
 
(defn -main []
  (let [args  *command-line-args*
        flag (first args)
        len  (count args)
        file (clojure.java.io/file (second args))]  
    (cond 
          (= 0 len)
             (println "not enough arguments to do something")
          (and (= 1 len) (or (= flag "-f") (= flag "-d"))) 
             (read-dir (clojure.java.io/file ".") flag) 
          (and (= 2 len) (.exists file) (or (= flag "-f") (= flag "-d")))
             (read-dir file flag)
          :else 
             (println "usage: [-f for serching dot files; -d for searching dot directories] [path]"))))   
             
 
(-main)


Все работает. Могу написать
Bash
1
clojure main.clj  -f /tmp
Мы же можем написать
Bash
1
rm -rf /tmp/file
А
Bash
1
--
указывает конец аргументов-ключей. Поэтому мы можем удалить файл с именем -f указав где конец аргументов ключей
Bash
1
 rm -rf -- -f
Почему я не могу использовать ключи в каком порядке хочу, мне не понятно
0
 Аватар для volodin661
6625 / 2256 / 346
Регистрация: 10.12.2013
Сообщений: 7,803
03.08.2023, 12:16
Гай,
тебе не надо самому обрабатывать короткие палочки. -f
и длинные не надо. --b

и help не надо придумывать,
после разбора сигнатуры raku сгенерит help самостоятельно


https://docs.raku.org/routine/MAIN
1
Заблокирован
03.08.2023, 12:42  [ТС]
Цитата Сообщение от volodin661 Посмотреть сообщение
Гай,
тебе не надо самому обрабатывать короткие палочки. -f
и длинные не надо. --b
Вот это я и хотел услышать. Как раз так и подозревал)

Добавлено через 3 минуты
Ещё вот что там прочитал
By default, named arguments passed to the program (i.e., MAIN) cannot appear after any positional argument. However, if %*SUB-MAIN-OPTS<named-anywhere> is set to a true value, named arguments can be specified anywhere, even after positional parameter. For example, the above program can be called with:
0
 Аватар для volodin661
6625 / 2256 / 346
Регистрация: 10.12.2013
Сообщений: 7,803
03.08.2023, 15:38
Эти убогие из Bell Laboratory не смогли даже дотумкать,
что можно использовать не только тире, но и точки,
полностью используя накопленный человеческий капитал в лице азбуки MORSE.

Последовательность точек и тире составляют букву, обозначающую
тип ожидаемого аргумента

Итак:

A ( array; are ) .-
T ( no type; the ) -
I ( integer ) ..
S ( string) ...
R ( real ) .-.
X ( hex ) -..-
B ( boolean ) -...





Bash
1
my_programme ..count 60 -..-DEADBEEF -...YES .-COLUMNS 10 22 30 56 -IP 12.34.56.78 ...W "NO FATE"
0
Заблокирован
16.08.2023, 13:54  [ТС]
volodin661, это плохо читаемо.
Мне кажетмя, что вся проблеиа из-за того, что нет какого-то стандарта.
Каждый лепет как хочет. Например можно было бы сделать стандарт с четким разделением ключ - значение и прочие оргументы.
Например --keys после чего идут ключи, --args после чего идут аргументы
0
 Аватар для volodin661
6625 / 2256 / 346
Регистрация: 10.12.2013
Сообщений: 7,803
16.08.2023, 14:05
Цитата Сообщение от Гай Посмотреть сообщение
это плохо читаемо.
если не знаешь алфавита


Говорят, Морзе придумал свою азбуку, пока медитировал в мужской бане;
два длинных один короткий, два коротких, опять короткий, три длинных.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.08.2023, 14:05
Помогаю со студенческими работами здесь

Сложение, вычитание и умножение матриц с указанием файлов через аргументы командной строки
Реализовать прикладное приложение на Haskell, работающее с консолью, которое будет складывать, вычитать и умножать матрицы с указанием...

Доработка кода Сложение, вычитание и умножение матриц с указанием файлов через аргументы командной строки
Нужно упростить код или обернуть его в кабал. import System.IO import System.Environment transpMatr :: ] -&gt; Int -&gt; ] ...

Аргументы командной строки
Здравствуйте. Подскажите пожалуйста, как в консольном приложении создать аргументы командной строки, как в примере. Пример запуска...

Аргументы командной строки
Написать программу калькулятор, которая в командной строке принимает простое арифметическое выражение и выводит результат этого...

Аргументы командной строки
На курсах столкнулся с новой для себя вещью. Преподаватель предлагает запускать файлы следующим образом: java classname &lt; filename.txt...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru