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

【Perl】初心者コーナーPart10

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。02/02/24 22:18ID:zOj6Yq/3
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。

参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/

過去ログ、その他の役立ち情報は>>2-10を見よう。
0080名無し02/02/28 18:17ID:SOksZdMX
>>79
マジレス希望。
0081名無しさん@お腹いっぱい。02/02/28 18:18ID:???
>>80
マジレスじゃん。
0082名無し02/02/28 18:28ID:SOksZdMX
・・・。
掲示板作りたいので
内容をログファイルに書き込む
ルーチン教えてください。
0083名無しさん@お腹いっぱい。02/02/28 18:34ID:???
ファイルを書き込みモードで開く
ファイルにログを書き込む
ファイルを閉じる
0084名無しさん@お腹いっぱい。02/02/28 18:37ID:???
>>82
BBS Re-Designっていい本が出てる、読む。買って。
0085名無し02/02/28 20:26ID:SOksZdMX
>>84
買えるほど金無いです。
0086名無しさん@お腹いっぱい。02/02/28 20:28ID:???
本読まない奴プログラマとして大成しない。
0087名無しさん@お腹いっぱい。02/02/28 20:28ID:???
>>85
で、>>83じゃだめなの?
0088名無しさん@お腹いっぱい。02/02/28 20:30ID:???
>>87
ファイルを操作するにはどうしたらいいんですか?
ソースで教えてほしいのですが。
00898702/02/28 20:33ID:???
>>88
open(OUT,">logifle");print OUT $log;close(OUT);
てかんじだよー。
0090名無しさん@お腹いっぱい。02/02/28 20:34ID:???
>88
もう一度>>1を読んできなさい。
0091名無しさん@お腹いっぱい。02/02/28 20:35ID:???
>>89
いい人過ぎ。
0092名無しさん@お腹いっぱい。02/03/01 00:20ID:X6rC0lr1
ファイルをアップロードしたいんですが、
モジュールとかインストールしないで
さくっと転送するにはどんな方法がありますか?
どれも結構ややこしそうで挫折しかかってます…
0093名無しさん@お腹いっぱい。02/03/01 00:35ID:???
>>92
formのほうに
<form enctype="multipart/form-data" method="POST" action="ほげ">
って書いて、CGIのほうは標準入力から読み込むだけだよ。
0094名無しさん@お腹いっぱい。02/03/01 00:38ID:???
>92
FTP。

フォーム使ったアップロードならRFC読んで自分でデータ切り分けたりしないと
いけないから,素直にモジュール使っちゃえば?
0095名無しさん@お腹いっぱい。02/03/01 00:55ID:DUUG9VQm
perl5 でtie を使ってデータベースを構築したいのですが、tie の使い方が
さっぱりわかりません。dbmopen だと(これも使ったことないんで
よくわかりませんが)

#%hash は定義済みとして
dbmopen(%hash, "data_base", 0644);
while (($key, $value) = each %hash) {
$hash{"$key"} = $value;
}
close(%hash);

こんな感じで外部ファイル化したいんですが、tie の場合、どういうふうに
書けばいいんでしょうか?
0096名無しさん@お腹いっぱい。02/03/01 03:45ID:uLWuBwxz
use Fcntl ;
use AnyDBM_File ;
$db_flag = O_RDONLY ;
tie ( %hash , 'AnyDBM_Files' , 'database' , $flags , 0644 ) ;
while ( ( $key , $value ) = each ( %hash ) ) {
push @array , "$key\t$value" ;
}
untie ( %hash );

こんな感じ。tieもdbmopenもほとんど変わらない。
使い方はgoogleででも検索したらいっぱい出てくると思う。
もし、tieでもうまく行かないのならそのコードが変。
特に$hash{"$key"} = $value; の部分が怪しい。
仮に書いただけにしても、意味のあるコード書くのが普通と思われ。
00979502/03/01 09:30ID:dR5S0Mwb
>>96
おかげ様でうまくいきました。実は質問する前に丸一日googleで色々
調べて見よう見まねでやってたんですが、use Fcntl;が抜けてたせいで
うまくいかなかったようです。
ありがとうございました。
0098名無しさん@お腹いっぱい。02/03/01 12:49ID:???
・Perl依存症

世の中何でもPerlでやればいいと思ってしまう罠。
例えばエディタの置換機能を忘れていて

s/<td><\/td>/<td>a<\/d>/g;

