トップページ⇒php
1001コメント315KB

Perl コーディング初心者質問コーナー Part25

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/06/28 01:18ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

関連スレ
【Perl上級者コーナーPart01】
http://pc2.2ch.net/test/read.cgi/php/1024741312/
CGI: Common Gateway Interface part 11
http://pc2.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0035nobodyさん03/06/28 15:16ID:???
>>34
print "Content-Type: text/html; charset=EUC-JP\n\n";
print "Content-Type: text/html; charset=Shift_JIS\n\n";
まで出るようになってる。
「kontaiei」の方がはるかに早い。
0036nobodyさん03/06/28 15:18ID:???
>>35
なるほど。
まぁ、僕は、自分用のゴチャゴチャしたモジュールんなかにcontentってサブルーチン作ってるからそれでいいんだけど。
いちいち日本語に切り替えるのが面倒そう?そうでもない?
0037nobodyさん03/06/28 15:19ID:???
確かに早いと思うけど、違う環境になると
正確に入力できなそうで困らないかな。
0038nobodyさん03/06/28 15:20ID:???
>>36
そうでもない。慣れかも。一時的な短いスクリプトをさっと書きたい時とか
いちいちモジュール呼ばないので。
まぁこの辺は好き好きだと思うけど。
0039nobodyさん03/06/28 16:40ID:???
>>33
ワラタ
俺も使わせてもらうわ。
0040nobodyさん03/06/28 16:47ID:???
>>39
あと、

my($sec, $min, $hou, $day, $mon, $yea, $wek) = localtime();

なんかも入れておくと便利。
0041nobodyさん03/06/28 16:53ID:???
#!/usr/bin/perl = いつもの
0042nobodyさん03/06/28 17:07ID:???
>>41
絶対普通に書いたほうが早い
0043あぼーんNGNG
あぼーん
0044nobodyさん03/06/28 17:27ID:???
>>41
そんなもんファイルを新規作成した時点で自動的に書かれる。
0045nobodyさん03/06/28 17:53ID:???
CGI.pm をやたら use したがるヤシは基礎的なコーディングできないから楽したいだけでは?
0046nobodyさん03/06/28 18:00ID:???
>>45
「基礎的なコーディングできない」と「楽したい」につながりがありませんよ。
できる人ほど楽をするための努力をするものです。
0047nobodyさん03/06/28 18:06ID:???
>>40
my @dates = localtime();
にしる!
0048あぼーんNGNG
あぼーん
00493303/06/28 19:40ID:???
>>41
俺もソレは登録してない。
>>44
さすが。
>>47
コードが読みにくいからやだ(好みの問題)。なんかよく間違うし。
00502503/06/28 19:47ID:???
HTMLべたがきすんのやだよー。
タグの閉じ忘れとかやだよー。
ファイルアップロード含む入力の取得でガチャガチャすんのやだよー。
要するに基本的な部分であれこれ悩むのやだよー。
アルゴリズムに労力割きたいよー。
開発時間短いよー。

……まあ、そんな感じでつ。
0051nobodyさん03/06/29 00:51ID:x7Ccxqe1
perl でpop3のメールを受信するにはどのようなコードを
書けばいいのですか?

添付付きのメールの受信システムを作りたいのですが、ネットで探しても
なかなか情報が無かったためよろしくお願いします
0052nobodyさん03/06/29 00:57ID:???
>>51
自分で調べれ。調べればある。
0053nobodyさん03/06/29 01:21ID:WiALlB7N
>>51
1からちゃんとやりたいのであれば、
http://www.kt.rim.or.jp/~kbk/perl5.005/perlipc.html#Internet_TCP_Clients_and_Servers
これと、
http://www.ietf.org/rfc/rfc1939.txt
これ。あとは頑張れ。
0054あぼーんNGNG
あぼーん
0055nobodyさん03/06/29 01:55ID:15+Vm9kH
前スレでも質問しましたが、1000行ってしまったようなのでもう一度。

unicodeの文字列をURLエンコードするにはどうすればいいのでしょうか?
JavaScriptのescapeのように、あいうえお->%u3042%u3044%u3046%u3048%u304A
といった感じで変換したいのです。
$value =~ s/(\W)/'%' . unpack 'H2' , $1/eg;
とやっただけではムリでした。

