痔になりやすい生活習慣とは?

ある装置にtelnet接続し、コマンド(ccc dd ee)を送信して帰ってきた値を
outou.dat というファイルに保存するプログラムを作っています。

接続すると

login:

と表示されるので「aaaa」と入力すると

Welcome to aaaa
>

と表示され、「bbbb」と入力するとプロンプトが「#」に変わります。

>bbbb
#

そこでコマンド「ccc dd ee」を入力したときに帰ってくる応答をファイルに保存します。

#ccc dd ee
------応答データ--------


これを行うのに下記プログラムを実行しましたが、エラーは出ませんがファイルに何も
保存されませんでした。
何がいけないのかわかる方教えてください。


use strict;
use Net::Telnet;

my $host = '192.168.1.1';
my $login = 'aaaa';
my $enable = 'bbbb';
my $prompt1 = '/>/';
my $prompt2 = '/\S/';

my $telnet = new Net::Telnet(
Timeout => 10,
);

$telnet->open($host);

$telnet->waitfor('/login:/i');
$telnet->print($login);

$telnet->waitfor($prompt1);
$telnet->print($enable);

$telnet->waitfor($prompt2);

my @result;
$telnet->print("ccc dd ee");
($result) = $telnet->waitfor($prompt2);

open(OUT, "> outou.dat");
print(OUT "@result\n");
close(OUT);

$telnet->close;

A 回答 (1件)

> エラーは出ませんが


本当ですか?

> ($result) = $telnet->waitfor($prompt2);
で使われている $result は宣言されていないようですが。
@resultと$resultは別の変数です。

$resultに取り込んだものを
>print(OUT "@result\n");
と@resultで出力することはできません。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
$resurtと使う場合と@resurtを使う場合の両方を考えていたため、
ここに書くテストプログラムにはごっちゃに書いてしまってました。
実際のプログラムは$resurtで統一されているのでエラーは出ませんでした。

いろいろ試した結果、コマンドの応答が複数ページに渡っていたため、
「何かキーを押してください」のメッセージで止まり、プロンプトが
戻らなかったためタイムアウトになっていました。

お礼日時:2010/02/11 05:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QNet::Telnetでタイムアウト時間が短い

タイムアウト時間を確認するのに、以下のプログラムを実行したのですが、存在しないホストを指定してプログラムを実行しても3秒程度でタイムアウトしてしまいます。指定したタイムアウト時間(以下のプログラムでは100秒)待つにはどうすればよろしいでしょうか?

お願いします

OS:CentOS 5.1
perl: 5.8.8
Net-Telnet-3.03

===== プログラム =====

#!/usr/bin/perl

use Net::Telnet ();

my $result;
my $h = 'aa.bb.cc.dd';
my $u = 'my_name';
my $pass = 'my_pass';
my $p = '/[\$%#>] $/';

my $t = new Net::Telnet (Timeout => 100, Prompt => $p,
Errmode => "return");

$result = $t->open($h);

unless($result) {
print "open ng\n";
exit;
} else {
print "open ok\n";
$t->login($u, $pass);
print "login ok\n";
$t->print("exit");
}

タイムアウト時間を確認するのに、以下のプログラムを実行したのですが、存在しないホストを指定してプログラムを実行しても3秒程度でタイムアウトしてしまいます。指定したタイムアウト時間(以下のプログラムでは100秒)待つにはどうすればよろしいでしょうか?

お願いします

OS:CentOS 5.1
perl: 5.8.8
Net-Telnet-3.03

===== プログラム =====

#!/usr/bin/perl

use Net::Telnet ();

my $result;
my $h = 'aa.bb.cc.dd';
my $u = 'my_name';
my $pass = 'my_pass';
my $p = '/[\$%#>...続きを読む

Aベストアンサー

接続先のホストが存在しない(icmp destination unreachable)という
応答が返ってきて、終了しているということはありませんか。

存在するが、ファイアウォール等で telnet ポート(port 23)への
接続をドロップしているようなホストを指定するとどうなりますか。

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

QNet::Telnetモジュールをインストールしたいのですが、どうやればよいのかわかりません。

perlにNet::Telnetモジュールをインストールしたいのです。
私自身調査したのですが、linuxでのやりかたしか載っていなかったので、どうしたらよいのかわかりません。
というかそもそもwindowsで組み込むことができるのでしょうか。
windows上でインストールしたいのですがどうすればよいのでしょうか?