してしまう罠。
00999202/03/01 23:43ID:X6rC0lr1
>>94
素直に使っちゃいたい、んですが、
モジュールのインストールが不可能なので無理です…。

現在、どっかのアップロード式BBSから切り出す方向で検討しています。
jcode.plみたいな引数渡したら勝手にやってくれる
ライブラリがあればいいんだけど、ないよなぁ…。
0100名無しさん@お腹いっぱい。02/03/01 23:48ID:???
CGI.pmは標準モジュールだろ?インストールしなくていいよ。
01019202/03/01 23:52ID:???
>>100
CGI.pmでできたんだ…。
ありがとうございました。googleに逝ってきます…。
0102名無しさん@お腹いっぱい。02/03/02 00:17ID:???
>>92
cgi-lib.plはイヤ?
0103名無しさん@お腹いっぱい。02/03/02 00:21ID:7JCmBc0W
文字列検索の構文で、オプションを2つ付けたいのですが
たとえば
・文字列を複数行として扱う
・大文字、小文字を区別しないで検索
の場合

変数 =~ /文字列/i/m;

でOKでしょうか?
0104名無しさん@お腹いっぱい。02/03/02 00:24ID:???
>>103
/〜/im;
0105名無しさん@お腹いっぱい。02/03/02 00:29ID:7JCmBc0W
>104 さんく
0106nobodyさん02/03/02 02:34ID:Lu4QyfYX
perlでftpアクセスの自動化ってできる?サンプル探したり
したけど、見つけられんかった。
0107nobodyさん02/03/02 02:39ID:???
>>106
もしかしたらモジュールであるのかもしれないけど、
http://www.google.com/search?hl=ja&q=perl%82%C5ftp&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
とりあえずどんぞ。
0108nobodyさん02/03/02 06:20ID:LaOqrqUm
パスワードの設定の際メタ文字を使えなくしようとしています。
ただし『+』『-』『=』『!』『?』は使えるようにしたいです。
if ($password =~ /\W/) {}などとすると全部のメタ文字にマッチしてしまうの
で、どうにかしたいのですが、良い方法が思い付きません。[^\+\=\-\!\?]辺り
で試してるんですが、どうもうまく行かなくって・・・。
0109nobodyさん02/03/02 07:26ID:???
>>108
正規表現スレでも逝って勉強した方が良いよ。
でも、まぁ。
die if /[^-+=!?\w]/;
0110nobodyさん02/03/02 07:42ID:???
&test("aaa");
sub test {
 print $x;
}

ここで"aaa"を$xに入れるには
$x = $_[0];
としないと駄目でしょうか?

sub test($x : $_[0]){}のように変数名を指定したいのです
0111nobodyさん02/03/02 08:02ID:???
残念ながら、無理です。
> $x = $_[0]
そのようにして下さい。お好みで $x = shift;

引数を保証したいならプロトタイプ。
011211002/03/02 08:29ID:???
有難うございます。
$x = $_[0]; でいくことにします。
0113nobodyさん02/03/02 08:53ID:???
再帰するサブでプロトタイプは使用できる?
0114nobodyさん02/03/02 10:08ID:???
>>110
ハッシュを使う
$hiki{'x'} = 'aaa';
&test(\%hiki);
sub test{
%hiki = %$_[0];
print $hiki{'x'};
}
0115nobodyさん02/03/02 12:50ID:???
>>114
それは何かの解決になってるのか?
0116名無し02/03/02 14:46ID:FrK2+WoO
>>115
同意。
114のやり方だと容量増えるだけだと思われ。
0117nobodyさん02/03/02 15:43ID:???
ハッシュ使うなら、漏れはこっちのが好みだ。
sub x
{
%arg = @_;
print "$arg{a}\n";
print "$arg{b}\n";
}

x(a => 10, b => 100);
0118nobodyさん02/03/02 15:46ID:???
>>117
再帰してる?
0119nobodyさん02/03/02 16:15ID:???
>>118
はぁ?
まさかsubは呼び出しより前方に書かなきゃいけないとでも思ってる?
0120nobodyさん02/03/02 16:18ID:???
>>119
いや、厨房質問くさいんだけど、

再帰って

