nixp.ru v3.0

16 января 2017,
понедельник,
20:25:00 MSK

DevOps с компанией «Флант»
brunchik написал 11 января 2011 года в 11:20 (1781 просмотр) Ведет себя неопределенно; открыл 5 тем в форуме, оставил 22 комментария на сайте.

Народ выручайте! Уже не могу, второй день не могу решить проблему.Скрипт должен открывать фаил на запись и сверять с веденым с клавиатуры числом.Если оно найдено то закрыть файл, а если нет то дописать в конец данное число.Скрипт я написан но он вместо желаемого результата то если в файле есть запись он дописывает или ее нету то все равно пишит.Или один раз запишит а в остальные не хочет.Помогите решить проблему.

<code class="auto ruby">#!/usr/bin/perl
$s=<>;
chomp($s);
unless (-e 'file')
{
system('touch file');
}
open(file,"+<file");
@file=<file>;
STOP: foreach $file(@file)
{
chomp($file);
if($file eq $s)
{
print "Запись найдена\n";
last STOP;
}
print "Запись ненайдена\n";
print file $s,"\n";
close file; }
close file;
print "The End\n"; <>;
Что то при вставки кода форма зависает</code>
Дмитрий Шурупов

Какой интересный код :-)

Судя по нему, действительно print file $s выполняется в любом случае. А если оно выполняется в любом случае, то чего еще вы ждете? Код-то кто писал?

И да, метка со STOP — это ужас! Она не нужна, такой «подход» только ухудшает читабельность.

Сделайте переменную-флаг, которой присваивайте значение 1, если число было найдено в файле. После просмотра всего содержимого файла проверяйте: флаг == 1 — ничего дописывать не надо, флаг == 0 — надо дописать.

brunchik

Код писал лично я.Больше некому.

Переменную-флаг я не умею делать.Подскажи как.Метка STOP нужна.А если в файле 100000 строк, а число находится в 889 строке.То зачем тогда читать остальные строки? Или эта переменная-флаг дальше найденой не читает строки? Функцию дописал в 28 строк.Пока сам себе не поможишь никто не поможит.Расскажи все же про флаги.Может я переделаю код.

Дмитрий Шурупов

Идея с флагом такая:

my $flag = 0;
foreach $string (@array) { last if ($flag); $flag = 1 if ($string eq $value); }
if ($flag) { print "Нашли!\n"; # дописываем в файл } else { print "Не нашли!\n"; }


P.S. О, сломалась вставка кода :-(

brunchik

Попробуем.Смысл тут такой:  начинается цикл с того что если $flag=1 тоцикл завершается, а если нет то $flag приравнивается к 1 и проверяется условие и начинается второй цикл.Ладно спасибо будем пробывать.А как отрывать файл на чтение c +<?

Дмитрий Шурупов

Про режимы, в которых файл открывается, можно почитать, например, тут: www.perlfect.com/articles/perlfile.shtml

В данном случае хорошо подойдет read+append.

brunchik

А может знаешь модуль для работы с js.Просто мне нужно из консоли нажать на js кнопку на сайте.Через web жмется а через консоль нет.

Дмитрий Шурупов

Про какую консоль речь? JS выполняется на стороне клиента. Тебе нужен клиент для UNIX-консоли с поддержкой JS? Для имитирования обычного нажатия на кнопку формы достаточно сформировать на основе параметров этой формы POST- или GET-запрос.

brunchik

на сайте есть кнопка js через модуль LWP нужно ее нажать.get и post там не прокатывают.

Дмитрий Шурупов

LWP не умеет JavaScript.

brunchik

Я знаю.Ну че ни как нельзя передать по HTTP о нажатии js кнопки? Может так через модуль HTTP?

Дмитрий Шурупов

Результат работы JS передается по HTTP. Но этот результат надо вычислить, выполнив JS. Это может быть и просто, и сложно — зависит от кода на JS.

brunchik

Слысл скрипта таков: при первом запуске скрипта файла нет.Его я создаю так system(’touch file’)unless (-e 'file’).; Я открываю так на запись +<.Если так >> то массив пустой.

brunchik

Посмотри код.Может я что то не так делаю? Уже не могу.Заранее приготовил файл с 10 строками разных чисел.Выбираю из них 1 и ввожу и мне пишит запись окончина.Т.е. число есть и еще раз его в конце пишит.А если открою еще то пишит найдено.В чем проблема?

#!/usr/bin/perl

chomp($s=<>);

system(’touch ip.log’) unless (-e 'l.log’);

open(ip,«+<l.log»);

@l=<l>;

$fl=0;

foreach $l(@l)

{

last if($fl);

$fl=1 if($l eq $s);

}

if($fl)

{

print «Запись найдена\n»;

close l;

}

else

{

print l «$s»;

print «Запись добавлена\n»;

close l;

}

<>;

 

Дмитрий Шурупов

system(’touch ip.log’) unless (-e 'l.log’); — опечатка в имени файла.

Далее открывается файл с хэндлером ip, а считывание идет по <l>.

И напоследок: chomp для ввода (<>) делается, а для файла (<l>) — нет.

brunchik

Спасибо.Просто забыл ее написать.В вопросе не забыл.Ладно с js потом.Как модуль ssh называется? А то telnet пароль в открытом види передает

Дмитрий Шурупов

Для этого же придумали CPAN: search.cpan.org/search?query=ssh&mode=all

brunchik

Я знаю про этот сайт.Там tz а я их устанавливать не умею.Ты не знаешь почему я когда скачиваю по LWP фаил скачивается и исчезает?

Дмитрий Шурупов

Для установки (и не только) модулей из CPAN есть удобная одноименная консольная утилита («cpan»).

Про скачивается и исчезает — видимо, что-то делается не так :-) Надо просто обратиться к документации по модулю.

brunchik

как ей пользоваться?

brunchik

я че то в консоли через ssh подключиться не могу к роутеру.расскажи как.а то я искал найти не могу.

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.