perl初心者なのでよくわからない質問をしているかもしれませんが、何卒、初心者の私にでもわかるように説明していただけると非常に嬉しいです。
よろしくお願い致します。

Aベストアンサー

×× files installed
のようなメッセージが出なかったのなら、インストールは完了していません。

1: Net-Telnet
Interact with TELNET port or other TCP ports
Version: 3.03

2: Net-Telnet-Cisco
automate Cisco management
Version: 1.10

3: Net-Telnet-Netscreen
interact with a Netscreen firewall
Version: 1.01

4: Net-Telnet-Options
Telnet options over any socket
Version: 0.01

5: Netscreen
interact with a Netscreen firewall
Version: 1.1

こんな感じに似たような名前のものが列挙された状態なら、
名前の指定があいまいなのでどれをインストールしてよいか判断できずに
条件にあったものの情報を出しただけです。

cmd.exeのコマンドプロンプトに戻ってきているのなら、
続けて
ppm install 1
(リストの最初が目当てのモジュールの場合)
とすればインストール作業をしてくれます。


>ppm install 1
Downloading Net-Telnet-3.03...done
Unpacking Net-Telnet-3.03...done
Generating HTML for Net-Telnet-3.03...done
Installing to site area...done
2 files installed


> ちなみにファイル検索したところC:\perl\site\libeにpmファイルで表示
> されるのですが、なんだかよくわからないことになりました↓
> すいません。初心者なので補足もそのままのことを書いてしまいました。

で、これは何がおきたというのでしょうか?

×× files installed
のようなメッセージが出なかったのなら、インストールは完了していません。

1: Net-Telnet
Interact with TELNET port or other TCP ports
Version: 3.03

2: Net-Telnet-Cisco
automate Cisco management
Version: 1.10

3: Net-Telnet-Netscreen
interact with a Netscreen firewall
Version: 1.01

4: Net-Telnet-Options
Telnet options over any socket
Version: 0.01

5: Netscreen
interact with a Netscreen firewall
Version: 1...続きを読む

QPerlの変数に文字数制限(容量制限)はあるか

Perlの変数に文字数制限(容量制限)はあるか

Perlで書いた自作の掲示板なのですが、ずっと普通に動いていたのですが
急にデータが欠けてしまいました。書き込みデータはテキスト形式で、
↓の様な形で保存しています。

<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n

1つの書き込みは1行に収まっていて、書き込み時に \n を付けて保存して、
読み込み時は配列に読み込んで、べろっと出すだけの処理です。
掲示板書き込みなので unshift で上が新しい書き込みにしてあります。
通常のタグ禁止処理や、改行コード処理はしてあります。Perl5.6.1です。

数日前、容量が減っていることに気付き、調べてみると、

<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き

のような形でデータが欠けていました。欠けていると言っても9割方消えていました。
残っていたのは新しい側の書き込みです。
いつ消えたのか、何をした時に消えたのかが不明のため、原因を探っている段階です。

もちろん、一番怪しいのはプログラムのミスなのですが、それも調べつつ、
ちょっと前から気になっていた点として、データ容量が1.5MBぐらいまで
ふくらんでいて重くなっていたんです。
data.dat のような1ファイルにテキストばかり1.5MB、そして内部の処理でも
普通にその容量を一つの変数に入れたりしています。
データが唐突にぶつっと切れていることと、容量が多くて気になっていたこと、
この辺りでちょっと怪しいのですが、変数の容量制限、ファイルの容量制限が
調べても出てきません。知っている方いましたら教えてください。

他にも、そういうバグの時こういうミスがあったよ、など、ありましたら
アドバイスをお願いします。
自分が作った物のデバッグで恐縮なのですが、よろしくお願いします。

Perlの変数に文字数制限(容量制限)はあるか

Perlで書いた自作の掲示板なのですが、ずっと普通に動いていたのですが
急にデータが欠けてしまいました。書き込みデータはテキスト形式で、
↓の様な形で保存しています。

<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n

1つの書き込みは1行に収まっていて、書き込み時に \n を付けて保存して、
読み込み時は配列に読み込んで、...続きを読む

Aベストアンサー

No.3&6です。

> flock してません・・・・・・。
> つまり、読み込み時に競合があって書き込まれたため、開いたままのデータが
> 変なところで書き込み処理に割り込まれて、おかしくなったということでしょうか。
> でしょうか、というか、その可能性があった、というところですかね?

ちょっと説明が足りなかったので補足します。