sub x
{
my($hh) = @_;

if($hh != 0)
{
return &x($hh - 1) * 2;
}
else
{
return 1;
}

じゃないの?}
0121川o・-・)02/03/02 17:44ID:BzlXRQCM
想像力を働かしてまとめると、、、
>>110 は「複数ある、それぞれが省略可能な引数を渡したいので、呼び出し元で名
前をつけたいんだが、どうすればいいわけ?」と聞きたいのだと思う。で、回
答は>>114と>>117で。
>>113 できます
>>114 どうせコピーするならリファレンスじゃなくていいんじゃない。
で、サブルーチン内で引数を書き換えないのなら、
コピーせずに$hiki->{x}でいいね。
>>115 110の問題を解決しているわけだが、、、
>>116 猫の額程度の容量を気にしてどうする、、、
>>117 保守的なコピーが必要ならこれで
>>118 「再帰」を勉強しましょう
>>119 プロトタイプ宣言の恩恵を受けるには呼び出しより前に書かなきゃね
>>120 正解
012211902/03/02 18:59ID:???
>>121
この文脈で前方つーたら前方参照の意味なんだが誤解してないかい?
01239202/03/02 19:41ID:???
>>102
イヤじゃないです。迷ってます。
CGI.pmはでかくて評判悪いので、
CGI_Lite.pmかcgi-lib.plを使おうと思ってるんですが、
どっちを使おうかなぁと…。

実際問題、この二つってどう違うんですか?
もちろん全然違うプログラムってのはわかってるんですが、
用途が似てるから…。
01249202/03/02 19:43ID:???
googleしてたらこんなの見つけました。
CGI.pmもcgi-libも使わずにアップロードできるスクリプト。
http://tohoho.wakusei.ne.jp/cgi/wwwupl2.txt