どのようすればいいのでしょうか?
0056nobodyさん03/06/29 02:19ID:???
>>55
$value =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
0057nobodyさん03/06/29 02:22ID:???
>>55
Jcode.pmを使えば?
0058nobodyさん03/06/29 03:58ID:???
>>55
$value =~ s/(\W)/'%' . unpack 'H2' , $1/eg; が
何をしているか理解できていれば分かりそうなもんだが。
正規表現と pack/unpack について、もうちっと勉強すれ。

$value =~ s/(..)/'%u' . unpack 'H4' , $1/eg;
0059nobodyさん03/06/29 08:56ID:???
open(FILE, "hoge.txt");

while(<FILE>) {
(置換とか)
}

open(WRITE, ">test.txt");
print WRITE <FILE>;

とやったのですがtest.txtにhoge.txtを処理した内容が書き込まれません。
何処が間違っているのでしょうか…。

Win2K、Apache1.3.27、ActivePerl5.6を使用。

0060nobodyさん03/06/29 09:09ID:???
use *****

で、***** が使えるかどうか評価する関数ってありますか?
0061nobodyさん03/06/29 09:18ID:???
>>59
open(FILE, "hoge.txt");

while(<FILE>) {
(置換とか)
push @new, $_; # ここ追加
}

open(WRITE, ">test.txt");
print WRITE @new; # ここ変更

こうだろ?
0062nobodyさん03/06/29 09:21ID:???
>>60
専用の関数はない。
@INCの中に、use(とrequire)がモジュールを探してくるディレクトリが入ってる。
それをreaddirとかで開いて使いたいモジュールがあるかどうかさがしなされ。
0063nobodyさん03/06/29 10:14ID:???
>>59
hoge.txt 全てをオンメモリにしたくなければこう。

open IN, '<' . 'hoge.txt' or error();
open OUT, '>' . 'test.txt' or error();

while (<IN>) {
 ...
 print OUT $_;
}

>>60
use Foo @arg; は
BEGIN { require Foo; Foo->import(@arg) } と等価。

BEGIN {
 eval { require Foo } or error();
 Foo->import(@arg);
}
0064nobodyさん03/06/29 10:20ID:???
>>62
むぅ…eval じゃ駄目っすかね?
0065nobodyさん03/06/29 10:27ID:WiALlB7N
>>60について
>>62
そ、それは面倒くさすぎないか・・・?いつもそうやってんの?

eval("use MODULE");
error("Can't locale MODULE") if $@;

my $ins = new MODULE(xx,yy,zz);