読み込み時にflock()しなかった場合ですが、書き込みが純粋に追記だけの場合は(記事表示で途中で切れることはあるかもしれませんが)データファイルの破損までは至らないかなと思います。もちろん、読み込み内容が壊れるには違いないですので、読み込みルーチンにもflock()は追加すべきです。

データファイルが壊れるケースですが、既存記事の修正機能が実装されている場合などで、読み込みルーチンで取得した@BbsDataの値を使った書き込みルーチンが別にあった場合には、たとえその書き込みでファイルロックがされていたとしてもデータファイルが壊れることになります。

もっともその場合、データ変更に関する一連のロジック自体を見直す必要があるかもしれません。
既存記事の変更を行う場合には、「一度のファイルオープン+ファイルロックの間に、読み書きを全て済ませる」という処理に置き換えないと、ほぼ同時に複数の書き込みが発生した場合に一部のデータが失われるという別の不具合が発生する恐れがあります。ご参考まで。

No.3&6です。

> flock してません・・・・・・。
> つまり、読み込み時に競合があって書き込まれたため、開いたままのデータが
> 変なところで書き込み処理に割り込まれて、おかしくなったということでしょうか。
> でしょうか、というか、その可能性があった、というところですかね?

ちょっと説明が足りなかったので補足します。

読み込み時にflock()しなかった場合ですが、書き込みが純粋に追記だけの場合は(記事表示で途中で切れることはあるかもしれませんが)データファイルの破損までは至らないかなと...続きを読む

Qひとつの命令を複数行に記述

検索してもあまり解説見かけないなぁと思うのですが、(どこが本家かわからないのでとりあえず放置)

VBでいう_に該当するものは何ですか?
ソースが長くなって見にくくなっているので、対処したいのですが。

hoge = "じゅげむじゅげむごごうのすりきれ" _ '←次の行に送る
& "かいじゃりすいぎょのうんらいまつふうらいまつすいぎょうまつ" 

Aベストアンサー

Perlは、VBと異なり行の概念がありません。
VBではステートメント区切り子が存在しないため、改行がステートメントの区切りとして扱われ、例外的につなげるときに「_」を使うわけですが、
Perlの場合はステートメント区切り子セミコロン「;」がステートメントの区切りになっていますので、セミコロンを打たない限り、何行に分かれてもひとつのステートメントとして扱われます。
したがって、回答としては「そのまま改行してOK」です。
上記の例なら、

$hoge = "じゅげむじゅげむごごうのすりきれ" .
"かいじゃりすいぎょのうんらいまつふうらいまつすいぎょうまつ";

という感じです。
当然ながら、文字列中での改行はダメなので、上記のようにいったん「"」を閉じて、文字列結合演算子「.」で接続することに成ります。

Qfetchrow_arrayとfetchrow_hashrefの使い方

Jやまとです。
PerlからSELECT文を実行して結果の行の値を取得する単純なスクリプトを作成しています。
(1)fetchrow_array使用
(2)fetchrow_hashref使用
以上2通りの方法で試したのですが、(2)がInternal Server Errorになります。
原因が全く分かりません。
分かる方いらしゃいましたら、ご教授願います。
OS:TurboLinux6.2
DB:Oracle8i
Apache,PerlはTurboLinux6.2に入っているものをそのまま使用
以下、ソースを記載します。
---------------
(1)fetchrow_arrayを使用して行の値を取得(こっちは動く)
$dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr);
$sql = "SELECT SYSDATE FROM DUAL \n";
$sth = $dbh->prepare( $sql );
$sth->execute or die "Cannot execute. " . $sth->errstr();
$cnt1 =1;
while (@row = $sth->fetchrow_array()) {
@{$get_date[$cnt1]} = @row;
$cnt1++;
}
---------------
(2)fetchrow_hashrefを使用して行の値を取得(こっちが動かない)
$dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr);
$query = qq{
SELECT SYSDATE FROM DUAL
};
$sth = dbh->prepare($query);
$sth->execute(); # 実行
if($sth->rows() != 1){ # 該当する行数
# エラー処理
}
$rhash = $sth->fetchrow_hashref();
%hash = {%{$rhash}};
$sth->finish();
$get_date = $hash{SYSDATE};
---------------
(2)実行時のerror_log
Can't locate object method "prepare" via package "dbh" at /u01/ora1/www/htdocs/hoge.cgi line 30.
Premature end of script headers: /u01/ora1/www/htdocs/hoge.cgi
---------------
(本文長くてすみません)