ちなみにとほほ氏謹製です(w
0125nobodyさん02/03/02 19:43ID:???
なるほど、再帰してるsubの中の呼び出しは&でプロトタイプチェック回避させるのか。
012610802/03/02 20:14ID:???
>>109
おお!できたできた!
ありがとうございます。

はい。正規表現スレッドに逝ってきます。
0127nobodyさん02/03/02 20:39ID:???
ファイルのヘッダーを見て拡張子を返すようにするにはどうすればいいのでしょうか?
ファイルのどこにヘッダーがあるのかわからん。。
0128nobodyさん02/03/02 20:44ID:???
>>127
ファイルの先頭以外にヘッダがあることはあえない。
もし、先頭に無ければそれはヘッダとは呼ばない。
0129nobodyさん02/03/02 21:06ID:MILA+IA2
簡単な暗号化ルーチンってないすか?
単に生URL見せたく無いだけなんで、
簡単なロジックで、encode,decode出来ればいんすけど、
どでしょ?
0130nobodyさん02/03/02 21:10ID:???
>>129
すべての文字にNOTかける。
013111502/03/02 21:18ID:???
>>120
他の言語みたく
void Hoge (int n) {}
って渡し方が出来るかってことじゃねーの?
だからハッシュでってのは見当違いかなと。

まぁいいけどさ。
013211502/03/02 21:18ID:???
しまった、>>121ね。
>>120さん、すまん。
013312002/03/02 21:22ID:???
>>131
うん、死ぬほど悩んだw。
0134nobodyさん02/03/02 22:05ID:???
>>129
1バイトずつ0xFFと排他的論理和をとる(bit反転)。
0135asahi02/03/02 22:15ID:???
・・・ここでいいのかな?
あぷろだでアップ時の残り時間を
表示させるのにはどうすればよいのでしょうか?
スレ違いだったならごめんなさい
0136nobodyさん02/03/02 22:16ID:???
>>135
それはCGI側じゃなくてアップする方がやることでしょ。
0137nobodyさん02/03/02 22:18ID:???
>>135
適当なところに以下の文を追加
print scalar localtime;


これで分からなきゃCGI改造スレ行け。
その際はそのアップローダのソースをどこかに上げろよ。
013813702/03/02 22:19ID:???
って何か勘違いしてたらしい。
残り時間はサーバー側じゃ無理だわな。
0139nobodyさん02/03/02 22:30ID:???
なじぇ? アップ開始から完了までCGIプロセスは生き続けるし、サイズはわかってる
から無理じゃないっしょ?
0140nobodyさん02/03/02 22:37ID:???
>>139
で、画面の更新はどうするの?meta refresh?
0141nobodyさん02/03/02 23:03ID:???
マルチフレームでリフレッシュとか、シングルフレームでもコネクションがタイムアウトしないようにだらだらと送ってやれば
表示できるじょ。
0142nobodyさん02/03/02 23:07ID:???
あっ もれも勘違いしてたかも。でもHTTP/1.1なクライアントならコマンドパイピング
が効いて送り終わって無くても応答取ってるかも。
実験してみよう。
0143nobodyさん02/03/03 04:22ID:???
CSVファイルでカンマで区切った部分の左端から何個目だけを
表示させたいという場合はどのように記述すればいいのか教えてください。

例
a1,a2,a3,a4,a5,a6,a7,a8,a9,
b1,b2,b3,b4,b5,b6,b7,b8,b9,
とデータがある時に左から5列目、つまりa5とb5を取り出す。

よろしくお願いします。
0144nobodyさん02/03/03 04:57ID:???
>>143
splitを使え。
どうやって使うんですか、とか言わないでよ
014512902/03/03 05:00ID:IQ08Jes1
すまそ。
URLでパラメータで渡したいから、URLで使える文字だけにしたいんよね、
エスケープシーケンスだと長くなっちまうから、ちょっとねぇ〜
0146nobodyさん02/03/03 05:20ID:vLChsjTs
while (<FILE>) {
push @array , (split /,/)[4] ;
}
print @array ;

こんな感じかな?
0147nobodyさん02/03/03 06:25ID:???
ランダムな文字列を指定した数だけたくさん作るにはどうすれば出来ますか?
0148nobodyさん02/03/03 07:54ID:qCUfXnEh
ん?
指定した長さのランダムな文字列って事?
使用する文字列の範囲を教えて。
0149nobodyさん02/03/03 08:09ID:+mcyIDOm
すいませんが教えてください
$str =~ s/$str1/$str2/;
なのですが $str1,$str2 にも "/" "." などが入っているのが問題なのだと思うのですが
うまくいきません(というか無限にループしているみたいになっています)
$str =~ s/\Q$str1/\Q$str2/;
というのを見つけたのですが、$strが"\"マークだらけになってしまいます
どうしたらうまく置換できるのでしょうか?
0150nobodyさん02/03/03 09:27ID:???
>>129
IBM->HALや XYZ->ZABみたいに何文字かずらすとか。

>149
置き換え文字には\Qいらんと思われ。
015114302/03/03 13:39ID:K6uur/rZ
>>144
>>146
ありがとうございます!
試してみます。
0152nobodyさん02/03/03 14:11ID:IQ08Jes1
perl -v とすると、

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = "ja_JP.ujis",
    LC_ALL = "ja_JP.ujis",
    LC_MESSAGES = "ja_JP.ujis",
    LC_CTYPE = "ja_JP.ujis",
    LANG = "ja_JP.ujis"
  are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

This is perl, v5.6.1 built for i586-linux

Copyright 1987-2001, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'. If you have access to the
Internet, point your browser at http://www.perl.com/, the Perl Home Page.

って感じで、localeでしかられちゃうんだけど、どしたらええのかね、
ちなみに、環境変数は

export LANGUAGE=ja_JP.ujis
export LANG=ja_JP.ujis
export LC_CTYPE=ja_JP.ujis
export LC_ALL=ja_JP.ujis
export LC_MESSAGES=ja_JP.ujis

こんな感じにしてます
0153nobodyさん02/03/03 14:12ID:???
>>129
そういう単純な事をやっていると、そのうちひろみちゅに晒されるに500モナー
0154nobodyさん02/03/03 14:19ID:???
>>153
PGP
015515202/03/03 14:21ID:IQ08Jes1
すまそ、まし〜んは、
Linux(slackware)
0156暗号化だが02/03/03 14:29ID:IQ08Jes1
暗号化ってより、
漏れは、URLで使える文字に変えるってのが知りたい
極力、1バイト、一文字に抑えて、足りない分は、
!Aとかで、2文字にしていく、ハフマンのエンコード部なんか
参考になりそうだなぁ〜とか、思ったりしてた。
暗号化ってより、圧縮、変換の話か・・・
0157IQ=8 だって --->02/03/03 14:30ID:???
カナスゥィー
0158nobodyさん02/03/03 14:31ID:???
>>156
圧縮だって立派な暗号化だと思うが。持論だが。
0159nobodyさん02/03/03 15:30ID:???
>>158
長さが長くなるのくらいあきらめろ、って気がしてきた。
URLに使われる文字がABCDEFGHだけだとして、
tr/ABCDEFGH/DGFHCEAB/;
ってのはどうだ?
0160nobodyさん02/03/03 15:31ID:???
>>159
最も簡単な暗号化って奴ですな。
016115602/03/03 15:59ID:IQ08Jes1
結構需要あるような気がするんだけど、
必要に感じた事無い?
0162nobodyさん02/03/03 16:13ID:???
>>156
URI::Escape
なんか勘違いしてるか?
0163143=15102/03/03 16:42ID:K6uur/rZ
たびたびすみません。
csvから情報を選び出すことは出来たのですが、
次はそのデータを比較して、条件に合ったときだけ取り込みたくて
以下のようにしたのですがうまくいきません。
アドバイスお願いします。
open(DATAFILE,"data.csv");
while (<DATAFILE>) {
push @TMPDATA ,(split /,/)[0,5] ;
if (@TMPDATA[0] < @TMPDATA[1])
{
push @TIME ,(split /,/)[1];
}
}

それとスペースも入ってない空欄
1,2,,4,←こんな状態
の部分はどのように判別すればいいのですか?
よろしくお願いします。
0164nobodyさん02/03/03 16:43ID:???
>>163
プッシュは配列の最後に要素を加えます。
016516302/03/03 17:27ID:K6uur/rZ
ありがとうございます。
参考にして
push my @TMPDATA ,(split /,/)[0,5] ;
としてみると、思い通りに動きました。
空欄の処理の仕方も何方かアドバイスお願いします。
0166nobodyさん02/03/03 19:22ID:zlwT/08t
デバッグモード(perl -cw)で「Syntax OK」なのにApacheで
CGIを動かそうとしたらエラーになってしまいます。
原因は何が考えられますか?

Win2K(SP2)+Apache1.3.24+Perl5.6.620です。
0167nobodyさん02/03/03 19:52ID:???
>>166
Perlへのパスが間違っている。
必要なヘッダを出力していない。

etc
0168nobodyさん02/03/03 19:58ID:???
>>166
そもそもPerlが入ってない。
0169nobodyさん02/03/03 20:30ID:???
>>168
入っていなかったらどうやってデバッグモードでSyntax OKという答えを得るのよ・・・
0170nobodyさん02/03/03 20:32ID:???
>>166
apacheのエラーログ見れ
0171nobodyさん02/03/03 21:02ID:???
>>163>>165
空欄が入ってる時、それをどうしたいの?
0172nobodyさん02/03/03 21:08ID:???
つか -cw は文法チェックするだけ。普通はデバッグモードとは言わん。
例えば、以下のコードはSynax OKだが実行した瞬間死ぬ。

#!/usr/bin/perl
foo()
__END__
0173nobodyさん02/03/03 21:14ID:/fm96Lfb
ActivePerlをインストールしたら、ダウンロードしてあったCGIスクリプト
のplファイルが黄色いボールのアイコンになってしまいました。
この関連付けを解除する方法は無いですか?このままでも問題無し?

あと、いずれはCGIスクリプト書けるようになりたいですが、まず最初の
段階ではActivePerlをインスコして参考書読みながらコマンド打っていくの
がいいんでしょうか?サーバソフトとかまだ入れてないんですが・・
0174nobodyさん02/03/03 21:15ID:???
>>173
>インスコして

一生無理だ。あきらめろ。
017516602/03/03 21:16ID:zlwT/08t
>170
Apacheのログを見たら分かりました。
print "Content-type: text/html\n\n"を忘れてBad headerでした。
超初心者的ミス、鬱だ。
017617302/03/03 21:24ID:/fm96Lfb
>>174
そんな事言わずにお願いします。
>インストールして
訂正します。すみませんでした。

ちなみに参考書は「すぐわかるPerl 深沢千尋/著」を買ってきました。
0177nobodyさん02/03/03 21:26ID:???
>>176
その本は素晴らしいよ。

基本的にはコマンドプロンプトでPerl a.cgiとするのが王道。
俺は秀丸マクロで開発環境作ったけど。
0178nobodyさん02/03/03 21:26ID:???
>>176
じゃあまずその本を読破しろ。
017916302/03/03 23:17ID:K6uur/rZ
>>171
CSVデータの中に空欄があったら処理を実行せずにデータがあればそれから処理を実行したいんです。
0180163=17902/03/03 23:22ID:K6uur/rZ
具体的には
open(DATAFILE,"data.csv");
while (<DATAFILE>) {
push my @TMPDATA ,(split /,/)[0,5] ;
if (@TMPDATA[0] < @TMPDATA[1])
{
push @TIME ,(split /,/)[1];
}
}
のifのところで@TMPDATA[0] 、@TMPDATA[1]のどちらかが空欄なら以下の処理をせずに終わりたいんです。
■ このスレッドは過去ログ倉庫に格納されています