これで済むじゃん。
0066nobodyさん03/06/29 10:27ID:???
>>64
あ、ケコーン
0067nobodyさん03/06/29 10:32ID:???
>61,63
ありがとうございます。
今回は61さんの方法でやって上手く行きました。
006860 = 6203/06/29 11:58ID:???
レスありが�d
>>62 さんの方法は「実行しないで」確認する方法として関数化して使う事にしました
0069nobodyさん03/06/29 13:34ID:???
そしたらさア
0070nobodyさん03/06/29 14:04ID:???
>>69
ナンダッテ━━━━ヽ('A`)ノ ( ;゜Å゜)n‘∀‘)η´Д`)゚∀゚)=3━━━━
0071nobodyさん03/06/29 14:44ID:???
厨な質問で申し訳ないですが、PerlはSMAPで言うと誰ですか?
0072nobodyさん03/06/29 14:45ID:???
>>65
>>68の言うとおりです。
あらかじめこれで実行環境を確認してからスクリプト組むようにしてます。
0073nobodyさん03/06/29 21:22ID:???
evalは少しだけ遅いような気がするから、::を/に直してrequireして戻り値を調べるっていうのはどう?
0074nobodyさん03/06/29 21:34ID:15+Vm9kH
入力された日付をtime形式にして変換するようなライブラリかモジュールはありませんか?
&function($year,$mon,$day,$hour,$sec,$min);
とすると1056889951がリターンされてくるような。
0075nobodyさん03/06/29 21:36ID:???
timelocal
0076nobodyさん03/06/29 21:36ID:oIT5F8Qq
>>74
POSIX::mktime()
ちなみに標準ライブラリ
00775503/06/29 21:37ID:???
ごめんなさい。途中で送信してしまいました。
>>56-58のみなさん
 ありがとうございます。
 解決しました。

 UNICODEは%uに(4桁の16進数)が組み合わさるので、
 Hで16進数、4で4桁ということでいいんですよね…?
007855=7403/06/29 21:39ID:???
って書き込んでる間に返答着きてますね。ありがとうございます。
>>75-76のお二人
 ありがとうございました。
 標準ライブラリももっと勉強した方がよさそうです(汗)。
0079nobodyさん03/06/29 21:46ID:???
>>74
Time::Localも
0080あぼーんNGNG
あぼーん
008111903/06/29 22:52ID:tnHKF+kR
POSTされるデータは$HTTP_POST_VARSにあると思いますが、
これをそのままフォームのボタンを押すことで同一のページに返したいのですが、
いちいち<input type="hidden" name="test" value="test">などとしないといけない
のでしょうか。
0082nobodyさん03/06/30 00:13ID:???
JavaScript使えばいいんでない
0083nobodyさん03/06/30 00:19ID:???
誤爆のような気もする
0084nobodyさん03/06/30 01:01ID:???
すんません、コーディングって何ですか?
ググっても分かんないッス・・
0085nobodyさん03/06/30 01:34ID:???
表面塗装のこと
0086nobodyさん03/06/30 01:58ID:???
「コーディング 用語」でぐぐれ
0087nobodyさん03/06/30 02:01ID:???
そりゃ、コーテ…(ry

>>84

coding

 アルゴリズムや処理をコンピュータプログラムとして具現化すること。
または単にプログラムを作成すること。
0088nobodyさん03/06/30 02:32ID:???
おっ、さっそく新スレタイの効果が出てきてるようだね
0089nobodyさん03/06/30 03:30ID:???
コーディングという単語を世に広めるスレはここですか?
0090nobodyさん03/06/30 03:35ID:???
その単語を知らない人が来る板じゃないですよ〜♥
0091nobodyさん03/06/30 03:48ID:???
>>90
いや全くその通り。
ぐぐるとか、辞書引くとかできない人間未満がきちゃいかんよ。
0092座敷荒氏03/06/30 06:49ID:???
前スレでも大変お世話になりました。
あのあと自分なりに勉強し、パラメータファイルを使用して
ファイル確認することができるように下のように書き換えました。
こちらはうまく動作しています。



#! /usr/bin/perl
while (<>){
($cmd_para) = split;
unless(-e $cmd_para){
exit(100);
}
}
exit(0);

そこで次にファイル削除を作成しようとおもい、
上記の箇所unlessをunlinkに書き換えたところ
シンタックスエラーが発生してしまいます。
どう修正すればいいのでしょうか。

よろしくお願い致します。
0093nobodyさん03/06/30 07:04ID:???
>>92
なんか基本がなってないような……
unlessは制御構造。unlinkは関数。名前は似てても、使い方は全く違うものだよ。
前スレ読めないんで、どうやりたいのかもうちょっと具体的に説明して。

それから今回はいいけど、エラーはできるだけ原文をそのまま書いてね。
カタカナで書くと、読み方を間違えていたり、肝心なところ(大抵読み方が分からない単語)を省略してたりして
意味が正しく伝わらないことがあるから。
0094nobodyさん03/06/30 08:15ID:???
returnやgotoなどは制御構文かと思いきや関数なのね。
0095nobodyさん03/06/30 08:45ID:???
真か偽かを返すのが制御子、それ以外の価を返すのが関数と言っては
いけないの?
0096座敷荒氏03/06/30 10:20ID:???
>>93
92に記載したのは確認したいファイルのフルパスを記載した
パラメータファイルを用意し、そのファイル名を指定して実行すると
ファイルがある場合には0を返して終了し、ない場合には100を返して終了する、
というプログラムです。

これと同じように、削除したいファイルのフルパスを記載した
パラメータファイルを用紙し、そのファイル名を指定して実行したときに
ファイルが削除できた場合には0を返して、ない場合には100を返して終了する、
というように動作するものを作りたいと思います。

92に記載したようにunlessをunlinkに書き換えただけで実行すると
syntax error at ./test line 4, near "){"
syntax error at ./test line 5, near "}}"
Execution of ./test aborted due to compilation errors.
と表示されてしまいます。

0097nobodyさん03/06/30 10:31ID:???
unless( unlink($cmd_para) ){
0098nobodyさん03/06/30 10:45ID:???
>>95
neが制御子でcmpは関数?
009954303/06/30 15:38ID:???
>>97
お教え頂いたように修正しましたが
bash: ./Perltest: bad interpreter: Permission denied
と表示されてしまい、うまく動作しません。
使用したPerlファイル・パラメータファイル・削除対象ファイルの
パーミッションは設定済みです。

0100nobodyさん03/06/30 16:03ID:???
100get (・∀・)
0101nobodyさん03/06/30 16:05ID:???
perlで外部ファイルのサイズを取得したいのですが、
Content-Lengthが付いて無いファイルのサイズを取得する手段は無いものでしょうか。
0102nobodyさん03/06/30 16:23ID:???
>>101
Content-Lengthって何?Perlにそんなの無いよ。
010310103/06/30 16:30ID:???
>>102
すいません、ありがとうございました。
0104nobodyさん03/06/30 16:35ID:???
どこで実装されてるかくらい意識して欲しいね。
おそらくHTTPヘッダのことを言ってるんだろうけど。
0105nobodyさん03/07/01 09:06ID:???
どうしたんだ、発言止まっちゃってる。
0106nobodyさん03/07/01 12:57ID:???
Perlやろうぜ!
0107nobodyさん03/07/01 13:18ID:???
実現したいこと
ADSLモデムにアクセス(192.168.1.1)して
Pingを発行しネットワーク接続監視を行う
接続されているのならば接続中の文を表示し
切断されているのならば警告文とアラーム音を鳴らし
知らせる。
最終的には24時間連続稼動させたい。


ソース
use Net::Ping;
$host = "192.168.1.1";
if (pingecho($host, 10)) {
print "$host is alive.\n";
}else{
print "$host is dead.\a;\n";
}

エラー
The Unsupported function alarm function is unimplemented at c:perl/lib/net/Ping.pm line 308

エラーの意味がわかりません、よろしくお願いします。
010810703/07/01 13:21ID:???
あと
Perlでbeep音を鳴らそうと
\aでアラーム音のエスケープシーケンスを使用しましたが
音が鳴りませんでした。
音を鳴らす方法が間違ってるでしょうか?
0109nobodyさん03/07/01 13:56ID:???
ふぅ…。ヤレヤレ
0110nobodyさん03/07/01 14:07ID:???
>>107
環境くらい書けよ。

意味がわからなかったら調べろよ。
http://www.google.com/search?num=100&hl=ja&lr=lang_ja&ie=UTF-8&inlang=ja&c2coff=1&safe=off&filter=0&q=%54%68%65%20%55%6E%73%75%70%70%6F%72%74%65%64%20%66%75%6E%63%74%69%6F%6E%20%61%6C%61%72%6D%20%66%75%6E%63%74%69%6F
%6E%20%69%73%20%75%6E%69%6D%70%6C%65%6D%65%6E%74%65%64%20%61%74%20%63%3A%70%65%72%6C%2F%6C%69%62%2F%6E%65%74%2F%50%69%6E%67%2E%70%6D%20%6C%69%6E%65%20%33%30%38%20
(行長すぎって言われたから途中ぶった切り。)

英語がわからなかったら調べろよ。
http://www.excite.co.jp/world/text/?wb_lp=ENJA&before=The%20Unsupported%20function%20alarm%20function%20is%20unimplemented%20at%20c:perl/lib/net/Ping.pm%20line%20308%20
0111nobodyさん03/07/01 14:36ID:???
\aで思い出したけど、
ActivePerlで、\aで鳴る音をユーザ定義できない?
0112nobodyさん03/07/01 15:13ID:???
\x07
0113nobodyさん03/07/01 15:36ID:???
implementの方法はどうやればいいのでしょうか?

環境
ActivePerl v5.8.0.806 + Perlを始めよう! v.2.0.4.5
0114nobodyさん03/07/01 15:52ID:???
あんたの使ってるプラットフォームじゃ alarm はインプリメントされてない
windows なんて厨房の使う os 知らんから、あとはヨロ
 ↓
0115nobodyさん03/07/01 16:31ID:???
まあ、\aを使う代わりに、何か音が鳴るようなのを
systemで呼べばいいだけの話か
0116nobodyさん03/07/01 16:42ID:hz3sfxOd
Prel初心者です。
WEB上のFROMから入力された文字や数字は、さまざまなコードで入力されるため
jcode.pl 等を使いコード変換する必要性は理解できます。
しかし、自分が作成したHTMLから自分が作成したCGIをパラメータ付きで呼び出すとき
CGI側はその受け取ったデータをコード変換する必要はあるのでしょうか?
例えは、index.html 内に <a href="http://aaa.com/test.cgi?id=123&name=abc">
があり、これをクリックした場合、test.cgi で受け取る id=123&name=abc は
変換する必要があるか、という事です。
よろしくお願いします。
0117nobodyさん03/07/01 16:55ID:???
>>116

from?

from?

from?


答え:必要ある時もあるし無い時もあるのでやっておいた方がいい
0118nobodyさん03/07/01 17:17ID:???
>>116
FROMはFORMのことでしょうが
IEやNetscapeブラウザではurlエンコードして送りますから普通はurlデコードしますね。
英数文字だけだったら問題ないけど一応やっとけ。
0119nobodyさん03/07/01 17:51ID:9B8Cvuqq
>>107
そんなものぐらいbatで書けよ・・・
0120座敷荒氏03/07/01 17:54ID:???
何度も申し訳ありません。

別にパラメータファイルを用意し
そのパラメータファイルにフルパスで書かれたファイルを
削除するPerlを作っているのですが、97さんに教わったとおりに
書き換えて下記のようにして実行したところ
エラーが発生してしまいます。

#! /home/perl/test
while (<>){
($cmd_para) = split;
unless(unlink($cmd_para)){
exit(100);
}
}
exit(0);

↓実行したものとエラー内容
$ ./Perl名 パラメータファイル名
bash: ./Perltest: bad interpreter: Permission denied

お力添えのほど、宜しくお願い致します。
0121nobodyさん03/07/01 18:04ID:???
>#! /home/perl/test
関係ないが、珍しいものを見た
0122あぼーんNGNG
あぼーん
0123座敷荒氏03/07/01 18:08ID:???
>>121
そのへんは書き直してますよ。
0124nobodyさん03/07/01 18:09ID:F5KDEjxA
>>120
#!の行がおかしいってエラーが出てるぞ。
0125nobodyさん03/07/01 18:09ID:???
>>120
何でもかんでも一度に書くな。

#! /home/perl/test
print "hello, world\n";

からやり直せ
0126あぼーんNGNG
あぼーん
0127nobodyさん03/07/01 18:25ID:ycS3U73c
ヒントはstdin
0128座敷荒氏03/07/01 18:27ID:???
>>124
あ、できました。
どうもありがとうございます。
原因は本番環境から自前の環境に持ち込んだときに
書き換えたミスです。削除対処ファイルへのパスを記入していました。

124さん、他に助言してくださったみなさん、
本当にありがとうございました。

>>125
はい、仕事で作る事になったので
順番に勉強する暇がありませんでした。
これからもう一度勉強をしますので
宜しくお願い致します。

0129nobodyさん03/07/01 19:43ID:hz3sfxOd
FORM間違いの116です^^;
CGIに送るのは数字だけなのですが、
念のために変換かませておきます。
ありがとうございました。
0130nobodyさん03/07/01 19:58ID:???
数字は変換しても数字だから、いじらなくてもいいのでは。
0-9a-zA-Z以外のものが入るのなら、変換しとけ。
0131nobodyさん03/07/01 21:02ID:soOdqVTP
>>107
pingはネットワークに負荷かけるぞ。
普通にsocket作ってbindしてconnectして失敗したらエラーでいいだろ。

モジュール使ったら3行くらいで作れそうな気がするが。
(使わなくても10行くらい)
0132nobodyさん03/07/01 21:03ID:???
bindするの??
0133nobodyさん03/07/01 21:31ID:???
し・ば・る!!
0134コミュカレ03/07/01 21:41ID:aHlU6obt
オープンソースです

一部の限られた組織等でしか利用されていなかったグループウェアを、
一般ユーザーも利用できるインターネット上のパーソナルグループウェアへ
「コミュカレ」はフリーソフトです。
ゴミの収集日等、地域の皆様どおしでも使えます。使い方はユーザー次第!!!
いろんな活用の仕方が考えられます。
その便利さを是非お試しになってみて下さい。
http://www.ecopig.jp/comucale/index.htm
0135nobodyさん03/07/01 22:05ID:???
>>131
相手に嫌がらせするのが目的なんじゃない?
成功したらアラームがピッ!ってね
■ このスレッドは過去ログ倉庫に格納されています