Jやまとです。
PerlからSELECT文を実行して結果の行の値を取得する単純なスクリプトを作成しています。
(1)fetchrow_array使用
(2)fetchrow_hashref使用
以上2通りの方法で試したのですが、(2)がInternal Server Errorになります。
原因が全く分かりません。
分かる方いらしゃいましたら、ご教授願います。
OS:TurboLinux6.2
DB:Oracle8i
Apache,PerlはTurboLinux6.2に入っているものをそのまま使用
以下、ソースを記載します。
---------------
(1)fetchrow_arrayを使用して行の値を取得(こっちは...続きを読む

Aベストアンサー

rowsメソッドと同じく、executeが正しく処理レコード数を返すのは、非select文を実行した場合のみです。
select文の場合、rowsもexecuteも0行と認識するDBDが多いです。
で、これはselect文に限らずですが、処理レコード数が0の場合は、0自体ではなく「0E0」を返します。
これは、0を返すと、実行エラー時の戻り値undefと同様、
if ($sth->execute) {} で失敗したのと同じことになってしまうためです。
select文の行数は、fetchしながら行数をカウントするか、取り込んだ、配列、ハッシュの数をカウントするのが一般的な方法ですね。fetchする前に取得する方法はわかりません。

Qフラグをたてる、、の意味を教えてください。

こんにちわ。perl勉強中の初心者です。
人が書いたプログラムをみて勉強していると
たまに$flag=1とか$flag=1とかでてきます。(1と0しかみたことないです。)

この$flag=1とかっていうのは、どんな動きをしているのですか?意味がぜんぜんわからなくて困っています。簡単な具体例でも書いていただいて説明していただければ非常にありがたいのですが。。

ずうずうしくてすいません。具体例がなくてもいいので説明だけでも教えてください。ネットで調べてもよくわかりませんでした・・・

Aベストアンサー

「フラグを立てる」ということは、要は目印をつけて置く、という感じで捕らえていいと思います。
語源はアセンブラ言語だったと思いますが、ここでは触れません。

$flag = 1;
という式自体はflagという(任意の)変数に1を代入する、ということだけです。これに意味があるかないかは、この式以降、この変数を参照しているかどうかです。参考にしているプログラムで、変数flagを参照している箇所がありませんか?

if( $flag == 0 ){
}else{
}
のような箇所です(Perlではいろいろな書き方ができるので、ほんの1例ですが)。

なぜ、このようなことをするか。
幾つか自分なりに考えて、以下のようなことでは、と思っています(また、自分が作成するときも意識しています)
・長い計算式は、長いなりに処理時間がかかるので、結果だけを保持しておいて、以降、これを参照すれば、処理時間が短くなる。
 今のマシンはハイスペックなので、さほど気にすることも無いですが、式が長いほど、括弧(優先順位)が多いほど、処理が重くなるというものです。結果をフラグに保持しておけば、長い計算式をその度に処理させなくても済みます。

・そもそも、そんな長い式をいちいち書きたくないので、代用するだけのこと。
 コピーアンドペーストを繰り返してもいいのですが、ソースも汚くなりますし、修正のとき、全部を書き換えなければいけません。フラグに結果を保持しておけば、結果を作る式を書き換えるだけで済みます。

・デバッグ、修正がしやすい
 上でも書きましたが、修正漏れを防ぐことが出来ます。

まあ、こんな感じでしょうか?
因みに、代入値は0か1である必要はありません。
たまたま、今まで見ていたプログラムで、
変数名が flag だった
代入値が 0か1 だった
だけです。

今では、「フラグ」とは言っても、「変数」に変わりないかと思います。
(これを追求すれば、結局アセンブラの話になるので)

うーん。短く書こうと思ったけど、結局長くなってしまいました。すいません。

「フラグを立てる」ということは、要は目印をつけて置く、という感じで捕らえていいと思います。
語源はアセンブラ言語だったと思いますが、ここでは触れません。

$flag = 1;
という式自体はflagという(任意の)変数に1を代入する、ということだけです。これに意味があるかないかは、この式以降、この変数を参照しているかどうかです。参考にしているプログラムで、変数flagを参照している箇所がありませんか?

if( $flag == 0 ){
}else{
}
のような箇所です(Perlではいろいろな書き方ができるので、...続きを読む

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

よろしくお願い致します。

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html


人気Q&Aランキング