Perl コーディング初心者質問コーナー Part29
いらっしゃーい、Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
>1 otu
\x00-\x1F\x7F-\xFF か。
13 :
nobodyさん :03/10/16 18:57 ID:zuWmN04x
質問させてください。現在、Win2000+Jperl でSJISのテキストファイルの 処理を色々やっています。Perl の最新の機能を使いたいので、Jperl はやめて、Active Perl に移行したいと思っています。ここで、移行の際に やるべきことを自分なりに考えた結果は次の通りです。 ・SJIS のソースコードをUTF-8にコンバートする。 ・SJIS の文字コードを入出力する毎に、Jcode.pm などを使って SJIS ←→ UTF-8の変換を行うステップを追加する。 ・文字コードに依存した正規表現(/亜-意/など)は書き直す。 他にやるべきことや気をつけるべきことなどあるでしょうか?
14 :
13 :03/10/16 19:02 ID:???
誤: Active Perl 正: Active Perl 5.6
Active Perlに移行と何も関係ないじゃん。ただ入れ替えればいいだろ。
>前スレのユーザーエージェントの話。 そのまま出力するな。 ユーザーエージェントはユーザー側で変更可能。 ユーザーエージェントにタグを仕込まれたら、クロスサイトスクリプティングを仕掛けられるぞ。 最低限、タグを無効化するとかなどの対処をするべし。
>>17 横からだがいい事聞いた。
言われてみればその通りだな。
サンクツ
>>17 おお!俺も盲点だった。さっそく修正する。多謝
$a から $eまで5個の変数に何も入ってなかったら、 $val に1を代入するってのを $val = $a . $b . $c . $d . $e eq '' ? 1 : 0 ; って書いているんだけど、 もうちょっとスマートに書けませんか? おながいしまつ。
21 :
13 :03/10/16 20:41 ID:???
>>15 例えば、「貼」、「表」、「暴」など、SJIS コードで2バイト目
に \ (0x5c)が含まれていたときに意図しない動作をするとか、
文字数のカウントが狂うとか、色々と不具合が出そうな気がするのですが。
>20 「スマート」と言えるかどうかは知らんが。 foreach ($a, $b, $c, $d, $e) { last if defined $_; } continue { $val = 1; }
23 :
nobodyさん :03/10/16 22:37 ID:h6mUMfev
>>21 基本的に問題がでるのはリテラルだけだ
その辺がわかってるなら心配いらない
有能な暴力団構成員が、元禄時代の饅頭にソースをかけて食ってた。
アクセス解析のログをローカルで開きたいんです。 csvファイルで、メモ帳で開くと、 日付,IP,リンク元URL のように「,」で区切って格納されてます。 これをhtmlで表示するには、 それぞれ呼び出して、配置するということまではわかったんですが、 ソースの書き方がまるで分りません。 お教え願えませんでしょうか?
1からソース書けってか。 少しは自分でやろうって気にはならんのか。 本を読もうって気にはならんのか。
>>26 とりあえず、アクセス解析のログが50/dayから4000/dayに跳ね上がってしまったんで、
今すぐに開きたいんですが、ネット上では重すぎて開けないんです。
おいおい勉強はしていきたいんですが。
>>27 あー緊急なわけね。
仕事なら引き受けるけど。
つーか俺じゃなくても引き受けてくれる人が沢山いると思うけど。
「緊急だからタダでやれ」ってことなら、タダでやってもいいけど、
代わりに俺の緊急の仕事やっといて下さい。
>>28 ごめんなさい。
ムシが良すぎるのはわかってたんですが、全然無知なので簡単なものだと思い込んでました。
ゆっくり勉強して作れるように頑張ります。
というか、アパッチを入れてローカルで動作させるだけでいいような気がしてきたんですが、それでできますかね?
>>25 動くかどうかしらんが 今ベタにかいてみた
print q|<table>|;
open(IN,"data.dat");
while(<IN>){
my @a = split(/,/);
print qq|<tr><td>$a[0]</td><td>$a[1]</td><td>$a[2]</td></tr>\n|;
}
print q|</table>|;
>>31 次はCGIが500エラーしますに 500モナ
>30 わかりました。スレに張られてるサイトを見て勉強してきます。 >31 ご好意有難う御座います。 まず、それを「読める」レベルに達するよう頑張ります。
今更ですが、csvファイルなので、エクセルで開いてビルダーに貼り付けたら望んでる形になりました。 お騒がせしました。
35 :
nobodyさん :03/10/17 01:51 ID:VpbW+epG
消費税計算させて表示させるだけのperlつくったら、 一回計算させただけで、なにも結果が返ってこなくなって、 ps -auxでみると、ずっとそのperlプロセスが動いている状態。 10分ぐらいで、計算は出来たみたいだけど、 あとでサーバーモニター見てみたら、 その時間のサーバー負荷率1300%になってたーよ。 いまは、$x * 5 / 100ってやって、普通に動作するけど。 どうやったら、普通に小数点演算できるようになりますか? perlのバージョンは、 This is perl, v5.8.0 built for i386-linux-thread-multi です。 誰か詳しい人、教えてください。お願いします。
36 :
35 :03/10/17 01:55 ID:???
すいません、環境書き忘れてますた。 Linux のバージョンは、Redhat 9.0 Apacheは、2.0.40でふ。
>>35 よほどたくさんの計算をさせたのか?
もしそうじゃないなら、そんな計算で10分もかかるのはかんがえにくい。
ロジックを見直せ。
あと、$x*1.05 で計算はできんか?
参考:
切り捨て int($x*1.05)
四捨五入int(($x*1.05)+0.5)
そのソース、見てみたいなあ 思いっきりループしてるんだろうけどなw
昨日、間違ってwhileで無限ループやらかして一瞬で10Gのスワップ作った挙句落ちたわけだが。 無限ループ阻止オプションとか…無いですよね…_| ̄|○
42 :
nobodyさん :03/10/17 17:08 ID:/yWbEMzG
削除フォームを作ってるんですがなぜか フォームの下に「1」と表示されてしまいます sub userdelform { print <<"end_of_show_delform"; <form action="$scriptname" method=$method> 記事No <input type="text" name="no" size=3> 削除キー <input type="text" name="pass" size=5> <input type=submit value="記事削除"> <input type="hidden" name="mode" value="userdel"> </form> end_of_show_delform } こんな感じです。 表示される「1」を消す方法ありませんかね?おねがいします
>>42 そのどこかに「1」が表示される部分があると思うか?
print userdelform(); とかやってるんじゃないの
つーかルーチン組んでる理由がなぞ。
47 :
42 :03/10/17 18:15 ID:???
治りました、こんな事だったとは… どうもありがとうございました。以後気をつけます。 ルーチン組んでる理由は この部分だけを使いまわしたりしてるからです
>46 >42は知らんけど小規模なスクリプトで表示部埋め込みとかやってる場合 見通し良くする為にサブルーチンにしてテンプレ代わりに使うとかはやる事あるかな…。 あとこんなん sub print_head{ my $title = '索引'; if ($_[0] eq 'mode_contents' ) {$title = '目次';} elsif ($_[0] eq 'mode_bbs') {$title = '掲示板'} print<<"EOM"; (略) <title>$title</title> </head> EOM } とか……適当だけど。
ほんとうになるのかな??
&jcode::convert(\$hoge, "euc"); だと、これだけで、$hogeがeucに変換されますよね。 で、自作の関数、たとえば 数字を2倍にする関数 sub dubble{ my $num = $_[0]; return $num * 2; } は、 $fuga = &dubble($fuga); としないと使えません。 これを、 &dubble($fuga); だけで、$fugaが2倍になるようにするには、どうすればいいのでしょうか?
sub dubble{ ${$_[0]} *= 2; } &dubble(\$fuga);
>>51 sub dubble {
$_[0] *= 2;
}
うそつきがいます。
Win32ではalarmが実装されてないようなのですが、代替手段などは ありますでしょうか? selectがどうのこうのって話は聞いたことがあるのですが…。
>>55 マニュアルくらい引けよ。ちゃんと例つきで載ってるから。
>>1 もよく読め。回答してる人は便利屋じゃねーぞ。
57 :
nobodyさん :03/10/18 14:30 ID:9PRQP4Pm
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $dd = sprintf("%d/%02d/%02d(%s) %02d:%02d:%02d",$year,$mon,$mday,$youbi,$hour,$min,$sec); こういう風に時間を取得して表示フォーマットをしていますが、 ここで$spe_dayという変数に、 2003年9月20日からの経過日数を代入したいのですが、 この場合どうすればいいのでしょうか。 ぐぐってみましたが今ひとつ分かりづらいのばかりでした。
>57 その方法だと、2003年1月が103年0月になりそうな気もするが。 $youbiがどこから出てくるかはあえて突っ込むまい。 経過日数を調べたければ、2003/9/20をtimelocalで秒に変換して、 int( (time() - timelocal(2003年9月20日を整形したもの)) / 86400 ) ってとこだろうな。 timelocalの使い方くらいは自分で調べてくれ。
59 :
nobodyさん :03/10/18 15:28 ID:GoB4JP+S
>>58 $year += 1900;
$youbi = ('日',月','火','水','木','金','土')[$wday];
を入れ忘れてましたスミマセン
その方法だと、2003年1月が103年0月になりそうな気もするが。
$youbiがどこから出てくるかはあえて突っ込むまい。
>経過日数を調べたければ、2003/9/20をtimelocalで秒に変換して、
>int( (time() - timelocal(2003年9月20日を整形したもの)) / 86400 )
>ってとこだろうな。
>timelocalの使い方くらいは自分で調べてくれ。
timelocal でググったら色々出てきてやり方が分かりました
どうもありがとう御座いました!
>>57 Date::Calc を使う方法もあるぞ。日付計算なら任せとけってなモジュールだ。
インストールできないなら,PurePerl版のDate::Pcalcを使え。こっちは置くだけで動く。
61 :
nobodyさん :03/10/18 16:53 ID:xuQqTiqt
あるディレクトリにあるファイルを一覧表示させたいのですが ファイル名と容量を取得する関数とかヒントください
>61 googleで検索
>>61 foreach(glob("./*")){
print $_."\t".(-s $_)."\n";
}
print あるディレクトリ eq 人様の鯖のディレクトリ ? 403 : 200 ;
>>64 三項演算子嫌い・・・
読み間違える・・・
条件式 ? 真 : 偽; って書けば読みやすくないか? まあifでもいいんだが
条件式1 ? 条件式2 ? 条件式2の真 : 条件式3 ?条件式3の真 :条件式3の偽 : 条件式1の偽;
漏れは結構myとかスコープ内だけの変数つかうから 素直にif使ってる だめですかね?
三項演算子はメモリ使うとか読んだような気がするんだけど実際は?
$foo = ( !~ m/bar/) ? baz : s/\n// ; みたいな書き方出来んのはちょっと残念。
>>63 プロパの仕様変更でディレクトリにアクセスできなくなたので
困っていました
アレンジしてcgi作成し、index.htmlから転送できました
ありがとうございました
>>70 条件式2の偽は?
私は簡潔に書けるときだけ、三項演算子使ってる。
通常はifか論理演算子。
全てのif文、論理演算子を三項演算子に書き換えたら 他人にパクられにくい訳のわからんソースにできるという点が利点だな。
条件式3
80 :
77 :03/10/19 02:07 ID:???
三項演算子がらみでちょっと質問 if ($a && $b or $c && $d) { $sex = '男'; } else { $sex = '女'; } ってif文を三項演算子でやれるの?
>>81 そういうことをやるための三項演算子なわけだが。
$sex = ($a && $b or $c && $d) ? '男' : '女';
84 :
81 :03/10/19 05:06 ID:???
>82-83 できました。 なぜ出来なかったんだろう。 恥ずかしいから吊ってくる。
>>68 >>70 そ、その書き方一般的だったんか・・・。
同じ書き方で自分で読みやすいと思って書いていたのだが、
同僚(というか実質部下だわな)全員に変態コード扱いされてたぞ。
彼ら曰く「3行も使ってもったいない」
長さによるだろ。例えば
>>83 くらい短いのを
3行にしてしまうのはちょっと・・・という感じ。
あるいは、「これは三項演算子ではない。三行演算子だ」
と言い訳するとか。
tp://hp.vector.co.jp/authors/VA010341/conditional.html
ヾ( ・∀・)ノ"サンコー
89 :
nobodyさん :03/10/19 07:13 ID:dcHaSs9x
DBD:mysql をインスコしたいんですが、mysqlの 接続にパスワードが必要なので接続できず、イン スコに失敗します。これってどこで設定すれば いいんですか?一時的にパスワード無しにするし かないのでしょうか(´・ω・`)ショボーン
>>89 環境書き忘れました。
Plamo Linux3.2
Perl-5.6.1
です。
91 :
nobodyさん :03/10/19 08:43 ID:I1QTIEU8
>>89 最初はフリーパスで行けた気が。rootパス無しは?
95 :
65 :03/10/19 09:41 ID:???
>>68 おーそう書くとわかりやすいかも
でも行末に ; がないとムズムズする・・・
三項演算子の入れ子は逝ってよしです。
>>87 のサイト、仕様に沿っていれば書き方に正しいも間違いもないし
本人の流儀の問題なんだが、それはさておき、後段部分が面白い。
━━━━━━━━━━━━━━━━━━━
case1 ? expression1:
case2 ? expression2:
case3 ? expression3:
...
default-expression
--------------------------------------
a = c >= 'A' && c <= 'Z' ? c - 'A':
c >= 'a' && c <= 'z' ? c - 'a' + 26:
c >= '0' && c <= '9' ? c - '0' + 52:
c == '+' ? 62:
c == '/' ? 63:
-1;
━━━━━━━━━━━━━━━━━━━
これなら行末のコロンがセミコロンに見えなくもないので
>>95 も満足だろう。
>>97 > 後段部分が面白い。
目が点になりますた。
printf("iは5%sです。\n", i<5 ? "未満" : "以上"); やつはこう書くのか。
長いのは?と:で改行するけど 短いのは1行で書いちゃう
短いのは一行。 入れ子は括弧つける。 $hoge = $fuga == 80 ? 1 : ($bar eq "テヘ" ? 2 : 3) ; $hoge = $fuga == 80 ? 1 : $bar eq "テヘ" ? 2 : 3; こっちのほうが普通だったのか…_| ̄|○
俺はこう書いちゃうなぁ。 $a = $c =~ /[A-Z]/ ? ord($c) - ord('A') : $c =~ /[a-z]/ ? ord($c) - ord('a') + 26 : $c =~ /[0-9]/ ? ord($c) - ord('0') + 52 : $c eq '+' ? 62 : $c eq '/' ? 63 : -1 ; ちなみにこういう三項演算子の使い方は Expoter.pm にも出てくる。
一行が60-70文字くらいを超えそうなら 二行に分けるか、if文使うが、それ以外は一行だなぁ $hoge = ..... [TAB] ..... ; 見たいに長くなるとセミコロンは文頭にしたくなる コロンを前に持ってくるのよさそうだね。
品評会会場はここでつか? $a = $c =~ /[A-Z]/ ? ord($c) - ord('A') : $c =~ /[a-z]/ ? ord($c) - ord('a') + 26 : $c =~ /[0-9]/ ? ord($c) - ord('0') + 52 : $c eq '+' ? 62 : $c eq '/' ? 63 : -1 ; 条件に対する真偽を縦に並べたほうが漏れ自身わかりやすい。
>97 いやまあ、解説書とかにケチつけてるだけなんで結局あんま深く考えてないかと。
4引数のselectを用いたタイムアウト処理なんですけど、 $nfound, $timeleftが返り値で、四つ目の引数にタイムアウトまでの秒数を 指定するところまではらくだ本やテンプレのサイトを読んで分かったんですが、 $nfoundの意味と、実際にalarmの代わりに使うにはどうしたらいいのかが よくわかりませんでした。1〜3引数の意味とか…。 alarm($timeout); while(1){ 処理 } alarm(0); という風に、$timeout秒だけ処理を繰り返してexitする機能が 欲しいだけなんですが…。 どうすればいいのでしょうか。1〜3をundefにしてもsleepするだけだし…。
108 :
75 :03/10/19 23:24 ID:???
追加質問です ディレクトリのファイルの名前と容量は取得できましたが、 やはり最終の修正日が欲しいです -Mで取れますが、これはcgi起動から何日前かということ です (int((-M $_)*10)/10) でだいたいの何日前かは表示できます でもなんか、不格好です 年月日日時にするには労力がいりますか?
>>108 stat調べろ
そしたら作成時刻のUnixタイムがでてくるから
後は普通に日付変換しる
>>107 私もActivePerl5.6.xで探してました。
5.8.0にすると実装されていますので、
バージョンを上げるのが手っ取り早いと思います。
>>108 -M使うなら
print scalar localtime($^T-(-M $_)*60*60*24);
こんな感じ。
111 :
108 :03/10/20 12:49 ID:/WJbTq8V
ありがとうございます
>>109 今回は敷居が高かったです
>>110 その方法で変数に入れスプリットして表示させました
容量はビット表示になるので、色々やった結果
1024で割ってみました、これで合うんですよ
変ですか?
>>111 意味も分からず使ってると、しっぺ返しくらうかも。
113 :
nobodyさん :03/10/20 20:27 ID:QzNtpKRW
少し時間のかかる処理中に簡単なメッセージを表示したいのですが、メッセージの下に処理結果が表示されてしまいます。 計算後にメッセージを消して処理結果だけを表示するにはどうしたらよろしいでしょうか? おバカですみません。
BSでも表示して消すとか。
METAでリロードさせる、とか
117 :
nobodyさん :03/10/21 14:58 ID:SAasGDO/
初心者の質問です。皆様お知恵を貸して下さい。
現在、WebサーバーのhtmlファイルをローカルPC(Windows2000)に
ミラーリングさせるプログラムをActivePerlで作っています。
LWP::Simpleモジュールでテストしたのですが、DOS上では
getできてもブラウザ経由ではgetできませんなぜでしょう?
use LWP::Simple;
$hoge = get("
http://hogehoge/hoge.html ");
>>117 どうしてgetできてない事がわかったの?
getしたさきのログにはアクセスした記録は残ってる?
>>117 ブラウザ経由ってどういうことよ?
ローカルにhttpd立ててCGIとして実行とかか?
120 :
nobodyさん :03/10/21 15:23 ID:SAasGDO/
118>>$hogeをそのままPrintした場合、DOSから実行すると表示されるんですが、 ブラウザから実行させると何も表示されませんでした。 119>> そうです。説明足りませんでした。補足説明しますと、 Winodows2000にApacheとActivePerlをインストールし、サーバーにしています。 そこにLAN経由でクライアントからアクセスし実行させています。 DOSの場合はサーバー実機上にて実行させた場合もTelnetでクライアントからアクセスした場合もうまくいきました。
ヘッダを吐いてないだけだろ
122 :
nobodyさん :03/10/21 15:50 ID:SAasGDO/
122> ヘッダつけてます。が、$hogeが殻で何も表示されないようです。
123 :
114 :03/10/21 15:51 ID:???
>>115 すみません、BSってのがわかりません。
せっかく教えていただいたのに勉強不足で…
>>116 <META HTTP-EQUIV="Refreash">
やってみましたが、同じ結果になってしまいました。
>>122 なんかおかしいな
ActivePerlからアクセスするポートは開けてあるんだろうな?
refreshのつづりがへんだが・・・ リロード時には処理が終わったか判定して余計なメッセージを 出さないようにするんだよ 今のままリロードしても同じ表示になるのはあたりまえ
>>122 getした先のアクセスログには何か出てるのか?
request 作ってそれを使ってgetしてレスポンス調べてみるとか
127 :
nobodyさん :03/10/21 16:45 ID:SAasGDO/
124>>ほかのスクリプトはうまく動作しています。ので大丈夫だと思います。 126>>ちょっとテストして発見がありました。 LAN内の他のサーバからはgetできました。 よく考えると、単純にインターネットに接続できていないのかもしれません。 ただDOSからだとうまく動作しているのが不思議です。 (get先のアクセスログは自分の権限ではみれないのでちょっとわかりません...)
自分が権限のある鯖でgetすりゃいいんだよ、localhostでもいい
129 :
nobodyさん :03/10/21 17:12 ID:SAasGDO/
128>> localhostからgetさせると、ブラウザ経由でもうまく動作しました。 ログはきちんと出ました。GET /HTTP/1.0
130 :
nobodyさん :03/10/21 17:15 ID:SAasGDO/
今の所なぜか、get先がLAN外(インターネット)だとgetできない事が判明しました。 それでもDOS上ではうまくいきます。ブラウザ経由だと失敗します。
131 :
nobodyさん :03/10/21 17:23 ID:edK+1Aa8
2重ループを抜ける方法を教えてください。
ブラウザに串を設定してるとか
134 :
nobodyさん :03/10/21 17:41 ID:SAasGDO/
133>>ブラウザのインターネット接続の設定はプロキシサーバーから接続するように設定されています。
ちなみにWinodws2000なので、環境変数に変数名「HTTP_Proxy」値「
http://hogehoge:gogehoge 」と設定しているので
問題ないかと思っていたのですが、このせいでしょうか?
それにしてもなぜDOSだとうまく動作するのか...
串用のGETリクエスト送ってるか? 生でGETする場合と、串に「あそこの鯖のこのページくれ」という場合とでは違うぞ
>SAasGDO/ レスアンカーぐらいちゃんとつけろや
137 :
nobodyさん :03/10/21 18:00 ID:SAasGDO/
135>>すいません、初心者なのでちょっとわからないのですが、 プロキシ用のGETリクエストとはどのようにすればいのでしょうか?
hoge.comのindex.htmlをGETしようとしたとき、直接hoge.comに接続するのであれば
GET / HTTP/1.0
でいけるが、串から受け取るには、一度串に接続して
GET
http://hoge.com/ HTTP/1.0
としなければならないということ。
LWPは使ったことないので知らんが、おそらくget()では串接続を想定していないか、
LWPによってHTTPヘッダがどっか書き換えられていて、串側が変なヘッダを拒否しているか。
かの有名なLWPが串接続を想定していないとは思えないので、LWPのドキュメントを読めば
串を使う場合のやり方は書いてあるのでは。
とりあえず串をはずしてみてブラウザから正常に動作することを確認してみれ
139 :
nobodyさん :03/10/21 18:56 ID:SAasGDO/
>>138 ProxyをIEの設定からはずしてもダメでした。
違うマシンで直接電話回線につないだらうまくいきました。
原因は社内LAN内のProxyサーバを通そうとした事のようです。
ですが、社内LANの中のマシンから起動させたいので困っています。
環境変数HTTP_PROXYがちゃんと設定されてるか、から確認だなあ
コマンドラインからはOKでブラウザから駄目なのは 環境変数がちゃんと設定されて無いからじゃないかと 思うんだよね
>初心者なので 便利な言葉ですね。
他のプロセスの排他は多分OKだと思うんですが、 本来 &unlock; で解除するつもりですが、万が一ロックしたままプロセスが終了して 残された古いロックの解除はこれで問題ないでしょうか? /(\d+)\.lock/ とマッチするファイルが二つ以上ある可能性はゼロとして。 $retry = 5; sub lock{ $LockTime=time(); while(!rename("unlock.lock", "$LockTime.lock")){ if(--$retry<=0){ opendir(DIR, "./"); while($LockFile = readdir(DIR)){ if($LockFile =~ /(\d+)\.lock/ && $LockTime-$1>180){ rename("$1.lock", "$LockTime.lock") || return 0; return 1; } } close(DIR); return 0; } sleep(1); } return 1; } sub unlock{ rename("$LockTime.lock", "unlock.lock"); }
144 :
nobodyさん :03/10/22 10:26 ID:XOZ0ckhF
>>144 その環境変数がcgi実行時にあるかチェックしてみたら
Apacheなら、SetEnv使うのも手かな
あとは、get じゃなくて、ua使って直接串指定するとか
146 :
nobodyさん :03/10/22 12:00 ID:XOZ0ckhF
>>145 環境変数のチェック方法がわからなかったので、
$ENV{'HTTP_PROXY'}を表示してみましたが、中身からでした。
*見当はずれかも。
SetEnvは直接apacheにProxyを設定するということですよね?
どのファイルに書き込めばよいのでしょうか?
ちなみに、LWPsimpleは自動的にenv_proxy()を読むようなので、
$ua = LWP::UserAgent->new;
$ENV{'HTTP_PROXY'} = '
http://hogwhoge:hoge ';
$ua->env_proxy;
と設定してみたのですが、ダメでした。
148 :
nobodyさん :03/10/22 14:24 ID:XOZ0ckhF
>>147 だめでした。。。。
ここまでやるのなら、普通にLWP::UserAgentだけで
やってもあまりかわらないので、やってみたところ
うまくいきました。
LWP::Simpleで実行したかったのですが、原因がまったくわからないので、
あきらめます。
皆様ありがとうございました。
ちなみにLWP::SimpleからLWP::UserAgentに変更するにあたって、
改造した箇所は、
$hoge = get("
http://hogehoge/hoge.html ");
print $hoge;
から、
$URL ='
http://hogehoge/hoge.html ';
$request = new
HTTP::Request (GET => $URL);
$response = $ua->request($request);
print $response->content;
にしたくらいです。
*LWP::SimpleだとProxy設定は有効にならないようです。
&jcode::tr(\$line, '0-9A-Za-z−', '0-9A-Za-z-'); # 半角に置換する例 の反対で、 半角英数字とハイフンを、全角に置換するやりかたって、 ないでしょうか? $line =~ s/0/0/g; $line =~ s/1/1/g; $line =~ s/2/2/g; $line =~ s/3/3/g; $line =~ s/4/4/g; $line =~ s/5/5/g; $line =~ s/6/6/g; $line =~ s/7/7/g; $line =~ s/8/8/g; $line =~ s/9/9/g; $line =~ s/-/−/g; $line =~ s/A/A/g; ・・・のように、 地道にやるしかないのでしょうか? なお、スクリプトの文字コードはEUCです。
半角に置換する例 の反対をやればいいだろ 過去ログ見て少し知恵働かせれ
nkf 使うとか、テーブル作って一発で引く、とか
jcodeでz2hの反対でh2zでもいいじゃん
いままで改行コードのことを特に意識してなかたのですが、 秀丸でスクリプト書いて、 $MyMailbody; qq|ほげほげ ;あれこれ メールの本文です。 |; open(MAIL,"| $MyPathSendmail -t"); print MAIL "From: $MyFrom\n"; print MAIL "To: $MyTo\n"; print MAIL "Errors-To: $MyError\n" if ($MyError); print MAIL "Subject: $MySubject\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n"; print MAIL $MyMailbody; close MAIL; とでも書いて保存して、(当然Windowsの改行コード)アップして、動かしてたのですが、 これだと、 ヘッダ部分はUNIXの改行コードで(LF) メール本文は、 Windowsの改行コード(CRLF)ですよね・・・ なんで、これで動いているのでしょうか・・・ FTPでアップするとき、サーバがFreeBSDだから、自動で改行コードがUNIXコードに変換されてたりするんでしょうか?
>>153 本文がCRLFとかそういう問題以前に、スクリプトの改行コードがCRLFなら
1行目(#!)でコケるはずだから、間違いなくどっかでコード変換が行われてるんだろ。
Win側のFTPソフトの設定がそうなってるんじゃん?
>>153 の場合はそういう理由だろうけど、sendmailはCRLFとLFを混在して送ってもうまく送れた記憶がある。
あと、そういうメールヘッダ作るならMime-Versionくらいつけろよな。
配列内の重複しているまったく同じ要素を削って、単一の要素のみで 構成される配列にするにはどう書いたらいいでしょうか? いろいろ考えたんですが、いい書き方が見つかりませんでした。。。
sortする
array_unique
しまった。こっちゃPerlスレだった。
159 :
155 :03/10/23 02:14 ID:???
できました。
>>156 さんの言うとおり配列をsortした後に、ループ処理で1つ前の要素と現在の要素を
比較していくことで解決しました。
ありがとうございました。
>>155 foreach(@array){ $array{$_}++}
@array = (keys $array);
>>155 俺がよく使うのはこれ。
何かの本に書いてあった。
my %flag = ();
@array = grep(!$flag{$_}++, @array);
改行コードがCRLFでも、1行目にオプションやスペースが ついてたら動作する事はするけどね、念のため補足
163 :
153 :03/10/23 13:43 ID:???
>>154 言われてみれば確かに。1行目でこけますね。
すると、FFFTPが、自動的にLFに変換してるんでしょう・・・
ありがとうございました。
164 :
153 :03/10/23 13:58 ID:???
165 :
初心者 :03/10/23 18:25 ID:PVoZydYa
targetを新しいwindowにしてsubmitしつつ、window.openで できるようなサイズ指定とかをしたいんですけど、そういうのって できますか?
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
175 :
nobodyさん :03/10/24 08:50 ID:h0hqgGO9
画像を拡大縮小したいのですが GDはwindowsなのでつかえません。 そこでperlmagicを使おうとおもったのですが ppmではリストにあらわれず、インストールできません。 どうしたらよいでしょう?
177 :
nobodyさん :03/10/24 10:32 ID:h0hqgGO9
>>176 perlmagicをc:\tempに解凍して
ppm3でインストールですか?
出来ますか?
うちではうまくいかないのだけれども。
いらっしゃーい、Perlのコーディングで困ってる人のスレです。
179 :
初心者 :03/10/24 11:49 ID:PwZKsL7t
フォームからメール送信してるんですが、たま〜に文字化けする人が 出てくるんですが、なんでですか? jcode.plのバージョンが古いとなったりするんでしょうか? 相手のブラウザやOS環境によってもちがってくるんでしょうか。 よろしくおながいします。
180 :
nobodyさん :03/10/24 13:35 ID:q+fVfj6Q
$a = "01"; sprintf("",$a); 前の0を取りたい時はどうやればいいんでしょうか。
>>180 $a += 0; # 数値として
$a =~ /^0+//; # 文字列として
>>179 文字化けしたメールを見ないとわからん
どうせSJISで送ってたりすんじゃねーの?
>>180 printf なら %d 指定する手もある
184 :
nobodyさん :03/10/24 14:58 ID:V/n+9jBD
$flag= false; if($flag){ print qq|$flagよいtrue\n|; }else{ print qq|$flagだめfalse\n|; } 実行すると"だめ"になるつもりで書いたんですけれど、 "よい"になってしまいます。 どうしてでしょうか?
>>175 Perl5.6なら ppm install Image-Magick
5.8なら Image-Magickをインストールしなければならない
187 :
184 :03/10/24 15:09 ID:???
>>185 文盲?直前にfalseを代入しているんですが。
188 :
185 :03/10/24 15:10 ID:???
189 :
184 :03/10/24 15:13 ID:???
マジレスできる人お待ちしております。
190 :
185 :03/10/24 15:15 ID:???
いかん。null(空文字列)とundef(未定義変数) も偽だ。
191 :
185 :03/10/24 15:18 ID:???
度々スマソ。perlじゃ $flag=null; という記述では空白文字列にはならないでつ。
192 :
184 :03/10/24 15:18 ID:???
"0"も偽です。
193 :
184 :03/10/24 15:19 ID:???
ふざけすぎた。ごめん。 もちろん偽者
194 :
nobodyさん :03/10/24 15:36 ID:FlnsLL7a
Yahooのようにブラウザを判別して同一URLにアクセスしてきた機種をPC用、i-mode用と自動振り分けするには どうしたらイイデショウカ?
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
Cではbool型が無いから、しかたなく 0 を偽としていたのに Perlでは律儀に 0 を絶対の偽としてしまったために こういう混乱が生じてるな。これ最大の欠点じゃないのか
あぼーん
あぼーん
あぼーん
205 :
201 :03/10/24 15:52 ID:???
オレはRuby使ってるよ 一時期へんなやつがへんな提案してきて 危うい時もあったが Ruby は 0は偽ではありません。基本的に false とnil だけ
207 :
nobodyさん :03/10/24 16:46 ID:FlnsLL7a
すみません 端末判定の方法は判っていますが、問題はトップページをどうやったらindexhtmlじゃなくて index/cgiにできるか?ということなんです。 よろしくおねがいします。
>>206 さんの努力はいったい・・・
そもそも聞き方が悪いのに、そんな初歩的な事がわからないほど
馬鹿じゃねーんだよコノヤロウ、的ないいかはいかがなものか
210 :
207 :03/10/24 17:34 ID:FlnsLL7a
すいません。 うちの使ってるKDDIでは上記システムは設定不可能だそうです。 どうしよう?何か良いアイデアないでしょうか?
211 :
nobodyさん :03/10/24 17:49 ID:TxLoAa7W
>>210 >>210 symlinkは使える?
.htaccessは使える?
それでもだめだったら、携帯端末が
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=
http://????/ ">
を使えない事を利用して、↑のタグでPC用のページに飛ばす。
(確かカネボウのサイトもそうやってる、、はず)
SSIでいいじゃん
213 :
nobodyさん :03/10/24 17:55 ID:TxLoAa7W
質問です。 ディレクトリ内のデータをディレクトリごと消すにはどうしたら良いでしょうか? やはりファイル一覧を取得して、一個ずつ削除していく方法しかないのでしょうか? また、↑の場合のソースも教えて下さい。
シェルコマンドでぽん
んだな。system から、rm -r 呼ぶとかでいいな それ以外なら、再帰使って1こづつけす手もある
216 :
207 :03/10/24 18:07 ID:FlnsLL7a
KDDIではHTACCESSの利用はできません。 SSIもトップページでは利用できません。 symlinkって何でしょうか?
>>214 >>215 激しくサンクスですが、シェルコマンドって使った事ないんですよ・・・
良かったらソース教えて下さい。
218 :
nobodyさん :03/10/24 18:10 ID:TxLoAa7W
>>216 スイマセン・・私の勘違いでした。symlink使っても携帯とPCで分類できません。
(ちなみにWinで言うショートカットみたいな物)
情報を小出しにするやつに付き合うことはない
220 :
207 :03/10/24 18:16 ID:FlnsLL7a
↓この手法は初めて知りました。現在調査中です。何かいけそうですね。。。
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=
http://????/ ">
を使えない事を利用して、↑のタグでPC用のページに飛ばす。
(確かカネボウのサイトもそうやってる、、はず)
221 :
nobodyさん :03/10/24 18:18 ID:TxLoAa7W
222 :
207 :03/10/24 18:21 ID:FlnsLL7a
index.htmlにて下記のように記述してCGIを呼び出し、端末判定をすれば良いと言う事でしょうか? <HTML> <HEAD> <TITLE>TAG index</TITLE> <META HTTP-EQUIV="Refresh" CONTENT="0;URL=端末判定用CGI/"> </HEAD> <BODY>
223 :
207 :03/10/24 18:24 ID:FlnsLL7a
あ、でも携帯端末は上記タグを読み込めないのか・・・ ってことは、上記をi-mode用にすることで、PCは振り分けることができると思うのですが、 そうすると、AUやVodafonが振り分けできないですね・・・
224 :
207 :03/10/24 18:28 ID:FlnsLL7a
やはりトップページで端末判別を行うのは、HTACCESS使う以外手段はないようですね・・
225 :
nobodyさん :03/10/24 18:44 ID:TxLoAa7W
226 :
nobodyさん :03/10/24 18:48 ID:TxLoAa7W
>>223 こういうのはだめ?
まずさっきのタグで携帯用ページに飛ばす。
そこにボタンだけのフォーム(ボタンには「入り口」とか書いておく)を設置して、CGIに飛ばす。
で、ユーザエージェントで判別。
振り分け・・・
多分これしかないと思う
KDDIではCGIは使えるんだよね?
227 :
nobodyさん :03/10/24 18:52 ID:TxLoAa7W
>>226 追記。
そのindex.htmlは全社が認識できるHTMLで。
(auはHDMLしか使えないと勘違いしてる奴が多い・・・)
auサイト見ると、互換性があるタグとか出てるよ。
229 :
207 :03/10/24 19:02 ID:FlnsLL7a
230 :
207 :03/10/24 19:07 ID:FlnsLL7a
>>227 META HTTP-EQUIV="RefreshタグはPCブラウザ以外認識できないのですが・・
231 :
207 :03/10/24 19:15 ID:FlnsLL7a
>>226 こういうことでしょうか?
index.htmlを携帯専用のページにする。
そこにenterみたいに書いておき、そこを押すと端末判別CGIへアクセス
PCは自動的にMETA HTTP-EQUIV="RefreshによりPC用のトップページへジャンプ
これでいけませんかね?
もうほっとけよ
はげどう。 そろそろウザイな。
234 :
nobodyさん :03/10/24 22:52 ID:z31/l5rV
くだらない質問かもしれませんが、 エンコード文字列は大文字と小文字どちらがいいでしょうか? またその理由はありますか?
うぐぅ
うむ
238 :
nobodyさん :03/10/26 18:33 ID:5kWFGnGm
@hoge = ("a","b","c", ........); のときに配列hogeの中身の個数は$#hogeで取得できますが、 $hoge{foo} = ["a","b","c", ..........]; のときの個数の取得方法がわかりません 教えていただけませんでしょうか?
240 :
238 :03/10/26 18:59 ID:???
%ENV の値を例えば $ref = $ENV{'HTTP_REFERER'} の様に 他の変数に代入しているスクリプトをよく見掛けるのですが 直接扱うと何か不都合が出たりするのですか?
242 :
nobodyさん :03/10/26 19:51 ID:yMp4BiY6
>>241 %ENVはマジカル(?)なので、アクセスにはコストがかかる。
>>242 横からだが、
$name = $Form{'name'} ;
なんかも同じ理屈なのかな?
俺は他の変数に代入せずに、この場合スクリプト中$Form{'name'} んままで色んな処理をしてた。
そうか、他の変数に代入したほうがいいのか
な?
>>243 それは単に長ったらしいからだと思われ。
俺はそのまま使う。
ENVとは理屈が違うだろうが、 $nameと$From{'name'}なら前者の方がコストは低いだろ。 差が出る程かどうかは知らないけどね。 おそらく誤差の内。
246 :
75 :03/10/26 22:58 ID:???
( ´,_ゝ`)プッ
248 :
nobodyさん :03/10/27 16:06 ID:nNN0idYe
ファイルのアップロードで質問です。 <input type="file" name="file">でsubmitして、 read($file, $buf ,1024)で読みこむ前に、 1個別のcgiをはさんで、$fileをいったんhiddenとかに入れて しまうと、その後read($file, $buf ,1024)としても読み込めない んですか?やっぱりセキュリティの問題ですか?
250 :
248 :03/10/27 17:19 ID:nNN0idYe
>>249 すいませんです。ソースではないんですが、
普通って、こういう感じじゃないですか?
----------------------------------------------------------------------------
(アップロード用form) → submit → (アップロード用cgi)
input type="file" read($file, $buf ,1024)で読み込んで保存
----------------------------------------------------------------------------
こういうことってやっぱりできないのかな・・・と。
----------------------------------------------------------------------------------------
(アップロード用form) → submit → (チェック用cgi)→ submit → (アップロード用cgi)
input type="file" file名はhiddenに保持 (read($file, $buf ,1024)
↑
これはhiddenの値
----------------------------------------------------------------------------------------
わかりにくかったらすいません。。
設計がイマイチ不明だけど一つのフォーム用HTML文書と二つのスクリプトで構成されてるんなら チェックした後にまた同じ内容のデータをそのままUP用のスクリプトにPOSTすれば良いんじゃない? #POSTだとSocket使う事になるんかな…
と言うか素直に同じスクリプト内でチェックとUPをやった方が。 チェック用スクリプトをパスしてあぷされる可能性もあるし。
俺もそう思う。 何のために別CGIを経由する必要があるのかわからん。 設計そのものが根本的におかしいわ。
254 :
248 :03/10/27 18:12 ID:SlWXXNBr
みなさん、ご助言ありがとうございます。 やりたいのは、アップロード先に既にファイルがあるかどうかをチェックし、 もしあればそこで画面表示(onloadで確認ポップアップを表示)して、 OKならアップロード、キャンセルなら何もしない、 という具合にしたくて、別のcgiになってしまいました。
>>248 みると初心者のころがなつかしいな。
担当ごとにcgiつくったりしてたな。
単にファイルがあるかどうかのチェックだけならフォーム自体に ・既にファイルがある場合は上書きしますか? [yes][no] とか書いておいて、デフォルトはnoにしとけば良い。 んでnoの場合はファイルがあればメッセージ出して終了。
257 :
248 :03/10/27 22:43 ID:ASsMVwxc
みなさん、ご助言ありがとうございました。 いろいろとやってみようと思います。 またよろしくお願いします。
258 :
248 :03/10/28 14:43 ID:K2H1LebE
またまた質問です。 ボタン押下でファイルをダウンロードさせる処理を作りたくて いろいろ探したのですが、見つかりません。。 どなたか、参考になるサイトだけでもご存知でしたら教えて下さい。 よろしくお願いします。
>>258 ボタンでcgiを実行する方法がわからんの?
cgiでファイルダウンロードさせる方法がわからんの?
こんにちは。 毎日同じファイルに結果を出力しているのですが、 この出力された結果、そのファイルの8行目の5文字目が 「1」であるか、「1」以外の値であるかを判定し、 「1」であった場合には終了コード0を返し、 「1」以外の値だったら終了コード100を返すような処理を Perlにさせたいと思います。 結果ファイルへの出力はShellをつかっています。 このShellはなんとか作成できたのですが Perlの方がちんぷんかんぷんですミ(ノ;_ _)ノ =3 はじめはファイルを開いてある箇所の値が 「1」であるかどうかを判定するような作りにできるのかと 思ったのですが、そういうものが本にありませんでしたので いろいろ考えて、Whileとかダイヤモンド演算子とかいろいろ 考えたのですが、どうもよくわかりません。 助言など、頂けたら幸いです。 よろしくおねがいします。
ファイルをオープンする 1行読む関数を8回呼び出す 最後に読んだ文字列の5バイト目を取り出す ファイルをクローズする 1だったら0、それ以外だったら100を返す
262 :
nobodyさん :03/10/28 17:25 ID:BgwRsR/1
>>260 #!/usr/bin/perl
my $file = 'results.dat';
print results(), "\n";
sub results{
open FILE, $file or die;
my $ii = 0;
while (<FILE>){
if (++$ii == 8){
if (substr($_,4,1) == 1){
return 0;
}else{
return 100;
}
last;
}
}
close FILE;
}
263 :
258 :03/10/28 17:29 ID:LUu81pN3
>>259 レスありがとうございます。
cgiでファイルダウンロードさせる方法がわからないです。。。
264 :
nobodyさん :03/10/28 17:30 ID:B4GbwbrW
getで&などの文字を使いたいのですが、 どうすればいいのでしょうか? &なので、次の関数と認識されてしまいます。 暗号化するしか手はないのでしょうか?
もし結果ファイルが小さいなら全部配列に入れちゃう sub results{ open FILE, $file or die; my @results = <FILE>; if (substr($results[7],4,1) == 1){ return 0; }else{ return 100; } close FILE; }
>>264 次の関数とか暗号化ってなんだ?
get なら urlencode する
267 :
nobodyさん :03/10/28 17:46 ID:+HFmYMyi
メール送信プログラムで、mimew.plを使用し、以下のようにしています。 $subject= mimeencode(jcode'jis($subject)); 通常は問題ないのですが、全角と半角を混ぜると、その境界に半角のスペース が入ってしまいます。 これの回避策ってあるでしょうか?
>>263 Content-Disposition とか application/octet-stream とかで
検索するといいかもかも
(ブラウザ依存の部分もあるが)
>>267 この辺は微妙。回避できたりできなかったり
ちょっと反則だが、半角もエンコードしてしまう手もある
270 :
nobodyさん :03/10/28 19:01 ID:+HFmYMyi
>>269 そうなんですか。
半角をエンコードする場合は、mimew.plをいじらないとだめですか?
それともオプション指定か何かできるのでしょうか?
といいつつ、とりあえずmimew.plを覗いてみます。
半分アンケートみたいな感じになりますが 年月日の含まれる配列を分割する際、下記のどちらが良いと思いますか? $date = yyyymmdd; $y = substr($date, 0, 4); $m = substr($date, 4, 2); $d = substr($date, 6, 2); $date = yyyy,mm,dd; ($y,$m,$d) = split(/,/,$date); ようは2バイト分ケチるかコードの少ない方にするかって事で
あちゃ、配列じゃなくて変数ですな
もちろん ($y, $m, $d)= $date=~ /(....)(..)(..)/; だな。3回も関数使うよりパターンマッチ1回で取り出す方が 軽い処理の典型パターンだ。
274 :
寝る前に質問・・・・ :03/10/29 01:34 ID:8+bQU5TM
突然ですけど質問です。
<FORM method="POST" action="aaa.cgi">
内容<INPUT size="60" type="text" name="naiyou">
<INPUT type="submit" value="書き込む">
<INPUT TYPE="button" VALUE="戻る" onClick="location.href='
http://www.2ch.net '">
</FORM>
現在↑のような感じで「書き込む」と「戻る」のボタンを別々にし、
「書き込む」を押すと「aaa.cgi」が実行され、「戻る」を押すと指定のURLにジャンプするようになっています。
「書き込む」のボタン一つで「aaa.cgi」と「戻る」の処理を同時に済ますにはどうしたらいいですか?
aaa.cgiで処理後にLocationヘッダを使うか、 JavaScriptでaaa.cgiへの処理と画面変更を同時にやるかだな。
さっそくのレスありがとうございます、 Locationヘッダですか なるほど 調べてみます。 JavaScriptはなるべく避けたいので・・
>>273 意見サンクス。
……あれ(´Д`;)?
別の方法もあったんですね。。
もっと勉強してきまつ。
>>273 試しにベンチしたらsubstr3回の方がパターンマッチ1回より4倍近く速いようだけど?
use Benchmark;
timethese(-5, {
'regexp' => q{
my $date = '20031029';
my ($y, $m, $d) = $date =~ /^(....)(..)(..)$/;
},
'substr' => q{
my $date = '20031029';
my $y = substr($date, 0, 4);
my $m = substr($date, 4, 2);
my $d = substr($date, 6, 2);
},
'unpack' => q{
my $date = '20031029';
my ($y, $m, $d) = unpack("A4A2A2", $date);
},
});
Benchmark: running regexp, substr, unpack for at least 5 CPU seconds...
regexp: 6 wallclock secs ( 5.31 usr + 0.00 sys = 5.31 CPU) @ 227088.29/s (n=1206293)
substr: 6 wallclock secs ( 5.30 usr + 0.00 sys = 5.30 CPU) @ 874551.17/s (n=4631623)
unpack: 5 wallclock secs ( 5.14 usr + 0.00 sys = 5.14 CPU) @ 272898.85/s (n=1402973)
ま、この程度なら好みの範囲か。
システムや条件によってまた違うかも知れないし。
open(FILE, "<$DATAFILE"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; ($day0, $time0, $name0, $honbun0) = split(/<>/, $DATA[0]); print qq(<b>$honbun0 $name0</b><br>\n); ($day1, $time1, $name1, $honbun1) = split(/<>/, $DATA[1]); print qq(<i>$honbun1 $name1</i><br>\n); ($day2, $time2, $name2, $honbun2) = split(/<>/, $DATA[2]); print qq($honbun2 $name2\n); ↑という感じでDATAの中身を3行だけ表示したいのだが、 もっと簡単に出来ないかな?
while(4 > @DATA){ ($day, $time, $name, $honbun) = split(/<>/, $_); print qq(<b>$honbun0 $name0</b><br>\n); }
ごめんウソかいたなんかボケてたごめんお休み。
for (my $count = 0; $count < 0; $count++) { ($day, $time, $name, $honbun) = split(/<>/, $DATA[$count]); print qq(<b>$honbun $name</b><br>\n); }
ごめん$count<3だったなんかボケてたごめんお休み。
useがイマイチ解りません。 $test = test; print "Content-Type:text/plain;charset=UTF-8\n\n"; print $test; sub hoge{ use stric; } とわざとスペルを間違うとエラーが出るので useは何処で宣言しても読み込まれると思っていたのですが、 スペルを正しても$testが未宣言なのにエラーが出ませんでした。 これは解析時にファイル内のuse宣言を全部検索して 読まれるモジュールが存在するかどうかを最初に確認して、 動作時に実際に読み込まれてるのはuseした位置からと言う事なのでしょうか。
285 :
nobodyさん :03/10/29 08:03 ID:FIZrrnqF
use constant { DAY => 0, TIME => 1, NAME => 2, HONBAN => 3, }; my @data = (); for (my $i = 0; $i < 3; $i++){ chomp( my $str = <FILE>); push @data, [ split(/<>/, $str) ] ; print "<b>", $data[ $i ][ HONBAN ],' ',$data[ $i ][ NAME ], "</b><br>\n"; }
286 :
279 :03/10/29 10:22 ID:???
>>282-283 俺も最初そんな感じで書いたんだが、それだと、
一行目の<b>$honbun0 $name0</b>と
二行目の<i>$honbun1 $name1</i>の区別ができなくなってしまうんですけど・・・。
> open(FILE, "<$DATAFILE");
> eval{ flock(FILE, 1) };
> @DATA = <FILE>;
> close FILE;
>
> ($day0, $time0, $name0, $honbun0) = split(/<>/, $DATA[0]);
> print qq(<b>$honbun0 $name0</b><br>\n);
> ($day1, $time1, $name1, $honbun1) = split(/<>/, $DATA[1]);
> print qq(<i>$honbun1 $name1</i><br>\n);
> ($day2, $time2, $name2, $honbun2) = split(/<>/, $DATA[2]);
> print qq($honbun2 $name2\n);
>
> ↑という感じでDATAの中身を3行だけ表示したいのだが、
> もっと簡単に出来ないかな?
>
my @mae = ("<b>","<i>",""); my @ushiro = ("</b><br>\n","</i><br>\n","\n"); for (my $count = 0; $count < 3; $count++) { ($day, $time, $name, $honbun) = split(/<>/, $DATA[$count]); print $mae[$count] . qq($honbun $name) . $ushiro[$count]; }
>261〜265さん お返事どうもありがとうございます。 さきほど解析してみました。 ところが、ひとつ大切なことを忘れていました! 今回使用するシステムに入っているPerlのVerが4なので or演算子が使えないのです(><。) 前にもこれで大変な思いをしたのですが or演算子を使わない場合はどうすればいいでしょうか? Ver古いとすっごく不便〜ヽ (>ヘ<。)
289 :
nobodyさん :03/10/29 11:22 ID:VDpI2HQF
# ボリュームファイルへの書き込みをしたいのですが。 sub make_vol { open (FH,">>vol.log"); @dat = <FH>; if($subject){ push (@dat,"$subject\n"); print FH @dat; } close(FH) } とやるとエラーが出ます。上司に相談したら 一行目に$subject=$_[0];を入れて、 $meke_vol("○");をなんとかかんとかって説明しました。 わかったフリしたけど意味わかりません。 誰か助けて下さい おねがいします。 質問君ですみません
>>288 orじゃなくて || を使えよ。で、優先度が低くなった部分を () で囲む。
マルチはだめ
292 :
286 :03/10/29 13:27 ID:???
>>287 そっか!なるほど!
感動した ありがとう!
>286 ああ良く読んでなかったスマソ。 for (my $count = 0; $count < 3; $count++) { ($day, $time, $name, $honbun) = split(/<>/, $DATA[$count]); template_select($count, $day, $item, $name, $honbun); } sub template_select { if($_[0] == 0){ print qq(<b>$_[4] $_[3]</b><br>\n); } elsif($_[0] == 1){ print qq(<i>$_[4] $_[3]</i><br>\n); } elsif($_[0] == 2){ print qq($_[4] $_[3]\n); } } nagaku nacchimatta
>>279 それだと100万行あったら100万行読み込んでからなので無駄が多い。
open(FILE, "<$DATAFILE") or die $!;
my (@data);
while (<FILE>) { # 1行ずつ$_に読み込む
chomp; # $_の改行削る
push @data, (split /<>/)[3,2]; # $_をsplitした3番目と2番目を突っ込む
last if $. == 3; # 3行目で抜ける ($.は行番号を保存している特殊変数)
}
close(FILE) or die $!;
printf <<'EOM', @data;
<b>%s %s</b><br>
<i>%s %s</i><br>
%s %s
EOM
とか。
自分はHTMLが混ざるときは編集のしやすさを優先している。
ヒアドキュメントに直接変数書かないのはShift_JISをよく使ってるから。
>>289 open (FH,">>vol.log");
@dat = <FH>;
まずこの時点で @datには何も入ってない。
追記じゃなくて、読み書き両用で開いてアレコレするといい。
295 :
nobodyさん :03/10/29 15:08 ID:OrxLlbuu
$a = 1; $b = 2; $mark = "+"; $result = $a $mark $b; print $result; こうゆうのはだめなんですか?
$result = eval("$a $mark $b"); なら・・・
297 :
296 :03/10/29 15:13 ID:???
$result = eval("\$a $mark \$b"); どっちかっつーと、こうだな。
>289 そこだけじゃどんなエラーが出たかわからん。 >295 $result = $a,'+',$b;
299 :
nobodyさん :03/10/29 18:07 ID:TvrHyufP
拡張子が一致するか調べる方法について質問です @ext = ('txt', 'exe', 'dll'); というリストに、拡張子を入れておきます。 次に、ファイル名を取得して、それがリストの中の拡張子と一致するファイルか調べます $itti = 0; $filename =~ /^+.\.(+.)$/; foreach $e (@ext) { if ($1 eq $e) { print "一致\n"; $itti = 1; last; } } if (!$itti) { print "不一致\n"; } しかしこれだと、長いので、正規表現などで簡単に処理できないでしょうか?
join('|',@ext); して正規表現に入れたら?
>>299 txt,exe,dll1を
クラス化すればいいだけ。
302 :
nobodyさん :03/10/29 18:48 ID:FIZrrnqF
use Switch 'Perl6'; my @ext = ('txt', 'exe', 'dll'); opendir DIR ,'.' or die $!; for(readdir DIR){ next if -d; if( m/\.([^.]+)$/){ given( $1 ){ when [@ext] { print "$_ ok\n" } else { print "$_ no\n" } } } else { print "error\n"; } } closedir DIR;
303 :
nobodyさん :03/10/29 18:57 ID:FIZrrnqF
別バージョン my %ext; @ext{ qw/txt dll/} = (1)x2; opendir DIR ,'.' or die $!; for(readdir DIR){ next if -d; if( m/\.([^.]+)$/){ if($ext{ $1 }){ print "$_ ok\n"; } else { print "$_ no\n" ; } } } closedir DIR;
304 :
pu-san :03/10/29 19:48 ID:UA325TTb
先輩がた、お邪魔します。私perl勉強し始めです。次の事が理解できずにいます。 open(FILE,"./numfile.dat"); while(<FILE>){ 処理A; } "numfile.dat"を開いて多分EOFになるまで処理Aが行われる のだと思うのですが、私、whileとは()の中がtrueの間 繰り返されると習ったのですが、これがどうしてtrueなのか 理解できません。 どなたか、教えてください、お願いします。お願いします。
305 :
nobodyさん :03/10/29 20:29 ID:JoCrQXL4
>>304 $_を省略してるから。
while($_ = <FILE>)
<FILE> を $_ に代入することが真(代入できる) である限りという意味。
>>299 my %ext = map{ $_ => 1 } qw(txt exe dll);
$filename =~ /\.(.*)$/;
if ($ext{$1}){
print "一致\n";
} else {
print "不一致\n";
}
>>304 while(<FILE>)はwhile(defined($_ = <FILE>))と等価。
307 :
pu-san :03/10/29 20:37 ID:UA325TTb
>305さん>306さんありがとう、勉強になりましたよ。
$number = $FORM{'number'}; if($numberが4桁の数字ならば){ 処理A; }else{ 処理B; } FORMの中の文字を4桁の数字であるかそうでないかをチェック して処理を振り分けたいのですが、上の場合 「$numberが4桁の数字ならば」の部分をどのようにしたらよいか 教えてください。
$number =~ /^\d{4}$/
>>309 if(length($number == 4)){ #4桁の数字ならば
でいいんでない?
312 :
311 :03/10/30 08:42 ID:???
しまった!数字のみか!!!
朝からボケててスマソ
>>309
314 :
nobodyさん :03/10/30 12:11 ID:ALd71/N8
あるソースに for ($x = 0; $image->[x]; $x++) { $image->[x]->Frame('100x200') if $image->[x]->Get('magick') eq 'GIF'; undef $image->[x] if $image->[x]->Get('columns') < 100; } というのがあったのですが [x] このxはなんでしょうか?変数じゃないし、文字列じゃないし、わけわかりません おしてほしいです
315 :
ぱーらー :03/10/30 13:13 ID:Ml2uH8Nx
open(FILE, "<$DATAFILE"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; foreach $data (@DATA) { chomp $data; ($name, $day, $youbi) = split(/<>/, $data); if($day == 0) { この行を消す。 } } $DATAFILEから読み込みこんだ$numberの中が「0」ならば、 この行を消す、という作業をしたいのですが、 「この行を消す。」の中には何を入れたらいいですか? どなたか教えてください。
316 :
nobodyさん :03/10/30 13:23 ID:AiKLX9Ok
perlの書き方の手本になるようなCGI無料配布サイトってどこですか?
317 :
nobodyさん :03/10/30 13:27 ID:nDwCQoOh
>>315 $DATAFILEがTEXTファイルなら、途中の行を抜くってのはできないから
tempファイルににその行を除いて書き出して、$DATAFILEにリネーム
temp変数ににその行を除いて溜め込んで、その内容で$DATAFILEを上書き、
とかだよ
>>315 foreach (0 .. $#DATA) {
$DATA[$_] =~ s/^[^<>]*?<>0<>[^<>]*?$//;
$DATA[$_] ne "\n" || delete $DATA[$_];
}
open(NEW, ">$NEWFILE");
print NEW @DATA;
close(NEW);
>315 foreach $data (@DATA) { chomp $data; ($name, $day, $youbi) = split(/<>/, $data); 0じゃなければ書き出し }
>>315 コマンドラインから
perl -api.bak -F/<>/ -e "$_='' if $F[1];" < データファイル
まちがい $_='' if not $F[1] ですな まぁファイルに出力するのか操作した配列を続くスクリプトで使いたいのか知らんが @DATA_not_zero = grep{ ${ [split/<>/] }->[1] } @DATA これでもいけるかな
>>323 grep{ (split/<>/)[1] } @DATA
325 :
nobodyさん :03/10/30 17:56 ID:ALd71/N8
>>319 xはどこにも定義されてないのですが、どう言う値を持つんですか?
>>325 配列の添え字って何のことかわかってるの?
327 :
nobodyさん :03/10/30 18:04 ID:ALd71/N8
328 :
nobodyさん :03/10/30 18:30 ID:TlaLgXc6
htmlのフォームから入力されたデータをPerlで受け取りたいと思っています。 送信、プレビューでsubmitボタンを2つ用意したいのですが、受け取り側で どう識別すればよいのでしょうか?
name属性
330 :
nobodyさん :03/10/30 18:40 ID:TlaLgXc6
name属性を使うということは、 <input type="submit" name="post" value="送信"> <input type="submit" name="preview" value="プレビュー"> と感じになるわけですよね。 Perl側ではどちらが押されたかをどうやって知るのでしょう? QUERY_STRINGには表示されないですよね・・・。
for($i; @hairetuの件数; ++$i){ 処理A; } @hairetuの件数分だけ処理を繰り返したいのだが、 @hairetuの件数の部分はどうしたらいい?
332 :
nobodyさん :03/10/30 18:46 ID:TlaLgXc6
>331 @hairetuの要素数は$#hairetuで返りますよ。 というか、foreach使うのがperlっぽいらしいですよ。 foreach $tmp (@hairetu) { print "$tmp\n"; } みたいに。
>>332 @hairetuの 要素数 は$#hairetu + 1 ですよ。
334 :
nobodyさん :03/10/30 18:49 ID:ALd71/N8
335 :
nobodyさん :03/10/30 18:49 ID:TlaLgXc6
336 :
331 :03/10/30 18:54 ID:???
ふむふむ、勉強になります
_ ( .,‐ '´ ヽ-、_ /⌒)i レノノ))) \ヾヽ / ̄ ̄ ̄ ̄ /ヽ './人il.゚ - ゚ノイ|/.ヾヾヽ< みる、みる、みるまらーーー! ゞ ("....( (ヽ ⊂)Yiつヽ) |'ノ | わむてさん、地球! (" "ヽ\.' く _ :|〉ヽ.ヽ| | ノ | '( " ヽ\し'ノ ヽ| |ノ ノ \____ (\ '("ヽ\ |ノ \) '((. " し″
>>334 constantモジュールで作った定数じゃないかな?
>>285 みたいな
違ってたらごめん。
339 :
nobodyさん :03/10/30 19:15 ID:ALd71/N8
>>339 お前ム板にもレスしているだろ。
マルチポストはあっちのスレにもこのスレにも失礼だという基本的なマナーをまず調べてこい。
341 :
nobodyさん :03/10/30 19:23 ID:ALd71/N8
>>340 ム板ってどこですか?
私はここにしかポストしてませんが
342 :
nobodyさん :03/10/30 19:26 ID:nDwCQoOh
@hairetuの 要素数は@hairetuをスカラーコンテキストで評価したら 出るんじゃなかったっけ?
そうだよ
$#hairetuじゃないの?
@array = (1,2,3,4,5); print scalar @array; # 配列の要素数 5 を表示 print $#array; # 配列の最後の要素のインデックス値 4 を表示
347 :
nobodyさん :03/10/30 20:20 ID:ALd71/N8
>>344 それは私の元の文章のコピペですね。
私が書きこんだわけではありません。
>>347 鬱陶しいからさっさと消えてください。マルチがばれた言い訳としてはあまりにも稚拙で見苦しいよ。
だいたいコピペされた元の文章はどこにあるんですか?
351 :
nobodyさん :03/10/30 21:23 ID:ALd71/N8
>>348 マルチしてないよ。
コピペの元の文章は、初心者板の物凄い勢いで答えてくれるスレに書きこみました。
物質とマルチしたってことか。 いちいちマルチポストくらいでごちゃごちゃ言うのもどうかと思うな。
353 :
nobodyさん :03/10/30 21:26 ID:fIsrcUrh
<稲中卓球部読んだことある?「しねしね団」は人類の敵 万病の元(アトピー性皮膚炎) 記憶のカギを握っている。男や女?> これをメールや口伝えで できるだけ多くの人に伝えること
マルチって騒いでるやつもウザイ 消えてくれ
マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ(・∀・)マルチ
これで適当に選んだ誰かの質問をコピペして他のところに貼り付ければ それだけで簡単に荒れることが証明されますた。
結局、ム板じゃなくて初心者板でマルチしてたのか?
まあ、この手の質問スレで2ch内外から適当な質問持ってきてコピペするのは 今に始まったことじゃないけどな。質問書き捨てで反応ないやつは大抵そう。 過疎板を盛り上げたり、他の質問を誘導するために良かれと思ってやってるんだろうけど 真剣に回答してる方からすれば、迷惑千万とまで行かないまでも脱力感に襲われる。
>>358 しかし、
>>314 これにまともな答え付いてないだろ
まともに答えたのにマルチポストされたというのなら、その気持ちもわかるが
答えが欲しい人にとっては、答えが見付からなければ他を当たるのが当然なのでは?
それよりも、はっきりいって2,3行で答えてやれるのに
こんなくだらないことでいちいち長文打ってるやつのほうが激しくうざいと思うぞ。
ま、おれも含めてな。
>>359 >答えが欲しい人にとっては、答えが見付からなければ他を当たるのが当然なのでは?
そして元のスレに移動する旨を明記することも当然です。
361 :
nobodyさん :03/10/31 11:26 ID:UO/mvEtb
>>360 そんなの明記されてないな
もまえはただ煽ってるだけだろ
もまえが一番うぜーんだよタコ
365 :
nobodyさん :03/10/31 11:50 ID:IyRKHOC7
367 :
nobodyさん :03/10/31 11:55 ID:IyRKHOC7
>>366 すいませんm(__)mそちらに書き込みしてきました。
368 :
nobodyさん :03/10/31 14:11 ID:rvfCpErd
質問させて下さい。 perlで、ファイルが存在するかどうか調べる関数って有りますか? C言語のような、access関数が有ればよいのですが そのようなものはないでしょうか? また、関数辞典を調べたのですが、載ってなかったので お願いします。 それから、ディレクトリをオープンするという関数が有る のですが、それはどういう意味ですか? 分かる方お願いします。
>>368 >ディレクトリをオープンするという関数
ディレクトリをディレクトリハンドルに結びつける
>>368 -e $filename とか -e "$dirname/$filename" とか。
-X FILEHANDLE
-X EXPR
-X
というところに色々載ってるよ。
ディレクトリをオープンするというのは
ファイルを読み取るときに事前にファイルを open してファイルハンドルに結びつけるように
readdir, telldir, seekdir, rewinddir, closedirするために
ディレクトリを事前に open してディレクトリハンドルに結びつけるということ(意味わからん)
--------------------------
opendir(DIR, $dirname);
@filelist = readdir(DIR);
closedir DIR;
--------------------------
これで、@filelist にファイルやサブディレクトリの名前が格納される。
372 :
368 :03/10/31 15:01 ID:rvfCpErd
>>370 さん
>>371 さん
おおおおおおお。
こんなに速くレス付くなんて感激です。
ありがとうございます。
試してみます。
本当に有難うございました。
373 :
nobodyさん :03/10/31 16:21 ID:xMzi3M/I
すみません、少々お聞きしたいのですが。 CGIファイルが複数あり、全てにおいて同じ設定ファイルをrequireしています。 そのCGI全てに共通するサブルーチンがあるのですが、 そのサブルーチンを設定ファイルに書いて読み込ませるということは可能でしょうか? 鯖容量がギリギリなのもあって、少しでも削れるところは削りたいのです。
設定ファイルに書いてもサブルーチンだけのファイルを 作ってもサイズは変わらないだろ
>>375 いや今はサブルーチンは本体にそれぞれ書いてるんだろ
377 :
nobodyさん :03/10/31 16:38 ID:KVbtMBnR
open(FILE, "<$datafile"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; foreach $dataf (@DATA) { print qq($dataf\n); } 現在↑のようになってるんですが、 @DATAの内容を上から順に表示するようになっているのですが 逆からprintしたい場合は どのようにすればいいのでしょうか?
378 :
nobodyさん :03/10/31 16:40 ID:xMzi3M/I
>>376 おっしゃる通りです。
全く同じ処理をしているので、明らかに無駄な書き方だと思うのです。
鯖残容量が4Kしかないもので、何とかしたいのです。
設定ファイルのほうに普通にサブルーチン書いて、
呼び出す側で &ルーチン名 で可能なのでしょうか。
>>377 foreach $dataf (reverse @DATA) {
>>378 requireするファイルの冒頭でpackage Hoge;とか宣言しとけば
Hoge::subroutine() でアクセスできる。
>>379 意外と簡単にできちゃうんですね。ありがとう
>>379 氏
パッケージできましたっ
いちいち同じ記述を繰り返す必要なくなったんで、
ソースも相当見やすくなりました。
大変感謝します。ありがとうございました。
383 :
nobodyさん :03/10/31 21:48 ID:6AjH/vm5
>>382 本当ですか…
construct 探したのですが無くて、また悩んでるところでした。
単純にミスだったんですね。どうもありがとう。
なんだ、、ほんとにわからなかったのかよ・・・
CGI設置で困っています。 仕組みの方は理解しているのですが… どうやら配布されているPerlが壊れていて困ってます。 ★★★★★★★★★★★★★★★★★★★★★★★ # ロック解除 # #--------------# sub unlock { rmdir($lockfile); $lockflag=0; } ★★★★★★★★★★★★★★★★★★★★★★★ というPASSをかけるPerlなんですが… rmdir($lockfile); ↑↑ここ という記述がおかしいようです。 どのように直したらよいのでしょう? 教えてください!!
386 :
おねがいします!!! :03/11/01 01:09 ID:AC3D/BaU
CGI設置で困っています。 仕組みの方は理解しているのですが… どうやら配布されているPerlが壊れていて困ってます。 ★★★★★★★★★★★★★★★★★★★★★★★ # ロック解除 # #--------------# sub unlock { rmdir($lockfile); $lockflag=0; } ★★★★★★★★★★★★★★★★★★★★★★★ というPASSをかけるPerlなんですが… rmdir($lockfile); ↑↑ここ という記述がおかしいようです。 どのように直したらよいのでしょう? 教えてください!!
配布されてるものなら、配布元で聞きな。 ここでその部分だけ出されても答えようがない。
>配布されてるものなら、配布元で聞きな。 この手はいいな。
> 配布されているPerlが壊れていて困ってます オモロイな。
おかしいようですったって何を根拠に言ってるかわからん 別に間違ったコードじゃないし まあ、配布されてるものなら、配布元で聞きな。ってことだな
壊れてるperlなんか拾ってくんな。
ここは壊れているインターネットですね。
僕の肛門も壊れそうです!
>>393 . - _
_,..,_ ノ´//⌒ ミヾヽ、_
_____ ,r'´ ``'' - 、ーニ三彡´〃 ! ゙ゞヾ、_`ヽ
[|<|____├{ /´ { l | // ヽ`ーr' }
″ ! `、 ' ノ l. ||l i l / l ああっ、つ、つらいです...
', | ̄``''''ー―- ,'´l l |!` ‐--| l l l
', | l l | リ,! l
', | | | ,! ' リ
,.r''ヽ、 _ ', | |. |
,' ` ' ' ' ' ' ' ´ `ヽ ! | |
/ ,.r'´ ̄ '''''' ─−-........__ ,.r' | '''"''‐-、
~´  ̄ ̄ ̄
すいません、たまたま2chの過去ログで「PurePerl」という言葉を見つけたのですが、 意味が分かりませんでした。 (ググってはみたのですが、全言語対象で、4,960件もあったものの、 「XML-SAX-PurePerl」がどうのこうのみたいな文章ばかりで、 そもそも「PurePerlとは」というようなページが見つかりませんでした・・・) おわかりのかた、教えていただければ幸いです。
>>396 全てのコードが Perl で書かれていること。
部分的に他の言語を使っているモジュールがあるが、こういうのは
インストール時にその言語のコンパイラが必要になる (もしくは
実行時にインタプリタが必要になる) 。
Perl だけで書かれていれば、ファイルを任意の位置へ置くだけで
使えるので、プロバイダの Web スペースなどで利用したい場合に
重宝する。
398 :
nobodyさん :03/11/01 22:04 ID:v4dYhv8t
ApacheのRewriteモジュールでnphスクリプトを利用しようとしたのですが、 なぜかヘッダが下に表示されてしまいます。 どうすればヘッダが表示されなくなるでしょうか? ↓以下コード(nph-hoge.cgi) #!/usr/local/bin/perl binmode(STDOUT); print "HTTP/1.0 200 OK\r\n"; print "Content-type: text/html\r\n"; print "\r\n"; print "<html>\n"; (略)
399 :
396 :03/11/01 23:57 ID:???
>>397 ありがとうございます。
とてもよくわかりました。
>>399 いえいえ、どういたしまして。おやすい御用です。
また、わからないことがあったら、気軽に質問してください。
>399-400の流れに違和感を感じてしまう俺はきっと汚れている。 ヽ(`Д´)ノ
>>401 いえいえ、「きっと」ではなく「完全に」汚れています。
また、わからないことがあったら、気軽に質問してください。
すみませんがちょっと質問させてください。 HTTPレスポンスヘッダを自由に書き換えるcgiを作っています。 が、付加したくないヘッダフィールドまでがついてしまいます。 例えば"Connection: "を付けたくないのに勝手に付いてしまう、とか Dateの時間を操作したいのにサーバー側のシステム時間を強制的に付けてしまう、などです。 これはサーバーの設定によってしまうんでしょうか? だとしたらサーバーの設定を変更せずにプログラムで何とかできないんでしょうか? 知識のある方、どうぞよろしくお願いします。
404 :
403 :03/11/02 15:31 ID:???
申し訳ありませんが、もう一つ。 HTTPリクエストヘッダも自由に書き換えたいんです。 これってcgiで操作できるものでしょうか? すみませんが、よろしくお願いします。
>>403 Perlの質問をコード付きでおながいします。
EUCで書いたスクリプトで use encoding 'euc-jp'; と $hoge = '何か'; decode('euc-jp', $hoge); を一緒に使うと decodeでWide character in subroutine entry at Encode.pm line 154. とエラーがでるのですが何とか一緒につかえないでしょうか? もしかしてそもそも一緒に使うのは的はずれなのでしょうか? ActivePerl5.8.0Build806です。
>>404 主立ったヘッダは httpd が吐きだしていますので、そちらをいぢってみましょうね。
>>406 use encoding 'euc-jp';
$hoge = '何か';
この時点で '何か' は utf-8 になっています。
decode('euc-jp', $hoge);
これは、$hoge を euc-jp の文字列であるとみなして
utf-8 に変換した文字列を返す処理です。
その使い方はちょっと変ですね。
410 :
406 :03/11/02 20:58 ID:???
>>407 ,409
ありがとうございます。
no Encode;
decode('utf8', $hoge);
と書いてみましたが、今度は
Cannot decode string with wide characters at Encode.pm line 154.と怒られました。
白状しますと本当はfrom_to()で$hogeを一時的にshiftjisにしたかったのですが、
from_toの中のdecodeを呼び出してるところでエラーがでるのでこのような質問をしました。
409さんのおっしゃる通りEncodeについて全然分かってません・・・。
utf8で扱ってるならfrom_toは無意味ですね・・・。
ということは
$query = "2チャンネル";
$r_query = reverse($query);
で$r_queryが「ルネンャチ2」になるのと、
$url ="
http://www.google.co.jp/search?q= ".$query."&hl=ja&lr=lang_ja&ie=ShiftJIS&oe=eucjp&num=5";
$ua = LWP::UserAgent->new(agent => 'agent');
$page = get($url);
で$queryにshiftjisで文字列を渡すのを両立するには
スクリプトをshiftjisで書くしかないのでしょうか?
411 :
406 :03/11/02 21:12 ID:???
>>410 の付けたしです。
no Encode;
decode('euc-jp', $hoge);
だとWide character in subroutine entry at C:/Path/Perl/lib/Encode.pm line 154.
で変わりませんでした。no Encodeが効いてればできそうな気がするのに。
それにしても最初から410の質問すれば良かった・・・。
>>406 こうやったら出来ました。
use encoding 'euc-jp';
use Encode;
require './lpw_func.pl';
# use encoding 'euc-jp' の効果が LWP::UserAgent に伝わると
# uri escape が出来なくなるので、
# LWP::UserAgent を使う関数は別ファイルにする。
$query = "2ちゃんねる";
$r_query = reverse $query;
print "$query\n$r_query\n";
$sjis_query = encode('shiftjis', $query);
$page = get_page($sjis_query); # ./lpw_func.pl
print $page->content;
no Encode は要りません。
sub foo{ return($a, $b, $c); } \&foo(); と sub foo{ return(\$a, \$b, \$c); } &foo(); では結果が同じですが、どちらでも支障が無い場合どちらの方が好ましいですか?
そうだったのですか。 コードのベンチマーク取る為に { my $time_start = time(); code; my $time_end = time(); &myprint(&myscript::myBenchmark(\$time_start, \$time_end)); #本当はcode名(適当)とかその他諸々渡してブロック毎のベンチを出力したり。 } sub myprint{ print 'time(sec): ',$$time,"\n"; } package myscript; sub myBenchmark{ my($time_start, $time_end) = @_; my $time = $$time_end - $$time_start; return(\$time); } とかやってたのですが、 return($time)にして\&myscript::myBenchmark()としても同じだったので どちらが良いのかと思った次第でしたのです。 どちらも好ましくないのなら別の方法を模索してみます。
>>415 質問に対して質問するのもなんだけど、リファレンスを使っている意味は何ですか?
効率が良くなると聞いたので使って支障が無いところは使おうかくらいの意味です。 それにまだリファレンスがどう言うものかあまり解ってないので練習も兼ねて…。 #まだリファレンスは変数の位置である程度の意味しか。
>>413 違いがあるよ。
前者はリファレンスをリスト化して返す。
後者は値をリスト化して返して、そのリファレンスを取る。
後者は値がコピーされるので、アドレスに違いが出る。
foreach(<FH>)とwhile(<FH>)ってどちらが良いっスか? 一般的にはwhileが使われているっぽいけど、 foreachは何も考えずに回すと聞いたので 真偽判定のあるwhileより早そうな気がするのですが。
foreachの場合、 @_ = <FH> foreach(@_) と同じような無駄な処理にならなかったっけ?
>>419 foreachで回す場合,一度全部メモリー(と言うより配列)にぶち込むのでおそらく鈍い。
while(<FH>){next if ($_ eq $a);}
なら、$aの内容があった時点でファイル読み込みを中止。(最後にあれば無意味)
一応、説明しておくが、
while(<FH>)は、while($_=<FH>)と同じ。
<**>という形は、ファイルから一行ずつ取りだしているので、最低限の処理で済む。
かなり端折ったが分かった?
>>419 以下、寝言。
100kぐらい今のサーバなら朝飯前だろうし、foreachでも良いような気がする。
なるほど…それはちょっとメモリ喰うのが嫌っすね。
レスしてる間にもう一つが。 whileの仕組みについては知ってましたがforeachの方は知らなかったんです。 大体解ったのでファイル読むときは無難にwhileを使う事にします。
質問です。 Win2000 + ActivePerl5.6です。 $datadir = 'C:\Documents and Settings\Administrator\デスクトップ\データ/'; open OUT, '>' . "$datadir$filename.txt" or die ; print OUT $data; close OUT ; これでファイルを書き出す事はできるんですが、 opendir DIR, "$datadir"; while ($_ = readdir DIR){ push @filelist , $_ ; } close DIR; これでファイル一覧を取得する事が出来ません。 なぜでしょうか?
/
単に$datadirがディレクトリ名を指してないからなんでないの? 要は、ケツの/が余計。面倒がらずにエラー処理ぐらいしとけ。
返事になってないけどどうせ配列に入れるのなら my @filelist = grep((!m/^\./), readdir(DIR)); で良いのでは。
↑grepはお好みで。
みなさんどうもありがとうございます。 解決しました。 書き出しと読み込みのスクリプトは別物で、書き出しの文字コードがSJISで、読み込みの文字コードがEUCだったという事が原因だったようです。 SJISにしてみたところ無事読み込む事が出来ました。 が、読み込みのほうはどうしてもEUCで書かなくてはならないため、どうしようかと考え中です。
やりたい事を書いて渡すと最適なコードが返ってくる関数が欲しい。
>>430 おお、考えてくれや。きっとノーベル平和賞確実だ。
すみません、ヒントを下さい。ちなみに、初心者です。 あるキーワードをCSVファイルから検索して表示するのを作ってるのですが、 1つのファイルを検索するのは作れたのですが、複数のファイルから同じキーワードをもつ レコードを検索するにはどーすればよいですか? その場合、検索されるファイル名は File001.csv File002.csv とか連番にした方が 作りやすくなりますか? また、ファイル名に変数を入れてOPENとかできるんですか? File+$number.csv とか? ※わかりずらくてすみません。
>>432 俺は、1行おきに書く奴には教えたくない。
>>427 それはダメだろ。
m/^\./
じゃなくて
m/^\.{1,2}/
だ。Windowsでも.(ドット)で始まるファイルは存在する。
初心者ですって最初に付けるのも(略 何で自分が初心者だとアピールしたがりますか。 そもそも初心者質問スレって書いてるのに。 検索方法が同じなら単純にループでも使って順番に開いて同じ事やれば良い。 自鯖使えてメモリとか気にする必要無いのならファイルを最初に全部結合してやっても良い。 連番にするかどうかは管理がし易くなりそうならそうすれば良い。 ファイル名に変数を〜てのはやればわかる。
>>432 俺は初心者という免罪符を振りかざして
初心者に教えるのは当然だと主張する奴には教えたくない。
>435-436
ケコーン
>>434 悪ぃ最初書いたときドットファイルは必要が無ければ隠して置けという
言葉を思い出してしまって…。
438 :
406 :03/11/03 22:45 ID:???
>>412 ありがとうございます。
返事が遅くなってすみませんでした。
参考にして頑張ります。
(´-`).。oO(/^\.{1,2}$/ の方がよいかと思うけれども。。。)
>>424 ちなみに、grepは
>>439 氏を採用.
require 'jcode.pl';#jcode.plライブラリ使用.
my $datadir = 'C:\Documents and Settings\Administrator\デスクトップ\データ/';
&jcode::convert(\$datadir,sjis);
opendir(DIR), "$datadir";
my @filelist = grep((/^\.{1,2}$/), readdir(DIR));
close(DIR);
これだと、2bit文字列のファイルを扱うときは無茶苦茶不便なので、
$datadirに16進数を使うのが一番良いと思う。色々面倒だが。
>>440 やっぱりこれは色々とまずいから没。なかったことにしといてくれ。
>>439 失礼。そう書いたつもりだった。訂正どうも。
環境変数をperlで書き換える事ってできますか? よく参考書とか解説ページには環境変数を参照するやり方は書いていますが 書き換える方法は書いてないですよね。 やり方知ってる方いらっしゃいましたら、教えてください。
書き換えるってどうしたいんだ。 local $ENV{'KEY'} = 'hoge'; とか?
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
>>454 子プロセスといっても、%ENVを書き換えてまで書き出す必要があるものですか?
my $test = "hogehoge";
if (fork == $pid) {
print '親! $testの内容'.$test."\n";
} else {
print '子! $testの内容'.$test."\n";
}
どちらも、$testの内容は全く同じです。ついでに、myを宣言しなくても多分ok
456 :
455 :03/11/04 18:05 ID:???
ちなみに、スクリプトの動作保証はなし。
457 :
nobodyさん :03/11/04 22:07 ID:Ko4sdUoh
あっそ。
461 :
75 :03/11/05 01:39 ID:???
置換演算子の中などで全角の「ー」対象に使うとエラーがでます 通常は\で回避するんですがそれも効きません どうしたらエラー無くコードできますか?
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
471 :
432 :03/11/05 06:36 ID:???
>>435 ありがとうございます。
ファイルは結合したものを検索すると重すぎてエラーになるんです。
だから分割でどうにかならんかと思いまして…。
また、検索されるファイルは月一の割合でだんだん増えていくという
のもありまして・・・。
※ファイル名に番号をつけたものでやってみます。
と言うかreaddir(月イチなら手動でも良さそうだけど)でファイル名を配列に居れるとかして foreach my $file (@filelist){ open(<FILE>, $file) || print '開けねー'; 検索とか結果の保存とか } じゃ駄目なの。 まあ連番なら一々リスト作らず順番にファイル読んで 開けなくなったら止めるとかでも良いけど。
何かのログファイルを更新する時にwhileで読んで書き出す方法を取る場合って 読む -> 別のファイルに書く -> 読んだファイルを消す -> 書き出したファイルをリネーム で良いですか? 普通はどうやってるのか気になって。
神!
>>473 別ファイルに書き出すかは一概には言えない
サイズが問題なければ変数や配列に保持しておいてもいいし
どっちにしても上書きすれば読んだファイルをわざわざ消すこともないだろう
>>477 同時アクセスでのファイルの破損を心配してるんじゃない?
完全なロック処理は難しいので、安全のために
>>473 の対策を施したりする。
ファイルの利用目的や、どの程度まで堅牢性を求めるかにもよる。
質問者じゃないが一旦別ファイルに書き出さないと例えば open(FILE, '+<logfile.dat'); while(<FILE>){ (処理) print FILE $_} とかやると壊れるんじゃないの? #自分は面倒なので配列に入れるけど
whileループ内では当然できないね
>473は読む -> 書く の話。 読みつつ同じ場所に書く処理は高確率でというかほぼ間違いなくファイルがヌっ壊れる。 配列に丸ごと突っ込むのって予想以上に時間がかかるのな。 掲示板のログ程度の大きさでも体感で分かる程度の差が出てくる。
ロック処理は難しくない。書き出し処理の途中でプロセス死んだりして壊れる事がある。
>>473 サーバがUNIXならリネームすれば元のファイルは削除してくれる。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
substrで文字列を分割した場合、offsetに全角文字の1バイト目を 指定した場合、その文字は化けてしまいます。 それを回避する良い方法はないものでしょうか。 全角文字は第1バイト・第2バイトとも0xA1〜0xFEなので、どうして も良い案が浮かびません。 どうかご教授ください。宜しくお願い致します。
493 :
483 :03/11/06 12:04 ID:???
なにやら話が色々な方に進みそうですがログは配列に入れるよりも
一行ずつ書き出した方がメモリ喰わなくてサーバに優しいと言う話を聞き
最近そういう仕様にしたわけです。
で、そういう風にする場合は一般的にどうするのかとちょっと気になったので聞いてみた次第です。
>>482 削除するファイルは読み込み元のものです。
log.datを読み出して作業後logxxxxxx(time()で取ったのをそのまま).datに書き出し、
log.datを消してlogxxx略.datをlog.datにリネーム。
もしかしてlog.datを消さなくてもリネームすれば上書きしてくれると言う意味でしょうか。
>>493-494 ちょろっとテストコード書いて試せば分かる事じゃん…。
-f (my $data_file = './log.dat') or die "No such file: $data_file";
-f (my $lock_file = './log.lock') or die "No such file: $lock_file";
my $new_line = 'blah, blah, blah...';
open LOCK, '>' . $lock_file or die $!;
flock LOCK, 2;
open LOG, '<' . $data_file or die $!;
my $tmp_file = $data_file . '.tmp';
open TMP, '>' . $tmp_file or die $!;
print TMP $new_line;
print TMP $_ while <LOG>;
close TMP;
close LOG;
rename $tmp_file => $data_file or die $!;
close LOCK;
>>491 JPerl を使えるであれば、split(//, $str) で$str 内の日本語
コードの1文字ごとの配列が得られるが。
ファイルの読み込み、書き出しについて質問です。 友人がテキストカウンタを作ってくれたのですが、気にかかることがあります。 sub logopen { #ログファイル定義 $file = "count.dat"; #ログファイルの配列区切り文字 $splittag = "<>"; #ログファイルオープン open(COUNTERFILE,"<$file") || die "can't open"; #ループ処理 while($line=<COUNTERFILE>) { $line =~ s/\s*$//; #区切りで各要素を配列に埋め込む ($icounter[$i],$icounter[$i]) = split(/<>/,$line); } #ログファイルクローズ close(COUNTERFILE); } ※ここでHTMLで$icounter[$i]を表示
sub logclose { #ログファイル定義 $file = "count.dat"; #カウンタ値を増やし、次回表示時の値にする $icounter[$i]++; #ファイルオープン open(COUNTERFILE,"+< $file") || die "can't open file"; #ファイルをロック flock(COUNTERFILE, 2); #ファイルポインタを先頭に移動 seek(COUNTERFILE, 0, 0); #ログファイルに書き出す print COUNTERFILE $icounter[i]; print COUNTERFILE $splittag; print COUNTERFILE $icounter[i]; print COUNTERFILE "\n"; #ファイルクローズ close(COUNTERFILE); }
ログファイルを見るとカウンタの数値がnnnnnn<>nnnnnn[改行]となっています。 <>で区切ってそれを読み込んでいるのでしょうが、 同じ値を読んでいるので、無駄な処理だと思います。 ログファイルに残す数値はnnnnnn[改行]としたいのですが、どのように書いたらいいのでしょうか。 下のサブルーチンではログファイルに書き出すprint4行の真ん中2行を削ればいいと思うのですが、 上のルーチンの変更の仕方がよくわからないのです。 ※改行制限にひっかかり3つに分けさせてもらいました。
その友人に聞きなさい。 なぜ作った本人に聞かないの?
>>499 ログのフォーマットだけ直したって他のルーチンがログを
扱うとき影響出るだろ
なぜそういう仕様にしたのか作ってくれたやつに聞けよ
もしログを操作するのがそのサブルーチンだけならば、 まずログのフォーマットをnnnnnn[改行]てのに直して、 でprintのいらんとこを消すのは合ってる。 区切りの<>の定義もいらん。 #区切りで各要素を配列に埋め込む てとこを、ログの文頭から一行読み込むようにすりゃいいんじゃないかと。
なんつーか、
>>500-501 は「自分の知識が全く足りていないため貴殿の質問には答えかねます」って書けばいいのにねぇ。。。
釣りかよ。
ログ形式変えたらバグりました、とか質問してきたら笑える。
そういう仕様なんだからおかしくなってもしょうがないだろ。
知人もよく分かっていないに一票。
っていうか、$icounter[i];でいいのか? i で
@test = (); @test[2,3,5] = (1,1,1); の状態で、 $test[2] -> 1 $test[3] -> 1 $test[4] -> 0 $test[5] -> 1 と表示させたいのですが、やり方がよく分かりません。 for ($i = $min; $i <= $max; $i++) { hogehoge } とすればできそうなのですが、$min(この場合は2)と$max(この場合は5)の取得の仕方を教えて 頂けないでしょうか。よろしくお願いします。
for ($min=0; !$test[$min] && $min<@test; $min++){}
>>510 ! には気が付きませんでした。勉強不足を反省します。
ご教授ありがとうございました。
何が言いたいねん。
516 :
nobodyさん :03/11/07 20:36 ID:GeL1C6fm
質問です。 for($ii = 0; $ii <= 10; $ii++){ print qq($FORM{'name_0'}←0の場合<br>\n); print qq($FORM{'name_$ii'}←「$ii」の場合<br>\n); } ↑で$FORM{'name_0'}と「」の中の$iiは表示されるのですが、 $FORM{'name_$ii'}には何も表示されません。 何故ですか?
シングルクオートだから
518 :
nobodyさん :03/11/07 21:01 ID:GeL1C6fm
>>517 あ、そっか、ありがと。
ボケてた・・・。
519 :
nobodyさん :03/11/07 21:24 ID:fKcaRVq2
HTML::Template;を使いたいのですが 使えないサーバで使うにはどうしたらいいのでしょうか?
520 :
nobodyさん :03/11/07 21:38 ID:fKcaRVq2
解決しました
使えないサーバは、使えないから使えないサーバであって 使えないサーバで使えれば、それはもはや使えるサーバであって
使えないサーバで使えるようにするにはどうしたらいいのでしょうか?
どうしても使えないなら自分がパトロンになって資金提供してシステム変更させるのが良いと思うけど。 まあ俺なら使えない鯖使うよりは有料レン鯖でも借りるが…
自宅鯖マンセー
ソースコード入手してperlスクリプトに書き起こせ。
526 :
nobodyさん :03/11/08 12:08 ID:g9GLW02C
527 :
nobodyさん :03/11/08 13:14 ID:kANJ1och
for($ii = 0; $ii <= 100; $ii++){ print qq($FORM{"name_$ii"}\n); if($FORM{"name_$ii"} eq ""){ $ii = 100; } } ↑現在、フォームから空のデータを受け取ったらループを終了する ようにしているのですが、空のデータが来ても、残りのフォームに データが存在すればループを続けるようにするにはどうしたらよい ですか?(残りが無くなった時点で終了したい)
>>527 ループを終了させる条件を残りのフォームが空かどうかで
判断すればいいだろ
ループ終了が$ii = 100;か・・・
529 :
nobodyさん :03/11/08 13:37 ID:kANJ1och
>>528 そうなんですけど、それがわからないです・・・・
>>529 多少へんだけど自分でもう書いてるじゃないか
「残りのデータが存在すれば続ける」ってことは$FORM{"name_$ii"}が
空かどうかは関係ないわけだろ
for($ii = 0; $ii <= 100; $ii++){
print qq($FORM{"name_$ii"}\n);
if($FORM{"nokori"} eq ""){
$ii = 100;
}
}
ところでこの方法では$ii = 100で最後にもう一度だけ
print qq($FORM{"name_$ii"}\n); になるわけだがいいのか?
即座にループ脱出するなら last を使うことも考えよ
print qq($FORM{$_}\n) while ( sort(keys %FORM) );
そういう意味なのか・・・?
533 :
531 :03/11/08 13:58 ID:???
すまん、531は忘れてくれ
534 :
531 :03/11/08 14:05 ID:???
print qq($FORM{$_}\n) foreach ( sort(keys %FORM) ); こっちだった
ああ、空のデータ混じりのを最後まで全部出力したいわけか 元質問を読み取れなかった
536 :
nobodyさん :03/11/08 15:17 ID:eSCTpmQP
携帯電話のipアドレスを正規表現で表現し、 携帯端末とそれ以外の処理を分岐させたいのですが、 どのように書けばよいのかわかりません。 まず正規表現がからっきしわからないんですが、その前に下のスクリプトで 正規表現さえあっていれば動くのでしょうか? $ip = $ENV{'REMOTE_ADDR'}; if (($ip =~ /^「docomoのipアドレスの正規表現」/) || ($ip = /~「jフォンの…」/) || ($ip =~ /^「ezweb…」/) { 携帯処理 } else { PC処理 }
↑間違えました 「^」→「~」
すいませんコピペミスってめちゃくちゃでした $ip = $ENV{'REMOTE_ADDR'}; if (($ip =~ /「docomoのipアドレスの正規表現」/) || ($ip =~ /「jフォンの…」/) || ($ip =~ /「ezweb…」/) { 携帯処理 } else { PC処理 }
>>539 レス有難うございます。
実はもともとUAで分岐させてるスクリプトを
ipで分岐させようとあがいてるんです。
理由はUAは軽く偽装されるからです。
スレ違いっぽいんで、正規表現スレ行ってきます。
ホスト名で振り分けね。 IPはどうか知らない・・・ 単純に $hua =~ /「ezweb.ne.jp」/ とか、そんな感じでいいんでね?
~ s/.*:.*\\//; これどういう意味ですか?
$_ =~ s/.*:.*\\//; の結果に単項~演算子(ビット反転演算子)を適応させる
545 :
nobodyさん :03/11/08 23:32 ID:kANJ1och
自分のサーバーから
http://www.2ch.net/index.htmlを読み取ろうとして 以下のように書いた(全文)のですが、Internal Server Errorが出て表示されません。
どのようにしたらよいですか?
ちなみに属性は「755」です
#!/usr/local/bin/perl
$addr = (gethostbyname("www.2ch.net"))[4];
$name = pack("S n a4 x8", 2, 80, $addr);
socket(S, 2, 1, 0);
connect(S, $name);
binmode(S);
select(S); $| = 1; select(stdout);
print S "GET /index.html HTTP/1.0\r\n\r\n";
while (<S>) { print; }
close(S);
exit;
>>545 2とか1とかマジックナンバーは使うなよ
548 :
nobodyさん :03/11/08 23:58 ID:LZYge64t
>>545 CGIとして実行してるんじゃないよな・・・
>>545 Internal Server Errorって事はCGIで実行って事だな。
それくらい解決できない奴がsocket使うのは100年早い。
クロスサイトスクリプティングって知ってる?
550 :
545 :03/11/09 00:21 ID:yHJs6GW9
>>546 の「ネットワークプログラミングの基礎知識」を読んでいます。
>>549 クロスサイトスクリプティング知らないです。
CGIで実行です。何で実行すればよいかもわからないです。
教えてくださる方がいれば教えてください。
自分はもうちょっと修行を積んできます(汗
簡単な本を一冊買え。 いくらなんでも1から10までここでは教えてられんぞ。
552 :
545 :03/11/09 00:34 ID:yHJs6GW9
>>551 どんな本がいいですかね?
perlでチャットや掲示板などは作れるレベルなんですけど。
>552 そのレベルの人間は>545みたいな事はしない。 配布BBSのレイアウト変えるのが関の山だろ。
555 :
545 :03/11/09 00:41 ID:yHJs6GW9
>>553 ありがとう。さっそく見てみます。
ちなみに教えてくださったみなさんはperl歴どれくらいで
一日どれくらいPerlをやってるんですか?
556 :
nobodyさん :03/11/09 00:43 ID:PjVBBBG5
use HOGE; $hoge = new HOGE; $hoge -> hogehoge(); とするのと require 'HOGE.pl' HOGE::hogehoge(); とするのでは速度とかになにか違いはあるのですか?
use HOGE; $hoge = HOGE -> new();; $hoge -> hogehoge(); とするのと require 'HOGE.pl' HOGE::hogehoge(); とするのでは速度とかになにか違いはあるのですか? でした。
>>557 というか、上下でそもそも意味が違うと思うんだけど。
処理に内部状態があって(たとえばバッファと読み込み位置とか)、それを複数同時に持たせたいのなら、
上のようにするしかない。
ところで
>>556 と
>>557 で何か違いがあるのか?
#!/usr/local/bin/perl $addr = (gethostbyname("www.2ch.net"))[4]; $name = pack("S n a4 x8", 2, 80, $addr); socket(S, 2, 1, 0); connect(S, $name); binmode(S); select(S); $| = 1; select(stdout); print "Content-type: text/html\n\n"; print S "GET /index.html HTTP/1.0\r\n\r\n"; while (<S>) { print; } close(S); exit;
561 :
nobodyさん :03/11/09 16:45 ID:u8zLSrFT
use HOGE; は、次のコードと等価です。 BEGIN{ require HOGE; import HOGE LIST; } これにより、requireで指定したモジュールは実行時に評価されることになり、 実行時にメモリにロードされるコードが少なくなるので、 速度的にはrequireのほうが速いと思います。
> 速度的にはrequireのほうが速いと思います。 んなこたぁない。やってることは同じ。 ただ、実行しない可能性のあるルーチンが含まれる場合は実行時のrequireの方が速く見えることもある。
563 :
561 :03/11/11 00:49 ID:???
564 :
コワゴワ :03/11/11 03:08 ID:qKXu7toq
set-cookieした直後に、(CGI::Cookie 使ってます) cookieを食べたか判定して [食べた/食べて無い] で違うLINK先にリダイレクトさせたいのですが ヘッダを出力してしまっているので、Locationが使えません。 現在は、続けてHTMLのMETAを書き出してそれでリダイレクトしていますが こんなん駄目ですよね。。。 一つのファイルの中でcookieを喰わせた後に リダイレクトするスマートな方法はあるのでしょうか? 諸先輩方、御教授の程、よろしくお願いします。m(__)m
>>532 >set-cookieした直後に、(CGI::Cookie 使ってます)
>cookieを食べたか判定して
その判定できなくないか?
JavaScriptならできるのかもしれないけど
CGI:CookieがどんななのかわからんがFormでsetするかどうかを選ぶんなら スクリプトの先頭にでもクッキー食ってるかどうかチェックして振り分けるルーチンを用意するとか。 ページにアクセスした瞬間に食わせるんならセットした後で もう一度クッキー吐かせてちゃんと食えてるかどうか調べて振り分けるとか。
質問致します。 アンケートのCGI(アンケート自体はhtmlの入力フォームを利用、 アンケート結果はCSVに貯める)なのですがアンケートに答えてくれた方の 時間のデータを吐き出す設定がわかりません。 sub saveData{ open(FH,">>enquete.csv"); # アンケートデータ保存file 追加書込みopen #flock(FH,2); print FH "アンケート結果\n\n------------------------------------------\n\n"; #flock(FH,8); close(FH); 一応、こちらがアンケート結果を出力するデータです。 どなたかご教授願います。
時間の取得方法くらい結構何処にでも載ってるぞ。 my($sec, $min, $hour, $mday, $mon, $year, $wday, $dmy, $isdst) = localtime(time()); $wday = ('sun','mon','tue','wed','thu','fri','sat')[$wday]; とりあえず日本の鯖ならlocaltime()使って 後は戻り値をsprintf()で整えるなり文字列連結しちゃうなり何なりで良いようにすればいい。
strftime ってあんま使わないのか? おれ使いまくり
570 :
コワゴワ :03/11/11 12:48 ID:qKXu7toq
>>565 いちおうこんな感じでCookie食べさせ&読込みが出来てます。 (これは要点だけ取り出したものですが動いてます。)
最後のリダイレクトの部分を鯖側からコントロール出来ないかなぁ。。。というところなんです。
#!/usr/bin/perl
use CGI qw/:standard/;
use CGI::Cookie;
### クッキーセット
$cookie1 = new CGI::Cookie( -name=>'AAA', -value=> 'BBB');
print header( -cookie => $cookie1 );
### クッキー読込み
if ( %cookies = fetch CGI::Cookie ) { $value = $cookies{'AAA'}->value;}
### クッキー有る無しでトビ先変える
if ( !$value ){ $link ="
http://www.yahoo.com/ ";}
else { $link ="
http://www.yahoo.co.jp/ ";}
### HTML出力しメタタグでリダイレクト
print <<HTML;
<HTML><head><title>jump</title><META HTTP-EQUIV="Refresh" CONTENT="0; URL=$link"></head>
<body> </body></HTML>
HTML
exit;
>>566 実際はこのスクリプトの頭で、2つクエリ(id,passward)を会員DBと照合しています。
登録されているならidのみをCookieに喰わせてTOPページへリダイレクトするようにしたいのです。
TOPページは静的かつ、JAVASCRIPT OFFでも見れないといけないので、そこではCookieを食べてるかチェックが出来ません。
私は無茶を言っているのでしょうか。。。( ^^;
>>572 最後の出力、もう一個 CRLF 要る。
574 :
コワゴワ :03/11/11 14:35 ID:qKXu7toq
遷移図の正式な書き方を知らないのでこんのなしかかけませんが。。。 ─(他のサイトからアクセス)→ [クエリ取得 (ID,passward) ] → [会員DB照合] → ─┬─(登録済)→ [CookieにIDをset] → [CookieからID取出し] → └─(未登録)→ [エラー表示] ─┬─(ID在り)→ [TOPページへリダイレクト] ───→ [TOPページ(静的html)] └─(ID無し)→ [エラーページへリダイレクト] 【要件(?)】 提携サイトからのバナーリンクにクエリでID,Password(というかkeyですね)をしこんでもらい こっちのサイトに入ってくる時にそのIDをもったCookieを喰わせる。 その後、サイト内のFORMから申込みしてもらう際に、 このCookieからIDを取り出して一緒にデータを送信し、 どの提携サイトから来た人なのかを判定する。 ということがしたいんです。 説明すればする程、意味不明ですかね...(:;)
575 :
コワゴワ :03/11/11 14:42 ID:qKXu7toq
>>572 書き込みしてる間にレスいただいてたみたいですみません&ありがとうございました。
でも、私の書込みは場違いなようなので別の板に移ります。
書いていただいたスクリプトは1つにまとめても動きますでしょうか?
できれば1ファイルで完結したいんです。。。
(これから自分で試してみますが^^)
577 :
コワゴワ :03/11/11 15:07 ID:qKXu7toq
>>576 私どうしようも無いですね。
皆さんありがとうございました。
修行に逝ってきます!
PerlでWindowsのコマンド(DOS窓から入力するやつです)の使い方を教えて下さい。 あとLinuxもお願いします
>578 「perl open パイプ」で検索してみろ。
581 :
580 :03/11/11 18:04 ID:???
open (FH,"ここにDOSプロンプトへのフルパスとコマンド|"); でよろしいのでしょうか?
自分で考える脳は持ち合わせていないのか。 可哀想な奴。
>580-581 ローカルでテスト環境を作ってそこでテストしろ。 やり方は自分で調べろ。
PCが爆発したら怖いので、人に確認してからじゃないとできないのです。
2chで質問するとPCが爆発するから、質問はしないほうがいいぞ。
本当はテスト環境としてLinuxマシンでも欲しいんだけどなあ… Winはミスった時に強制終了効かなくなるのが駄目ぽ(サーバモデルは知らんが)。
587 :
コワゴワ(ニコニコ) :03/11/11 19:38 ID:qKXu7toq
>>576 事後報告ですが、単純にヘッダをCGI::cookie使わずに
set-cookie,locationと連続して書いたら上手くいきました。
でも、私の問題はもっと根源的な物ですね。
はやく『ググル&コピぺ偽プログラマ』から脱皮出来るようにきちんと勉強します。
もう一度、お礼を言いたくて来ました。
ありがとうございました。(^-^)/
>>586 デュアルブートにすればいいじゃん。ハードディスク容量が余ってればほぼ0円でできる。
デュアルブートは書きながら他の事やりたくなったとき イチイチ起動ささせ直さないといけないのが面倒じゃない。
んじゃ、cygwinでも入れろ。
591 :
567 :03/11/11 22:36 ID:???
あ、すいません。ちょっと修正致します。 アンケートのCGI(アンケート自体はhtmlの入力フォームを利用、 アンケート結果はCSVに貯める)なのですがアンケートに答えてくれた方の 時間のデータを吐き出す設定がわかりません。 ↓ アンケート書き込み時間のデータをCSVに記録する設定がわかりません。 です。昼間はネット接続の環境がありませんので亀レスみたいな形で再度質問 致します。宜しくお願い致します。
>591 時間の出し方はわかるよな? (わからなきゃlocaltimeでぐぐれ) それを保存するだけ。
ボクPerlとくいね。 文字の表示なんてprint関数使って自由自在だよ。 他にもいろいろできるね。 ファイルから読み込んだりもできるし
とりあえず、きょうは @echo off set str = | type text.dat %str% まで覚えた。
BATファイルか、懐かしいな
596 :
nobodyさん :03/11/12 08:00 ID:/t7032BF
バッファのフラッシュについて教えてください。 以下スクリプトをanhttpd + ie6 で実行すると 一回目はsleep後にstartとendが同時に 表示されてしまいます。 2回目以降やコマンドラインからは start表示->sleep->end表示となります print "content-type: text/html\n\n"; $|=1; print "<p>start</p>"; sleep 10; print "<p>end</p>"; 環境はXPのActivePerl5.8 IE6 ANhttpdです。 ブラウザの挙動? 1回目だけだめってのが納得できんのです。 よろしこ
>>596 "<p>start</p>\n" ならどうよ?
598 :
596 :03/11/12 11:12 ID:kIqo0dHN
>>597 print "content-type: text/html\n\n";
$|=1;
print "<p>start</p>\n";
sleep 10;
print "<p>end</p>\n";
でも一回目のアクセスでは10秒間読み込みマークのあと
まとめてstart endと表示されました。
コマンドラインではstart表示->10sleep->end表示いけました。
ぱーる自体は、しっかり行単位でフラッシュしてるんだけど
そういうブラウザの仕様なのかな・・
Perlでメール送信フォームのスクリプトを作っているんですが、 htmlのフォームに設置する、テキストフィールドやチェックボックス等のnameは 日本語だと問題がありますか? 自分が使っているサーバにアップしてテストしたところ問題は無いようなのですが、 書き込む人のブラウザとかの環境でうまく動作しなかったりすることを心配しているのですが。
>598 ブラウザの仕様ではなくサーバの仕様の可能性も。 バッファリング設定を変えてみるとか。 >599 やめておいた方が無難だろうね。 Perlのコーディングと全く関係ないな。
サーバの仕様ではなさそう。 telnetで手動でリクエストしたらバッファリングはしてないようだった ブラウザで画面クリアするタイミングなのかね ただ、それだけでは2回目以降はちゃんと動作するのがわからんなあ
>601 telnetは80番ポートと23番ポートとどっちで接続したかによって意味が変わるな。 tu-ka,そろそろPerlのコーディングと関係なくなってきてるぞ。
603 :
596 :03/11/12 13:54 ID:O6fsMieF
>>601 ネスケ7.1にて期待通り動きました。IEのばか。perlの威力半減
じゃないか!!
イタいからそろそろ引っ込めよ
605 :
nobodyさん :03/11/12 15:22 ID:o3cYkSnS
配列について質問なんですが、 @aと@bと@cの3つの配列があり、それぞれの配列を順番に並べて@Zに代入する場合 @Z = ("$a[0]$b[0]$c[0]","$a[1]$b[1]$c[1]","$a[2]$b[2]$c[2]","$a[3]$b[3]$c[3]","$a[4]$b[4]$c[4]"); とそのまま代入するのと for($i=0;$i<=4;$i++){ $Z1[$i] = "$a[$i]$b[$i]$c[$i]"; } とか for($i=0;$i<=4;$i++){ push(@Z2,"$a[$i]$b[$i]$c[$i]"); } とかのように処理するのとでは、配列の個数や中身が増えた場合、 どれが一番サーバーへの負担が少ないんでしょうか? また他にもっとよい処理の仕方がありましたらアドバイスお願いします。
>605 use Benchmark;
配列の大きさを求めたいんですが、一次配列は$#array + 1でできますけど、 二次配列の時はどうすればいいんでしょうか。 たとえば、 $array[0] = ("a", "b"); $array[1] = ("a", "b", "c"); の時、$array[0]の長さは2,[1]の長さは3ですよね。 for文で回して、$#array[$i]などと書いてもエラーが出るのですが…。 どのように書けばいいのでしょうか。
>607 $array[0] = ("a", "b"); $array[1] = ("a", "b", "c"); この時点で違う。
>>607 $#array[0] + $#array[1] + 2
二次配列って二次元配列のことか?
>>605 Perlではfor文はforeachに比べてかなり効率悪いよ。
俺がその処理を書くとしたらこう書く(一番効率がいいとは限らない)。
foreach (0..4) {
push @Z, "$a[$_]$b[$_]$c[$_]";
}
>>607 @array = ( ["a", "b"], ["a", "b", "c"] );
$size0 = $#{$array[0]} + 1;
$size1 = $#{$array[1]} + 1;
614 :
605 :03/11/12 17:46 ID:???
>>606 恥ずかしながら初めてベンチマークというものを知りました。
ありがとうございました。
>>612 アドバイスありがとうございます。
配列ならforeachを使うのが良いようですね。
ところで、さっそくベンチマークで何度かテストしてみたのですが、
for($i=0;$i<=4;$i++){
$Z[$i] = "$a[$i]$b[$i]$c[$i]";
}
どういうわけかこの処理だけ他のよりも早いという結果が出ました。
615 :
612 :03/11/12 18:49 ID:???
>>614 多分毎回配列を初期化してないのが原因だと思う。
push使うバージョンは配列が初期化されずどんどん大きくなるわけだから。
俺もやってみたけどループ使わないやり方が一番速かった。一応結果さらしとく。
Benchmark: timing 20000 iterations of direct, for1, for2, foreach...
direct: 4 wallclock secs ( 4.44 usr + 0.00 sys = 4.44 CPU) @ 4504.50/s (n=20000)
for1: 6 wallclock secs ( 5.49 usr + 0.00 sys = 5.49 CPU) @ 3642.99/s (n=20000)
for2: 6 wallclock secs ( 5.60 usr + 0.00 sys = 5.60 CPU) @ 3571.43/s (n=20000)
foreach: 6 wallclock secs ( 5.38 usr + 0.00 sys = 5.38 CPU) @ 3717.47/s (n=20000)
あるテキストファイルに id:00000000 key:foo,foofoo,… data1:aaaaaaaaaaaaa data2:bbbbbbbbbbbbbbbbb … id:11111111 という形式のデータがかかれてたとして、このファイルのidの行への ポインタのようなものを張ることはできませんでしょうか。 まずあらかじめidとkeyの組を配列に保存し、検索時になるべくファイル入出力を 減らすことで動作が遅くならないようにしようとしているのですが、 配列に保存しておいたkeyからidを決定し、いざデータを読むところで どうしてもファイルの頭からidを探すはめになってしまいます。 そこでidとkeyを保存する配列に、idがある行へのポインタをついでに 保存することができれば、idがわかれば即データ行を読むことができると 思うのですが…。
ftell
619 :
605 :03/11/12 21:23 ID:???
>>615 なるほど確かにpushでどんどん@Zの中身が追加されれば
扱うデータが巨大な分、処理が遅くなるわけですね。
ソースもすっきりしますし、これからはforeachで処理しようと思います。
大変参考になりました。ありがとうございました。
ちなみに自分のベンチマークの結果を報告までに。
direct: 4 wallclock secs ( 3.42 usr + 0.00 sys = 3.42 CPU) @ 58462.44/s (n=200000)
for1: 4 wallclock secs ( 3.05 usr + 0.11 sys = 3.16 CPU) @ 63351.28/s (n=200000)
for2: 2 wallclock secs ( 1.78 usr + 0.00 sys = 1.78 CPU) @ 112296.46/s(n=200000)
foreach: 4 wallclock secs ( 3.30 usr + 0.03 sys = 3.33 CPU) @ 60096.15/s (n=200000)
620 :
567 :03/11/12 21:24 ID:???
>>592 詳細を教えて下さい。
詳細にね。詳細に。
バーカ。氏ね!
あぁ?ぶっ頃すぞ?
623 :
nobodyさん :03/11/13 07:06 ID:/aGOMNzH
@z = map { $a[ $_ ].$b[$_ ].$c[ $_ ] } (0..$#a)
625 :
605 :03/11/13 12:53 ID:???
>>623 アドバイスありがとうございます。
map関数というものをよく知らなかったんですが、
map関数を使うとforeach文の処理をより簡単に行えるようですね。
勉強になりました。
>>624 確かにその通りですね。
ということで、前回のコードとその結果、今回新たに試したコードとその結果をUPしておきます。
ttp://v.isp.2ch.net/up/b7b5843af3ad.txt 直接代入を別とすると、このコードではforeachを使うのが良さそうですね。
テスト環境や要素数の違いも重要ということが今更ながらですが分かりました。
わざわざテストをしてもらい結果をUPまでしてもらって
本当にありがとうございました。大変参考になりました。
626 :
nobodyさん :03/11/13 16:09 ID:p0mkMRk8
perlで最大公約数を求めるプログラムを作成したのですが, 結果が表示されません.何が痛いのか教えてくらさい.お願いし申す #!/usr/bin/perl -w $val1 = <STDIN>; chomp($val1); $val2 = <STDIN>; chomp($val2); $n = &ku($val1,$val2); print "$n\n"; sub ku{ my($a,$b)=@_; while($a!=$b){ if($a > $b){ $a=$a-$b; }else{ $b=$b-$a; } } }
>626 一つ聞くが、それをブラウザで表示しようとはしていないよな? それ以前にsub kuに戻り値(return)が設定されてないわけだが。
よく考えたら、<STDIN>からとってるんだからブラウザ経由って事はないか。
>>627 ブラウザ経由じゃないです.
てか,出来ました!
>629 出来たら出来たでどう解決したかも書いておくといい。 他の人の参考になるから。
こんなかんずで! #!/usr/bin/perl -w chomp($val1 = <STDIN>); chomp($val2 = <STDIN>); $n = &ku($val1,$val2); print "$n\n"; sub ku{ my($a,$b)=@_; while($a != $b){ if($a > $b){ $a = $a - $b; }else{ $b = $b - $a; } } $a; }
632 :
nobodyさん :03/11/13 17:19 ID:xdkvayck
PerlのスクリプトをWindowsのサービスとして動作させたり、 常駐させたりすることって可能でしょうか? Winodowsのクライアントアプリケーションの開発を行うのですが、 VisualBasicなどはまったくできないので、Perlで開発したいのですが、 可能でしょうか? ActiveStateのデベロッパーツールやVisualPerlを購入すれば可能な気もするのですが、 コンパイルやGUIのアプリとかもできるのでしょうか? 現在は、ブラウザ経由で動作させたり常駐させたい場合はDOS窓でPerlを実行し無限ループさせています。
PerlでWindowsのコマンドを使ってたらよく対話型コマンドって出てくるじゃないですか。 あれ自動的答える事ってできないんですかね? (Winでフォルダの内容を一括消去しようと思ったら、Y/N方式になっていたので)
API呼べればできないことはほぼ無い
636 :
nobodyさん :03/11/13 17:40 ID:3RCRqMFJ
スクリプトをeucで書いていて、 それをCGI.pmのparamで受け取ると文字化けしてしまいます。 Shift_JISで書いていたときにはそんなこと無かったのですが、 何が原因で文字化けしてしまうのでしょうか? ちなみにフォームを使わずに、 <a href="xxxx.pl?aaa=テスト&ccc=てすと">link</a> って感じでパラメータを送っています。
637 :
636 :03/11/13 17:43 ID:3RCRqMFJ
ちょっと日本語おかしかったので改めて書きます。 スクリプトAのパラメータをスクリプトBでCGI.pmのparamで受け取ると 文字化けしてしまいます。 漢字コードはEUCで書いていて、 Shift_JISで書いていたときにはそんなことは起こりませんでした。 何が原因で文字化けしてしまうのでしょうか? ちなみにフォームを使わずに、 <a href="xxxx.pl?aaa=テスト&ccc=てすと">link</a> って感じでパラメータを送っています。
638 :
634 :03/11/13 17:46 ID:???
>>635 ぐぐってみましたがよく解りませんでした・・
>>637 原因?そりゃブラウザ経由してるから
URLに漢字含めるときはURLエンコードすること
640 :
636 :03/11/13 18:10 ID:3RCRqMFJ
>>639 ああなるほど!
ありがとうございます!
でも、なぜShift_JISだと文字化けしないんでしょうか?
ちょっと気になります。
641 :
635 :03/11/13 18:11 ID:???
>>638 ああ、すまん。間に質問が入るとは
基本的に、コマンドには問い合わせをしないオプションが
あるのでそれを使う。
自動で答えるのはできるが、どういう方法でプロンプトを出しているかに
よって対処がかわってくるからなあ・・・
>>640 確認したわけじゃないが、、、
クライアントがWindowsとして、ブラウザが表示してる時点で
SJISになってるわけで、ソースがEUCであろうとSJISであろうと
CGI.pmが受け取るのはSJISのデータ。
そのままEUCのページに出力したら化けるし、SJISのページなら化けない
ということでは。クライアントがEUCの環境なら逆になるし、
強制UTF-8にしてたら結果は変わってくると思う
643 :
642 :03/11/13 18:22 ID:???
と思ったが、ブラウザは元の文字コードのまま送るようだな そうすっと別の理由かもしれん。どう化けたかわからんと想像つかんな
デリファレンスの話がどうしてもよくわからないので教えてください。 $arrayref = \@array; としたときに、別のサブルーチンの引数として$arrayrefを渡してやり、 そのサブルーチンの中で my $arrayref2 = $_[0]; my @array2 = @$arrayref2; として、リファレンスが指す配列の中身を丸ごと@array2に代入して使いたいんですが、 このようなことはできないのでしょうか。
645 :
636 :03/11/13 18:43 ID:???
646 :
634 :03/11/13 18:49 ID:???
>644 できるよ。
質問致します。 アンケートのCGI(アンケート自体はhtmlの入力フォームを利用、 アンケート結果はCSVに貯める)なのですがアンケートに答えてくれた方の アンケート書き込み時間のデータをCSVに記録する設定がわかりません。 sub saveData{ open(FH,">>enquete.csv"); # アンケートデータ保存file 追加書込みopen #flock(FH,2); print FH "アンケート結果\n\n------------------------------------------\n\n"; #flock(FH,8); close(FH); 一応、こちらがアンケート結果を出力するデータです。 自分勝手ながら、どなたか詳細にご教授願います。
>648=>591 localtimeで検索かけろって。
つーかネタだろ。
>>567 の一個下で思いっきり答え出てんのに。
eval { #処理 };←★これ if ($@) { #エラー処理。 } eval関数の、閉じ中カッコの後のセミコロンが凄く気になります。 ラクダ本にも、ブロックの後はセミコロンはいらないとあるのですが。
>651 evalは{}がなくても動く。 冗長なのは;ではなく{}の方。
>>652 eval BLOCK と eval EXPR は別物だが。
>>651 駱駝本 (2nd Edition) に
<q>
演算子の中には、eval {} や do {} のように複合文のような外見を
したものもあるが、それらは複合文ではない。これらは、内部に
複数の文を置くことができるが、それは勘定に入らない。外側から
見ると、これらは単に式の中の項に過ぎず、文の最後に置く場合
には後ろに必ずセミコロンが必要である。 -- <cite>2.6.1 単純文</cite>
</q>
としっかり書いてある。
要するにこのブロックは eval 関数の引数であって、 制御構造としてのブロックではないから、文末のセミコロンが必要。 気持ち悪いなら文句は Larry に言ってくれ。
>>644 my @array2 = @{shift()};
または
my @array2 = @{$_[0]};
657 :
651 :03/11/13 21:56 ID:???
どうも皆さんありがとう。まだまだ未熟でした。精進します(;´Д`)
>654 そういう違いがあったのか 意識せずに使ってた 指摘thx
>>654 perl 描きながらしっかりとマークアップされていたので感動した(泪)
HTML はレイアウトするためのもんじゃないと大声で職場に告げたい(哀)
理想と現実の狭間で悩むのは結構というか言いたい事には同意するが 荒れる元になるので製作板以外では言及しない方が平和だと言ってみたり。
661 :
nobodyさん :03/11/14 03:12 ID:CbTfCA4A
なぁ、暗号化メールってどうすれば作れるんだ??知ってるヤシいまふ?
>>661 知ってるが、perlと何の関係があるんだ。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
671 :
nobodyさん :03/11/14 12:25 ID:0AEokNuB
パンチ5分の2を教えて下さい。
672 :
nobodyさん :03/11/14 14:58 ID:prW7MQIo
>672 何を言いたいのかわからん。 こうしたいのか? my @subnet = split(/\./,$ip); $ip32 = $subnet[0]<<24 + $subnet[1]<<16 + $subnet[1]<<8 + $subnet[3];
一部タイプミスがあるが見逃してくれ。
676 :
nobodyさん :03/11/14 16:16 ID:NVcC09gT
質問です。 FLASHから送られてきたデータを、サーバーのdatファイルに書き出したいのですが、 $buffer = $ENV{'QUERY_STRING'} $c_dat = './chapter.dat'; open(DATA,"$c_dat"); $content = <DATA>; close(DATA); と、ここまでかいたのですが、 ここからのデータの書き込み、が思いつきません。 ここからのプログラムを教えてもらえないでしょうか。お願いします。
IPアドレスを、ドット区切りからドット区切りなしの10進数に変換する式を教えて頂けませんか?
>>672 はマルチポスト
なんでそんなものが必要なのかわからん。
. - _ _,..,_ ノ´//⌒ ミヾヽ、_ _____ ,r'´ ``'' - 、ーニ三彡´〃 ! ゙ゞヾ、_`ヽ [|<|____├{ /´ { l | // ヽ`ーr' } ″ ! `、 ' ノ l. ||l i l / l ああっ、つ、つらいです... ', | ̄``''''ー―- ,'´l l |!` ‐--| l l l ', | l l | リ,! l ', | | | ,! ' リ ,.r''ヽ、 _ ', | |. | ,' ` ' ' ' ' ' ' ´ `ヽ ! | | / ,.r'´ ̄ '''''' ─−-........__ ,.r' | '''"''‐-、 ~´  ̄ ̄ ̄
683 :
nobodyさん :03/11/14 22:25 ID:oeoJYV/L
perlで携帯内にある画像ファイルをアップロードしたいのですが どうしたらいいのでしょう? input type=file はつかえるのでしょうか? だれか教えてください
>>683 それ使えるのはauの限られた機種だけじゃなかったかと・・・
685 :
675 :03/11/14 22:36 ID:???
686 :
nobodyさん :03/11/14 23:16 ID:oeoJYV/L
で、いま過去ログもみてきたけど、結局全機種対応のアップロードは できんってこと? いっかい携帯のサーバーにupしてもらって、そのURLをimg=src で 表示するのが一番いいのかな?
687 :
nobodyさん :03/11/14 23:57 ID:oeoJYV/L
だれかーーー携帯用アップローダーのソースおせーーてーーー
メールでいいだろ メールアカウントがあって.forward使えれば受信時にPerlのスクリプトで 受け取ることは可能
689 :
◆ni6ZOTDZVA :03/11/15 00:04 ID:7gGlnncG
Perlのリスト構造についての質問です。 例えば @data = (0, ,2, , 4); print $data[2]; と書くと、4がprintされます。 これくらいはまあいいんですけど、 これをハッシュにした時に、 %hash = ( a => 1, b => 2, c => , d => 4, e => , ); とすると、4の要素がeになったりして、いろいろと問題になります。 これが困るのは、existしていないような値を設定しようとした時なんです。 回避するためには $hash{a} = 1; のように書くしかないんですかね???
>>689 %hash = (
a => 1,
b => 2,
c => '',
d => 4,
e => '',
);
>>689 my @data = (0, undef, 2, undef, 4);
print $data[2]; # 2
%hash = (a => 1, b => 2, c => undef, d => 4, e => undef);
print $hash{'a'}; # 1
print $hash{'d'}; # 4
>>690 回答ありがとうございまふ。
んと、CGI.pmとか使ってるんだけど、
%hash = (
title => $cgi->param('title'),
content => $cgi->param('content'),
mail => $cgi->param('mail'),
date => $date
);
とかってしたいんです。
$dateには、localtiomeとかいろいろ使って取得した日時が入ってると思ってください。
(別に他の値でも構いません)
で、送信フォームによっては、titleが無かったりとかすることもある状況です。
こういう状況の時って、$cgi->param('title')が何も書いてないのと同じ状況になるんです。
もちろん、
my %data;
foreach($cgi->param()){
$data{$_} = $cgi->param($_);
}
とした上で、%dataを使えばいいんでしょうが・・・・
693 :
nobodyさん :03/11/15 00:16 ID:bYij+4/P
>>688 >メールでいいだろ
>メールアカウントがあって.forward使えれば受信時にPerlのスクリプトで
>受け取ることは可能
え、、わ、わからん。ソースないですかね?
こっちは文字列が入っているつもりでハッシュを作ってるのに、 値自体が無くて空欄扱い・・・・ということになって、 データが無茶苦茶に・・・・ 仕様と思う方がいいんでしょうけど、perldocとかラクダ本に記述ありますか?
>>694 %hash = (
title => scalar $cgi->param('title'),
content => scalar $cgi->param('content'),
mail => scalar $cgi->param('mail'),
date => $date,
);
697 :
nobodyさん :03/11/15 00:30 ID:S/49wxU+
質問です。 FLASH MXから送られてきたデータを、サーバーのdatファイルに 記録するプログラムを書きたいのですが、以下のようなプログラムでよいでしょうか。 #!/usr/bin/perl $file = './data.dat'; #:dataの記録用ファイル #----- データの受け取り if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, @buffer, $ENV{'CONTENT_LENGTH'}); } if ($ENV{'REQUEST_METHOD'} eq "GET") { @buffer = $ENV{'QUERY_STRING'}; } open(READ,"+< $file"); #:ファイルの記録 flock(READ, 2); print READ @buffer; close(READ); exit; サーバーを壊してしまうか心配なのでお願いします。
>サーバーを壊してしまうか心配なのでお願いします。 何でよ。まさかレン鯖でやってるってことはないよな?
699 :
nobodyさん :03/11/15 00:40 ID:S/49wxU+
CGIを使うのが初めてなんですけど、 よくいろんなサイトで、サーバーに負担がかかるとか、 無限ループになるなど書いてあったもので。 サーバーは、学校のサーバーを使っています。
>ID:S/49wxU+ 氏ねといわれる前に教えてやる。 cgiはまず自鯖でテストをしてから他の鯖で動かすものだ。 それができる環境になってから来い。
701 :
nobodyさん :03/11/15 00:49 ID:bYij+4/P
だれかー--- 携帯用画像アップローダーのやりかたをメチャクチャ簡単なソース付で おせーてー。 モノスゲーーー簡単に。 もーコピペだけで、アップできるみたいなの
つーかね。どんなに馬鹿なユーザがいてもサーバ壊されたら管理者がヘボ。
サーバは壊れないだろ CPU食われて同居人が迷惑するくらい
705 :
nobodyさん :03/11/15 00:59 ID:S/49wxU+
すんません。
>>697 でも「一応、何かは」書き込まれる「かも」しれないが、
使い物にはならんだろうな
>697
まあ自鯖を構築するのは実際のところさほど難しくないので適当に用意すれば良い。
んで、データの入力がPOSTとGETなら、普通の、
HTML文書のFormから送られてくるデータの扱いと全く同じ。
多分
>>2-10 に上げられてるサイトや過去ログで解るんじゃないかな。
708 :
nobodyさん :03/11/15 02:20 ID:nDXOVk1l
>>681 マルチポストって。。。このスレの他にはプログラム板のperlスレでしか聞いてないのに・・・
2箇所以上はマルチ。 そのことをちゃんと書かない理由は何?
>>708 さも自分は悪くないとでも言いたそうだね。
711 :
nobodyさん :03/11/15 05:07 ID:eiDVH6ok
「昨日」の値($y_day)を取得したいのですが ($SEC,$MIN,$HOUR,$DAY,$MON,$YEAR,$WDAY) = localtime(time); $y_day = $DAY--; if($y_day = 0){ $y_day = $l_day;# $l_dayは月末日(別のサブルーチンで処理) } としたところ0になってしまいます。 条件分岐のところを if($y_day = 0){ $y_day = $l_day; }else{ $y_day = $DAY--; } と書くときちんと取得できるのですがもう少しシンプルに 「昨日」の値を取ることはできないのでしょうか?
>>711 現在の時刻の86400秒前が、昨日の同時刻。
713 :
711 :03/11/15 05:29 ID:???
>>712 $get_time = (time - 86400);
($SEC,$MIN,$HOUR,$DAY,$MON,$YEAR,$WDAY) = localtime($get_time);
で取得できました。こうやるのが定番みたいですね。知らなかった…。
助かりました。ありがとうございました!
★負荷軽減対策委員会(Perl、PHP)★で質問したのですが、再度質問させてください。 当方開発環境のOSはWin2000 + ANhttpdです。 レンタルしているサーバはSlackware Linux + Apacheです。 perlのバージョンはサーバにあわせて5.6.1です。 質問内容は、メモリの使用量を測定したいのです(正確な値は要りません。だいたいでいいのです)。 もし当方の環境でメモリの使用量を測定できないのであれば、 こういったところに気をつけてコーディングしろって言うアドバイスをお願いします。 (一応use strictしてあります) とある本に、 open IN,略 @data = <IN> ; って言う書き方はメモリを喰うのでヤメレ! while (<IN>) { $data .= $_ ; } か $data = join('',<IN>) ; がイイ!とあったんですが、100k程度のBBSのログではどうなのかな?と思いまして… ベンチマークした時は、@data = <IN> ;が一番速かった…
>>711 if($y_day = 0){ ×
if($y_day == 0){ ○
= 代入
== 比較
>>713 ($SEC,$MIN,$HOUR,$DAY,$MON,$YEAR,$WDAY) = localtime($get_time);
$DAY,$MON,$YEAR,しか使わないのなら
(undef,undef,undef,$DAY,$MON,$YEAR,undef) = localtime($get_time);
とか。
my $get_time = (time - 86400);
~~~
とか。
716 :
711 :03/11/15 06:16 ID:???
>>715 な…超初歩的な間違いだった…。
恥ずかしい質問を晒してしまった。
ご指摘、どうもです!
localtimeで使わない値はundefとしてやる方が
メモリの節約になるんですね。
まだperlやりはじめたばっかなんで
レキシカル(?)変数とか使ってないですけど
それなりに動くコードが書けたらトライしてみるつもりです。
>>714 Perl と関係無いし。
http://www.vector.co.jp/vpack/filearea/win95/hardware/mem/status/ …で、言わずもがなだけど、負荷云々はサーバの混み具合に依存する
話なので、100KB のログを @data = <IN> と読み込む BBS が「悪」か
どうかはケースバイケース。レンタルの共用サーバなんかではメモリを
ケチる方向でプログラム組んだ方が概ね「礼儀正しく」なるってだけの事。
@data = <IN>; は、まず <IN> で 100KB のリストをメモリ上に生成し、
それを @data にコピーするので、作業領域は 200KB 食う代わりに
CPU は楽。while で回せば CPU は忙しないけど一行分のバッファ
+ 100KB で済む…と、俺は勝手に想像してる。MB クラスのファイル
になってくると、@data = <IN> の方が system cpu time 増えてくる
のが Benchmark::timethese でも分かるしね。
718 :
nobodyさん :03/11/15 13:25 ID:VwihuGpF
Perl/Tkで書いたスクリプトをCGIで起動させることは出来ないんでしょうか?
719 :
nobodyさん :03/11/15 15:31 ID:nDXOVk1l
>>709 マルチじゃなくて、デュアルポストだと思いますが?
>>710 私が悪いところはどこですか?
>>715 を見て思ったんだが、
my ( $DAY, $MON, $YEAR ) = localtime($get_time)[3..5];
みたいに配列から一部を切り出すのはできないの?
722 :
714 :03/11/15 16:49 ID:???
>>717 さんくす!
いやぁ、perlでメモリの使用量を測定するって事ばっかり考えてました。
そっすね、ウイソのンフトで測れば医院ですよね。
フリーのBBS(KENT作、当然strictされてない)を動かしたら、+20MBか…
サーバのメモリは512MBか…使いすぎでつか?
ま、いろいろ試してみまつ。
724 :
nobodyさん :03/11/15 17:30 ID:S/49wxU+
質問です。 FLASHからデータ(変数)がCGI(perl)に送られてきて、 そのデータをdatファイルに保存しようとしてプログラムを書いたのですが、 何度やってもデータが記入されません。なぜなんでしょうか。プログラムは #!/usr/bin/perl $file = 'data.dat'; #:dataの記録用ファイル #----- データの受け取り if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } if ($ENV{'REQUEST_METHOD'} eq "GET") { $buffer = $ENV{'QUERY_STRING'}; } open(READ,"+< $file"); #:ファイルの記録 flock(READ, 2); print READ $buffer; close(READ); flock(READ,8); exit; です。よろしくお願いします。
>>724 どういうデータが送られてきてどのように書き込まれるのを
期待してるのか知らんが、$bufferに入ったものをデコード。
>flock(READ,8);
書く場所も違うし、これはいらん。
726 :
nobodyさん :03/11/15 18:20 ID:S/49wxU+
724です。 送られてくるデータですが、FLASHから、数字の123が送られてきて、それを、 datファイルに123と記録したいのですが、うまくいきません。
基本 まずは変数をprintなどで表示してみる 「入っているはず」というのほどアテにならないものはない
728 :
nobodyさん :03/11/15 18:38 ID:S/49wxU+
ありがとうございます。やってみます。
open(READ,"+< $file"); #:ファイルの記録 書き出されたファイル名が %20$file になっているような悪寒。 読み書き両用なのに READ とはこれ如何に。 そして flock(READ,8); がヤな悪寒。 ついでに、 use Fcntl いろいろ しるとバチがあたるのかな?
>>729 > 書き出されたファイル名が %20$file になっているような悪寒。
試してから言ってるならそうなる環境を教えてくれ。
>>724 use CGI::Carp qw(fatalsToBrowser);
を先頭付近で宣言しておき、表示されたエラーぐらいはレスに書いておく。
content-typeヘッダを出力しておく。
ファイル("data.dat")の存在とパーミッションも確認しておく。
せめてopen程度はエラーチェックしておく。
そして、CGI/Perlの入門書を買うか借りるかしてください。
助言お願いします。 ファイルアップ機能を作るのにcgi-lib.plを使いました。 フォームデコードするのに&ReadParseとしました。 $in{'name'}とかすると、%inがグローバルだと怒られます。 対策ありますか?
>>732 my %in;
ReadParse(\%in);
つか CGI.pm 使え。
734 :
nobodyさん :03/11/15 23:43 ID:Y80hCpXc
プロバイダのWebサーバーから、 他のサーバのCGIを読み出すにはどうしたらいいですか? プログラムのサンプルとか、詳しく説明があるページがあったら 教えてください。
>>734 スレ違い
それに「CGIを読み出す」が意味不明
736 :
nobodyさん :03/11/15 23:47 ID:pP1WKCko
>>734 CGIを読み出して何がしたいんだ?
まずはそれからだ。
737 :
nobodyさん :03/11/15 23:53 ID:Y80hCpXc
>>735 HTMLを読み出したいって言うのかな・・・
>>736 他のチャットの試用を独自なものに変更したいんです。
意味不明
す、すいません・・・
741 :
732 :03/11/16 03:08 ID:???
>>733 即レスありがとうございます。
寝てました(^^;;;;;
ReadParse(\%in);でうまくいきました。
これからCGI.pmの使い方を勉強します。
ありがとうございました。
742 :
nobodyさん :03/11/16 03:14 ID:3DviyXlA
>>662 perlを使ってなんらかの暗号化を行いたいんでつ。
できればPGPとかの暗号化したいんだけど、自分でコーディングしなきゃだめ?
744 :
nobodyさん :03/11/16 20:59 ID:ko/cv86R
質問です。 FLASHから送られてきたデータを、datファイルに保存するというものを作っています。 このとき、必ず、CGIのほうにはprintなどで、HTML表示を書いていないのですが、 FLASHからデータが送られてくると、新しくウィンドウが開き、表示できませんというウィンドウになります。 なぜ、新しいウィンドウが開いてしまうのでしょうか。プログラムはこんな感じです。よろしくお願いします。 #!/usr/bin/perl $file = 'data.dat'; #:dataの記録用ファイル #----- データの受け取り if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } if ($ENV{'REQUEST_METHOD'} eq "GET") { $buffer = $ENV{'QUERY_STRING'}; } $buffer =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; open(READ,">>$file"); #:ファイルの記録 flock(READ, 2); print READ $buffer; close(READ); exit;
perlでCのマクロのような機能を使うにはどうするのがいいんでしょうか? 今はグローバル変数を使ってますが、使わないやり方があれば。
748 :
nobodyさん :03/11/16 23:13 ID:pNHtkthL
>>747 sub PI(){ 3.14 }
print PI*10;
>>747 use constant PI => 4 * atan2 1, 1;
print PI * 10;
>>746 ×お前は全部人に聞いてコーディングする気なのか?
○お前は全部人にコーディングさせる気なのか?
>>599 亀レスだが・・・
状況によっては、それも、「アリ」だと思う。
フォームのデザインなどからすべて自分でやるなら、なんとなく気持ち悪いから、nameに日本語を使わないけど、
フォームのデザインするのがデザイナーの場合、
適当な英語やらローマ字まじりのnameを付けてくる場合が多いので、
いちいち自分でそのnameをアルファベットに置き換えるよりかは、
<「日本語」でいいよ>っていうルールにして、デザイナーに作ってもらう。
cgiは、ちゃんとスクリプト自体の文字コードをEUC、クエリーストリングもEUCにして、
と、文字コードをきちんと扱えば問題は、基本的に起こらない。
(文字コードの自動認識をし間違えられるという、ごくまれな可能性はあるけど)
昔、台湾からドライバーをダウンロードしようとしたら 向こうの文字でディレクトリを作ってあって どうやってもそのファイルはダウンロードできないってことがあったなあ
753 :
nobodyさん :03/11/17 04:13 ID:O1ZjS/HQ
>>743 あぁ、やっぱモジュールインストールしなきゃだめか。
レンタル鯖じゃだめそうだなぁ。やっぱ独自でやらなきゃだめか。
>>753 Pure-Perl な実装なら *.pm 置いとけば動くんじゃないの?
検索かけてみたら Crypt::OpenPGP ってモジュールは Pure-Perl みたいだが。
755 :
nobodyさん :03/11/17 06:04 ID:65dyxJdp
perlで文字列の前後のスペースを取り除く処理(VBのTrim)をするには どうしたらいいんでしょう? chompとは違いますよね?
正規表現で引っ掛けるとか?
>>755 $str =~ s/^\s+|\s+$//g;
759 :
nobodyさん :03/11/17 13:04 ID:jsHVCRd5
皆様に質問です。 現在、あるディレクトリにファイルがあるか監視する。 (ファイルが存在すれば処理を実行し、また監視に戻る) というスクリプトを作成中なのですが、 これをWin32::Daemon(Win32::Service?)モジュール等でサービス実現したいのですが、 モジュールの使い方がよくわかりません。 これが可能なら常駐型の様々なスクリプトの応用できると考えています。 ラクダ本にも解説なかったのでご教授お願いします。
>>757 うんにゃ、DVDのドライバ。香港で買って現地で使用してたが
日本では売られなかったと思う
761 :
nobodyさん :03/11/17 14:25 ID:WakYOncE
cgiの質問はここでしていいのか?
763 :
nobodyさん :03/11/17 14:37 ID:WakYOncE
765 :
nobodyさん :03/11/17 16:15 ID:jsHVCRd5
>>759 ありがとうございます。
参考にします。
やっぱり和訳はないみたいですね。
turbolinux7からRedhat9にチェンジしたら、下記のソースで「error2」に なってしまいました。 正常に動いていたものなのですが、Perlのバージョンが5.8になったことに よって何か変化があったのでしょうか、、、 my $ipaddr; if(!($ipaddr = inet_aton($host))){ print "error1\n"; exit; } socket (SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')); my $port = getservbyname('pop3', 'tcp') || 110; if(!connect (SOCK, sockaddr_in($port, $ipaddr))){ print "error2\n"; close(SOCK); exit; }
>>766 print "error2: $!\n"; でエラー内容を確認してみれ。
>>767 Connection refusedと出ましたね。
うーん、POPサーバも全く変わってないのですが、、、
>>766 connect は pack_sockaddr_in じゃないか?
>>769 うーん、
if(!pack_sockaddr_in (SOCK, sockaddr_in($port, $ipaddr))){
だとInternal Server Errorですね、、、
ログ見たら
Bareword "SOCK" not allowed while "strict subs" in use at mail.cgi line 112.
Execution of mail.cgi aborted due to compilation errors.
こう出てました。
うーん、原因がつかめません、、、
おいおい、わかりやすいじゃねーかよ
>>770 おいおいおーい
connect (SOCK, sockaddr_in($port, $ipaddr)) じゃなく
connect (SOCK, pack_sockaddr_in($port, $ipaddr)) じゃないのかってこと
もしかしてどこかのコピペでやってんのか?
>>772 あーごめんなさい、書きこんだ後気付きました。
決してコピペじゃないです。マルチでもないです。
しかし、pack_sockaddr_inにしても同じくerror2が出ます、、、
みんなごめんねこんな香具師につきあわせてしまって、、、
Bareword "SOCK" not allowed while "strict subs" in use at mail.cgi line 112. こんな判りやすいエラーって意味でないの?
>>773 portを80にして、yahoo辺りと接続してみるとか。
ファイル名から(xxxx)の部分を取り除きたいと思い、 $a =~ s/\(.*\)//; rename $元のファイル名,$a; とやってみたんだけど、たとえば(aaaa)aaaa.aaaならうまくいくけど、 (aaaa)aaaaa(aaaa).aaaでは、.aaaとなってしまいます。 どこが間違っているのか教えてください
>>778 \(.*\)
だと、.*が最大の長さになるやつがマッチする。だから、
\([^)]*\) 閉じカッコ以外を対象にする
か、
\(.*?\) 最短マッチにする。
>>778 正規表現スレの話題だがまあいいか
$a =~ s/\(.*?\)//g;
(aaaa)aaaaa(aaaa).aaaの最初の括弧から最後の括弧までが 対象になったんだね
>>770 >>773 Connection refused と言われる && 以前の環境では動いてたのなら、
コード自体は正常だが別の要因で拒否されていると考えるべきだろう。
・socket() のエラーチェックは?
・$ipaddr と $port の中身は?
・sockaddr_in() の戻り値は?
・サーバ/クライアント上のパケットフィルタで弾かれてないか?
>>772 ちなみにどっちでもいける。
783 :
778 :03/11/18 13:37 ID:MPi8gxnh
779-781 できました。さんくす!
if($name =~ /#(\S+)/){ 処理} というコードを見たのですが、(\S+)ってどんな意味ですか?
785 :
nobodyさん :03/11/18 16:04 ID:4SjHeEQC
しらん
788 :
nobodyさん :03/11/18 18:09 ID:RHIIFbjK
ActivePerlだとスクリプトからディレクトリを生成すると 属性が読み取り専用になってしまい、スクリプトから ディレクトリの削除が行えません。 どうすれば削除できるのでしょうか?
\S 空白文字以外 + 1文字以上 () グループ化 ここで言う空白文字とは、半角スペース、タブ(\t)改行(\n)リターン(\r)フィード(\f)
Win32::Fileで属性変えて削除してみるとか
792 :
nobodyさん :03/11/18 20:05 ID:jsZGRnHo
while文で、繰り返しを抜ける文ってどうやってやるんですか
last
例えば、 sub print1()とsub print2()があったとします。 この2つの関数は基本的には同じ機能を持ち、 プログラムの最初のほうで決まる$flagの値によって使い分けるとき if( $flag){ print1(); }else{ print2(); } って毎回書かずに、関数ポインタみたいにprint()に代入するみたいなことはできないですかね?
同じ機能なら使い分ける必要ないだろ
>>794 my %print = (
print1 => sub { ... }, # もしくは \&print1
print2 => sub { ... },
);
my $print = $print{ $flag ? 'print1' : 'print2' };
...
$print->();
>>796 サンクス。
すげぇなperl。勉強になった。
>>794 >>796 いちいちハッシュにイレンでもいいだろ。
俺ならこう書く。
my $print = 1 ? \&print1 : \&print2;
&$print();
>>795 基本的にはって書いてあるだろ。
訂正 ×my $print = 1 ? \&print1 : \&print2; ○my $print = $flag ? \&print1 : \&print2;
802 :
nobodyさん :03/11/19 00:01 ID:nnJjYmrF
&{ $flag ? \&print1 : \&print2 }; でもいいんじゃ?
>>802 >>794 >毎回書かずに、関数ポインタみたいにprint()に代入するみたいなことはできないですかね
型グロブ使っても面白いかも(非推奨?)。 *main::print = ($flag ? \&print1 : \&print2); &print(); # 私ならifで振り分けるサブルーチン書くけど。
805 :
nobodyさん :03/11/19 01:33 ID:CVCx5IGL
OS : Windows2000 Perl : Perl for win32(Perl5) httpd : Apache2 上記環境のPerl(prog1.cgi)からDOSのバッチファイル(rshls.bat)を実行して、結果をテキストファイルに出力するプログラムを考えています。 具体的には、 prog1.cgi ---- system(`rshls.dat'); rshls.dat ---- rsh HOST1 -l root ls > ls.txt dir > dir.txt prog1.cgiからrshls.datを実行する。 rshls.datではWindowsサーバのローカルディスクに ls.txtとdir.txtを作成し、ls.txtにはUNIXサーバ(HOST1)のlsの結果を格納する。 dir.txtには自サーバのdirの結果を格納する。 という動作を期待しています。 まず、rshls.datをコマンドプロンプトから直接実行してみたところ、ls.txtにHOST1のlsの結果が出力され、dir,txtにはdirの結果が出力されました。(期待通りです) 次にprog1.cgiを実行してみたところ、dir.txtにはdirの結果が出力されていましたが、 ls.txtは空白(ファイルは作成されるが、中身はがない)になってしまいました。 dir.txtは正しく作成されているので、system(`rshls.bat`)は実行されているようです。 また、rshls.batを単体で動作させると、ls.txtも正しく作成されるので、rshls.datの記述も間違っていないようです。 (rshに-nオプションをつけてみたり、systemをexecにしてみましたが、結果は同じでした。) perl環境を疑って、Perl for win32 をActive Perl(6xxビルド)に入替えてみたのですがこれも結果は同じでした。 あと、考えられるとしたらどの変を疑えばよろしいでしょうか?ご教授願いたく。よろしくお願いいたします。
・system の戻り値 ・CGI プログラムの実行ユーザ ・環境変数 PATH わざわざバッチファイルを叩かず全部 Perl で済ませば、 悩み処も減ると思う。
バッチファイルを叩く・・・か。
808 :
:03/11/19 02:12 ID:???
>>806 $LS=system(`rsh HOST1 -l root ls`);
としてみたところ、256が帰ってきました。 systemってexitの値しか返せないんでしょうか?
$LS=`rsh HOST1 -l root ls`だと空白が帰ってきました。
HOST1はAIXだったので、 HOST2(HP-UX),HOST3(Linux)で試してみたのですが、結果は変わらずです。
>CGIプログラムの実行ユーザ
>環境変数PATH
というのは何をどうすればよいかよくわからないです。この点についてもう少し教授願えればと思います。
>わざわざバッチファイルを叩かず全部 Perl で済ませば、悩み処も減ると思う。
ごもっともです。
バッククウォートがうまく使えればもうすこし楽にできるかもしれません。
systemが返すのはシェルが返した値
810 :
nobodyさん :03/11/19 12:17 ID:OnG5HVaR
>>805 > rshls.datをコマンドプロンプトから直接実行
この場合は、HOST1に対するログイン名として、あなたのWindowsユーザ名が使われる。
> prog1.cgiからrshls.datを実行
この場合は、HOST1に対するログイン名として、Windows既定のユーザ名(localhost?)
が使われると思われる。HOST1がこのアクセスを拒否するため、ls.txtは空白になった
のでは?
試していないが、rshのオプションでログイン名を指定できるため、これで対処可能
かもしれない。
811 :
nobodyさん :03/11/19 14:43 ID:0OFzMlzR
Win32::Fileモジュール(Win32::FileSecurity?) を使用してWin2000(NTFS)上のディレクトリを削除したいのですが、 CPANのドキュメントを見ても使い方がいまいちわかりません。 知っている方ご教授願います。
813 :
nobodyさん :03/11/19 15:17 ID:0OFzMlzR
>>812 すいません。
文法(書き方)がcpan等をみてもよくわからないです。
*英語ができないせいもあるのですが。
恐縮ですが、質問よろしいでしょうか。 現在KENT WEBのログイン認証簡易タイプのソースを見ています。 テキストボックスにパスワードを入力してSubmitすると、 sub login { がよばれてページが遷移しますが、 submitを押したとき、どのサブルーチンへ遷移する、というのはどのように書けばよろしいのでしょうか。
816 :
nobodyさん :03/11/19 16:12 ID:0OFzMlzR
>>814 $in{'pass'} の値によって if〜ifels〜else で分岐させてもできるし
>>816 >ActivePerlだとスクリプトからディレクトリを生成すると
>属性が読み取り専用になってしまい
ActivePerlだからじゃなく、使っているWindowsの問題。
ログインしているユーザの権限や実行しているフォルダの属性
及び継承など。
そういうWin鯖でスクリプトを動かしてるのか?
819 :
nobodyさん :03/11/19 16:40 ID:0OFzMlzR
>>818 サーバというか、自分のクライアントパソコンにActiveperl入れて
実験してます。OSはWin2000、ログインはAdminでしてます。
ただ、ApacheをWebサーバにしてIEから実行してます。
その場合だと実行(mkdirやrmdir)しているユーザはたぶん、
guestということになりますよね?スクリプトを設置している
ディレクトリはadminとguestに全権限があります。
ファイルは削除できるがディレクトリは削除されません。
>819 隠しファイルでも残ってるんじゃないの?
>>817 回答有難うございます。
$data = "pass";
print "Content-type: text/html\n\n";
print <<"EOM";
<html><head><title></title></head><body>
<form action = "index.cgi" method = "POST" name = "test">
<input type = "text" value = "" name = "data">
<input type = "submit" value = " Submit ">
</form>
</body></html>
EOM
exit;
sub test {
if($in{'data'} eq $data){
print "Content-type: text/html\n\n";
print <<"EOM";
<html><head><title></title></head><body>
遷移先
</body></html>
EOM
exit;
}
}
これで表示されるフォームにpassを入れてSubmitすれば、
サブルーチンで記述した処理を行うわけですよね。
少し試してみます。
822 :
nobodyさん :03/11/19 17:19 ID:0OFzMlzR
念のため聞くけど812のリンクrmdirの説明にはデイレクトリは空の場合に限り、 削除されるとかいてあるけど、そういうことではないよね
824 :
nobodyさん :03/11/19 17:35 ID:0OFzMlzR
>>823 空でないと削除できないので、中身のファイルを事前に消してから
rmdirとしても、中身しか消えないです。
そろそろPerlと関係ない気もする。
828 :
nobodyさん :03/11/19 18:24 ID:0OFzMlzR
>>826 rmdirだと、
$hoge = rmdir($hogehoge);
の$hogeが0です。
$!はPermission Deniedとでます。
結局権限がないから消せないということでしょうか。
ちなみにchmodしてますが、意味をなさないようです。
win32::fileモジュールなんかでディレクトリの権限をフルアクセスに変更できれば削除できるのかなーと考えています。
>>828 消せるかどうかのパーミッションはそのファイル(ディレクトリ)自身の
パーミッションは関係ないよ。
それが存在するディレクトリの書き込み(w)があるかどうか
>>828 モジュールを使っても変更する権限がなければ変えられない
いずれにしてもWindows側の問題だから自宅鯖板へでもどうぞ
831 :
nobodyさん :03/11/19 18:38 ID:lxaoYFTJ
substr関数で開始位置を省略するとどうなるんでしょう? substr($****, , 1) のようにしてるスクリプトがあったんですけど。 自分でもテストしてみたんですけど動作がよく分かりませんでした。。
DBIを使ってテーブルを参照したいのですが、フィールド名も取得したいのです。 (fetchrow_array()じゃ取得できないので) fetchrow_hashrefは理由は良くわかりませんが、あまり評判がよくないので使いたくないのです。 fetchrow_hashref以外で、フィールド名を取得する良い方法はありませんか?
833 :
832 :03/11/19 20:03 ID:???
データベースはMYSQLを使ってます。
fetchall_arrayref
つか、NAMEじゃあかんのか
836 :
832 :03/11/19 21:30 ID:???
$a = $sth -> fetchrow_hashref; foreach(keys(%{$a})) { push(@b,$_); } こんな感じでフィールド名を取得しようとしたんですが、これだとkeysで取ってくる ところでフィールド名がシャッフルされてうまくいかないんです。 834,835殿も少し詳しくお願いできないでしょうか(;´Д`)
つか、NAMEじゃあかんのか
838 :
832 :03/11/19 22:25 ID:???
スンマセン初心者なもんで、NAMEとは関数ですか?変数ですか?オブジェクトですか?(;´Д`)
>>838 お前自分でDBIの話ふったんだろ。なんでperldoc DBIをNAMEで検索しようとしねーんだよ!
$foo->{NAME}->[0];
841 :
832 :03/11/19 22:54 ID:???
839>>もういいよ。荒れるから(;´Д`)
ここにいるのは役に立たないクズばかりですね。 もういいです。
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
>>842 >>843 某板の某スレでこんなこと見たことあるなぁ・・・
たしかApacheスレだっけか。
>>831 my $str = '0123456789';
print substr($str, , , , , , , 2, 4), "\n"; # 2345
print substr($str, , , , , , , 6); # 6789
http://perldoc.com/perl5.8.0/pod/func/substr.html
こんな時間ですが、質問があります。 CGIでフォームメールを設置しましたが、エラーが出ます。 formailというフリースクリプトをダウンロードして、 formail.cgiのplのパスと、sendmailのパス、メール送信アドレス 以上を変更し、 htmlのform actionのパスを変更して、サーバー指定のディレクトリに 各々をFTPにてアップしました。 テストをしましたところ、送信完了のhtmlは表示されるのですがメールが届きません。 サーバーのlogは Program mode requires special privileges, e.g., root or TrustedUser. となっています。 これは、パーミッションの違いエラーですか? それとも、何のエラーなのでしょうか? どなたかご教授ください。よろしくお願いします。
正規表現についての質問なんですが、 $w = "私は彼は天才だと思う"; if ($w =~ m/(.*)は(.*)と思う/) { print "1: $1, 2: $2\n"; } としたときに、出力は 1: 私は彼, 2: 天才だ となりますよね。 これを 1: 私, 2:彼は天才だ としたいのですが、これはどうやればできるのでしょうか。 前方一致…とは違うか…。
>851 事実上無理。 最小マッチングで対応もできるが。 $w = "ははははははと笑うと思う"; この文章を区切れるか?
853 :
nobodyさん :03/11/20 18:42 ID:DBXa7F+1
その例だけだったら $w =~ m/(.*?)は(.*)と思う/ でいけそうだが。。。 そおいうわけではないのかな
>853 せめて $w =~ m/(.+?)は(.+)と思う/ にしておいた方がいいと思う。
856 :
nobodyさん :03/11/20 18:52 ID:DBXa7F+1
やっと852の意味がわかった。
それでは
$w =~ m/(.+)(?=は(.+)と思う)/
>>855 了解
なんじゃそりゃ
858 :
831 :03/11/20 19:17 ID:ejoZ5elX
>>848 回答ありがとうございます
…しかし、まだよくわからない。。
リンク先のページも、英語が苦手なのでよくわからない…
かみくだいて教えてもらえると助かります
文字化けの理由はわからんが。 なんでjcode::tr
>>858 my $expr = '0123456789';
my $offset = 0; # 先頭
my $length = 5;
# "01234" (先頭から $length 文字)
print substr($expr, $offset, $length), "\n";
$offset = 4;
# "45678" (先頭から 4 文字飛ばした所から $length 文字)
print substr($expr, $offset, $length), "\n";
# "456789" (LENGTH が省略されたので末尾まで返す)
print substr($expr, $offset), "\n";
# ではこれは何だ?
print substr($expr, , , , , , , , , , , , $offset), "\n";
print substr($expr, , , , , , , , , , , , $offset, $length), "\n";
# これは?
my @array = (1, , , , , , , , , , , , , 2);
my $num = @array; # 配列の要素数
print $num;
>>859 $str = 'ABC'; # Shift_JIS で "\x82\x60\x82\x61\x82\x62"
# \W = [^0-9A-Z_a-z] = [^\x30-\x39\x41-\x5A\x5F\x61-\x7A]
# "\x61" eq 'a', "\x62" eq 'b'
$str =~ s/(\W)/'%' . unpack('H2', $1)/eg;
print "$str\n"; # %82%60%82a%82b
# 'A' eq "\x41", 'B' eq "\x42"
$str =~ tr/a-z/A-Z/; # %82%60%82A%82B
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack 'H2', $1/eg;
print "$str\n"; # A・・
__END__
解決策: tr/a-z/A-Z/ の代わりに
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/uc $1/eg;
open(FH, "+< $DATA") or die("ファイルのオープンに失敗しました\n"); flock(FH, 2); 1 while <FH>; my $no = $.; print FH ++$no, "\t", time, "\t$name\t$mail\t$mess\n" if($mess); close(FH); ↑の文の 1 while <FH>; の部分はどういう意味ですか?
>>864 最後の行(EOF)まで空読みした後に
$no=$.; で行数を代入してる。
>>863 × $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/uc $1/eg;
○ $str =~ s/(%[0-9A-Fa-f][0-9A-Fa-f])/uc $1/eg;
>>865 レスありがとう。
while(<FH>){
1;
}
もしかしてこういう意味でつか...。1には深い意味はないのですね。
これでもPERLはエラーにならないのですね。
1には「常に真である」という深い意味がある。
しかし、0 while <FH>;でも同様に動くから、文法的に正しくする以上の意味は無い。
870 :
859 :03/11/21 01:21 ID:???
>>860 いや、深い意味はないです。
>>863 ありがとうございます。。。
けど、いまいちわからないので、レス見て勉強してみます。
質問よろしいでしょうか。 文字列を格納する$a,$b,$cがあり、全ての変数がカラだった場合に処理を落とす記述を書いています。 if ($a == "" && $b == "" && $c == ""){ exit; } 現在はこういう記述になっているのですが、 if ($a == "" && $b == "" && $c == ""){ この部分を簡略化できる記述方法はないのでしょうか。 数多く使うので、できる限り見苦しくないようにしたいのですが。
>>871 文字列の比較は == じゃなく eq 。
if ("$a$b$c" eq '') {
作法的な好みの話なんですが &foo(&bar(&baz())); ってやるのと my $baz = &baz(); my $bar = &bar($baz); &foo($bar); ってどちらが良いというか解りやすそうですか。 引数に直接式とかサブルーチンを放り込むか、一旦戻り値を変数に入れてからそっちを渡すか。
>>873 変数を作らなくて済むのは前者。
デバッガで追い易いのは後者。
おれは前者のがスvキ
876 :
nobodyさん :03/11/21 14:53 ID:4Ub053V5
if文の条件式で $AREAの中の文字列の最後が"町"か"村"だったらtrue としたいのですが よくわかりません・・ ためしに町だけでも判別できればと思って書いたのですが ダメでした・・・↓ if (/"町"$/ =~ $AREA){ なんたら〜} どなたかお助け下さい・・
if ($area =~ /(町|村)$/){ なんたら〜} じゃだめか?
>>877 if ($AREA =~ /[ショ]$/) { ; }
という方法で解決したのですが
こんなやり方でいいんでしょうか・・
シ = 村(EUC)をSJISにするとツシだから。
ョ = 町(EUC)をSJISに、、
>>879 ソースはSJISなの?
EUCとはっきりわかってるんだったら
$area =~ /\xC2\xBC|\xC4\xAE$/
とか・・・
文字コード統一させるほうがいいと思うが
881 :
nobodyさん :03/11/21 17:44 ID:Zeq+ojKz
すみません・・・template toolkit などperlでテンプレート使用に 関するスレは、どちらでしょうか・・・教えて君ですみません・・・
おっと、くくるの忘れた、、まあわかるよな
>>880 それって
シ の 文字コードですよ、、ね?
それの変換とか知らないもので・・
有難うございます。
>>873 どちらもサブルーチン呼び出しで&を使ってるところがバカっぽい。
そうかな? なくても動くけど、 これはサブルーチンですよって明示してるんだからいいじゃん。 特にこういうところに貼り付けるときは。
だいたい初心者スレなんだから、そういうコード見て
嫌悪感を抱く奴は最初から見なければいいのに・・・なんでわざわざ煽りに来てるんだ・・・?
>>885 の言うとおり、プロトタイプがどうとかいう問題じゃないんだから、
こういうところでは情報は冗長的であったほうがいいだろう。
>>886 初心者スレだからこそ、Perl3からの悪習慣は断つべきだと思う。
おれは&付きでいいと思うけどね。 Perl的にはある方が見やすい。
俺は付けてないけど&付けるとまずいことでもあるの? 分かりやすくなるならそれはそれでいいような気もするけど。
質問です。 my $a; my $b; my $c; ($a,$b,$c) = (1,2,3); 上の様な場合、$a,$b,$cのアドレスが格納された配列に、 順番に1,2,3が代入されていると解釈してよいのでしょうか? イメージ的にはこんな感じです。 [\$a]=1; [\$b]=2; [\$c]=3;
>>889 >>890 にもあるが、&foo;だと呼び出し元の@_が可視になる。これは望ましくない。
俺は&を使うのはcoderefを作るときだけ。呼び出すときは$foo->()を使う。
最近はずっとサブルーチンの引数が変数だった場合は参照渡ししてるんですが $hoge = 1; my_sub(\$hoge); のように変数が小さい数字や文字列の場合は素直に $hoge をそのまま引数にした方が良かったりするんでしょうか。
あまりにもアホっぽい内容かもしれないので sageで質問ですが、 test.cgi が10KByteあるとして、でも実際にブラウザで表示されるのは print "<html> $message </html>"; の部分だけだとすると、例えば携帯でアクセスしたときに受信する容量的には <html> $message </html> だけで少なく、それ以外はサーバー側で処理していると考えれば良いでしょうか? (あ、それ以外に print "Content-type: text/html\n\n"; これもかな?) 今やろうとしてるのは掲示板を改良したような物で 自宅鯖にCGIを設置して、自分だけが携帯等から書き込めるようにし 他人がアクセスしたときは 「○時○分更新、今○○に出かけてます。」などを見れるような物を考えてます。
898 :
896 :03/11/22 10:07 ID:???
すばやい回答ありがとうございます。 確かにコーディングに関する質問ではなく、スレ汚し申し訳ございませんですた。 ヽ(´ー` )ノ perl楽しくなってきますたです。
899 :
nobodyさん :03/11/22 14:10 ID:gns/7ci+
サブルーチンのプロトタイプアトムで\@を指定すれば 配列のリファレンスを渡せるというのを本でみたのですが sub foo (\@) {...} &foo(@a); としたときにfooに渡されたのはリファレンスではなく、リスト@aでした。 私はなにか勘違いしてるのしょうか?それともこれが仕様?
901 :
nobodyさん :03/11/22 14:24 ID:gns/7ci+
>>900 いや、プロトタイプアトム宣言をしていれば@aでリファレンスを渡せる
というのを見たのですが...
例えば
pop @foo, $bar
↑リファレンスじゃなくリストを直接書ける
のような仕様の関数を作れるメリットがあるとありました。
>>899-900 サブルーチン呼び出し時に & を付けると
プロトタイプチェックは行われない。
sub foo(\@) {
my $arg = shift;
print "$arg\n";
}
my @a = (1,2,3);
foo(@a); # ARRAY(0x10c5f44)
&foo(@a); # 1
>>903 なるほど知りませんでした。
ありがとうございました。
そのプロトタイプ宣言がさっぱりわからん… foo($hoge1, $hoge2, $hoge3); sub foo(\@){ print $_[0]; } でSCARAR0x何とかと言うのが出ると思ったら値がそのまま出る…。
>>905 プロトタイプ宣言を関数呼び出しの前に行わないとだめです。
実装を呼び出しの後に書く場合は
↓のような感じ?
sub foo(\@);
foo($hoge1, $hoge2, $hoge3);
sub foo(\@){
print $_[0];
}
foo($hoge1, $hoge2, $hoge3);
これだとコンパイル時に引数の静的チェックが行われるので
エラーがでます。
なので
@hoge = ($hoge1, $hoge2, $hoge3);
sub foo(\@);
foo(@hoge);
こんな風に呼び出すのが正解っぽい
先日、ラクダ本見ながらPerlでCGIを組んでたのですが、 読み込み用にファイルをオープンすることには成功したのに 書き出し用にファイルをオープンしようとすると失敗してしまいます。 それで質問です。 <A>のような書き方はできないのでしょうか?(読み込みではできました) ちなみに失敗したときの戻り値(Result)は、ローカルでは1、Samba上ではundefで、 ファイルハンドルは、ローカル、Samba共にundefでした。(こっちは失敗してるので当然ですが) <A> my OUT; # myでファイルハンドルを宣言すると失敗してしまう... my Result; Result = open OUT "> Output_File"; # 書き出し close OUT; 以下、成功例 <B> my Result; Result = open OUT "> Output_File"; # 書き出し close OUT; <C> my IN; # 読み込みだと、myでファイルハンドルを宣言しても平気 my Result; Result = open IN "Input_File"; # 読み込み close IN;
>>908 openにカンマがないが、それは関係ない?
>>908 perl -wc your_script
913 :
908 :03/11/22 17:20 ID:???
>>910 すいません。
ソースが今手元に無いのでコピペじゃなくて手打ちでやって、やってしまいました(汗
本来のソースは、正常に読み込みのできるソースからコピペして'>'つけただけなので
カンマ等のシンタックスは大丈夫だと思います。
#エラーログには(-wつきなので)サブルーチンの再定義の警告が発生してますが、それ以外はありません。
それと、「my IN;」「my OUT;」は「my $IN;」「my $OUT;」でした。たびたびすいません(平誤り)
>>910-912 気付いたのですが、ソースが手元に無いということは、教えてもらっても確かめようがないので、
再度ソースのある開発環境(=会社)に戻ってから質問したいと思います。
ありがとうございました。
#中古PC買って自宅にSamba鯖置いた方がいいのかも・・・
914 :
nobodyさん :03/11/22 17:43 ID:kxdrny/R
携帯向け絵文字をキャリア別に出力する際にリスト配列かハッシュかで迷っています。 色々考えたり参考にしたりした結果、下の二つの案にが浮かびました。 ◆リストの場合◆ @emoji0 = ('ドコモ絵文字0','J絵文字0','PC向け絵文字画像0.gif'); @emoji1 = ('ドコモ絵文字1','J絵文字1','PC向け絵文字画像1.gif'); : 以下176まで。 実際に使うにはUAで振り分け、 ドコモは0,Jは1,PCは2を$uaに入れ ソース中で $emoji0[$ua] 等として使う。 ◆ハッシュの場合◆ if($ua == 0){ %emoji = ('0'=>'ドコモ絵文字0','1'=>'ドコモ絵文字1', …以下176まで); elsif($ua == 1){ %emoji = ('0'=>'J絵文字0','1'=>'J絵文字1', …以下176まで); elsif($ua == 0){ %emoji = ('0'=>'PC向け絵文字画像0','1'=>'PC向け絵文字画像1', …以下176まで); } 実際にはあらかじめUAで読み込むハッシュを振り分けておき、 $emozi{'2'} 等と指定して使う。 --------- どちらの方が良さそうなのでしょうか? ご指導下さい。
>>914 my %icon = (
docomo => [ ... ], # DoCoMo 絵文字の配列のリファレンス
vodafone => [ ... ],
pc => [ ... ],
);
my $ua = 'docomo';
$icon{$ua}[1]; # DoCoMo の絵文字1
>>914 UAごとに文字のテーブルファイルを作っておく。UAに応じたファイルを配列に読み込む。
文字列内での指定は内部コードで書いておく。(たとえば<123>とか)
出力前にs/<(\d+)>/$moji[$1]/g;とかやって一括置換。
こういう方法はどう?
917 :
914 :03/11/22 18:37 ID:kxdrny/R
>>915 さん
>>916 さんありがとうございます。
>>915 さん
この方がすっきりしていて見やすいです。
自案では少しでもハッシュの読み込みを少なくしようと
端末を振り分けてから、端末に応じた物を読み込んでいますが…
実際にどの程度の負荷が生じる物なのかも分かりません。
はっきりいってこの程度の配列やハッシュを読み込んだ程度では
負荷なんぞ気にする必要も無いのでしょうか?
>>916 さん
実は既にキャリア別の絵文字置換システムはあるのです。
掲示板などのデータファイルを読み込み一致した場所を
アクセスしたキャリアの絵文字に置換しています。
ですが、これは負荷も大きい点も挙げられます。
これとは別に、決められた(ドコモ絵文字)絵文字を
キャリアに応じて分けて出力する物を考えていました。
プロトタイプの話が出てたんで便乗。 ラクダ本には $ だと scalar @array と同等って書いてあったんで my @hoge = qw(hoge0 hoge1 hoge2 hoge3); test(@hoge); sub test($){ my $aa = shift; print $aa; } ってやってみたところ、4 と出ると思ったら普通に hoge0 と出力されます。 \$でも同じ。 何か勘違いしてるんでしょうか。
デジカメからローカルPCに画像を移動する際にperlを用いて ・画像サイズを1600×1280から800×600にする。 ・ファイル名が重複しないようにする。 って事をやってます。 サイズの変更にはImage::Magickを使ってるのですが、変更を加えたらファイルの更新日時が変わっちゃうのです。 あたり前と言ったらあたり前なのですが、撮影日時をファイルの更新日時で得てますので変っちゃうとちょっと困るんです。 サイズの変更前にファイル名とstat[9]のハッシュを記録して云々… としか思いつかない私に、何か良い方法をご伝授くださりませ。。。m(__)m
utimeってのがある
>>919 プロトタイプ宣言の前に呼び出して、何したいんだよ。
923 :
920 :03/11/23 09:53 ID:???
>>921 出来ました!
かなりうれしいです。
ありがとうございました。
>>923 わざわざ変更しないでファイルの作成日時みれば?
Image::Magick ってさア。。。 ウホッ!いいよな
パッケージとライブラリはどう違うのですか(´・ω・`)?
>>927 パッケージ … 名前空間
ライブラリ … 関数や定数を寄せ集めたもの
>>928 だからその専門用語やめろ。
もっとくだいて言え。名前空間とかわからんし。
バカにしてんの?
あんた死ぬ?
>>929 お前のわからん単語=専門用語か。頭がお花畑とよ。
名前空間は十分専門用語だと思うがな。 かといって砕いて言えといわれてもこれまた困る。
じゃ、name space
プログラム関係の板なんだから、ここでは名前空間は一般用語。 SQLとかXMLなんて単語はここでは常識だろ。
いや初心者質問スレだし
本読めば普通に出てくるし>名前空間 そういうのを避けてたらいつまでたっても初心者のままだよ。
そういう単語は検索でもして調べろと。
ハイハイ
938 :
927 :03/11/23 23:07 ID:???
Perlのハッシュ変数用のハッシュアルゴリズムってどうなってるか知ってる方いますか? 結構優秀なので自分のC++のハッシュクラスに使ってみたいのです。 具体的にはハッシュ値が被ったときの対処法がどんな方法を使ってるかを知りたいです。 よろしくお願いします。
>>939 どうなってるかと聞かれても。perl のソース読んでくれとしか。
ちなみに最近実装に手が加わったっぽい。perldelta 読んで。
>922 先に定義しないと駄目だったのね。 >924 いや書いてなかったんで…。 サブルーチンは後ろの方で定義するのが一般的だとずっと思ってた。 どこで定義しても良いってなってるから。
>>941 KENTやレスキューのコードは全て忘れろ。奴らから学ぶことは何も無い。
sub foo($$);みたく前方宣言しとく方法もある。
>>939 5.005だと、クローズドハッシュ(オープンアドレッシング)で処理してる。
ハッシュ要素がリストで繋がっていて、それを辿ってる。
テーブルが足りなくなると二倍のテーブルのメモリを取得して再配置。
テーブル自体はポインタの配列。
今は分からないし、間違ってるかもしれないからhv.c,hv.hを読んでね。
944 :
939 :03/11/24 14:13 ID:???
み、見た目は簡単にみえるくせに、結構難儀な事(というかメンドクサイこと)やってるんですね。 perldelta と hv.c と hv.h ですね。 ありがとうございました。検索して調べてみます。
「"」これの代用ってありますか? (例) $in{'1'} = "document.write(""; 「"」これを自動的に入力するものを作りたいのですが、 重なってしまいエラーになってしまいます。 よろしこ。
$in{'1'} = qq|document.write(""|;
>>945 「ダブルクォート」って読むんだ。憶えとけ。
変数を使わんならシングルクォート「'」で十分。
950 :
950 :03/11/25 04:49 ID:mEb3n4TI
Javascriptも含んだ質問なのですが、ここでしてもよろしいでしょうか? どこですればよいのか分からないのでココでさせてください。 まず分かりやすいようにサンプルプログラムを書いてみました。 <form name="f" method="POST" action="xx.cgi"> <input type="text" name="t1"> <input type="button" name="b1" value="【push】" onClick="f1()"> </form> <script language="javascript"> function f1(){ document.f.t1.value = "1"; document.f.submit(); } </script> 上記のコードは【push】ボタンを押した際、t1フィールドの値に"1"がセット されて、xx.cgiにPOSTされるものです。 Win環境ではしっかりt1の値に"1"がセットされたものが渡るのですが、 Mac環境だとなぜかt1の値がnullになってしまいます。 手動で入力した時は問題なく渡るようなのですが・・・ ちなみにMACの動作環境はOSX、IE6です。 これはMACの仕様なのでしょうか? 期待通りにデータを渡す方法がありませんでしょうか? もしどなたかご存知の方がいましたらご教授ください。 よろしくお願いします。
953 :
950 :03/11/25 05:29 ID:???
>>952 最初書き込んだ後、こちらのスレの方が適切と思って
書きました。他にはマルチポストしてません。
すみません。
954 :
ぱくちゃん :03/11/25 17:40 ID:UdoS9gNt
WindowsXPでPerlによるビープ音の鳴らす方法について誰か教えていただけないでしょうか?
Win32::API があればいけそうだが
print "マルチ\a"
[数値],[文字列] という配列があるとして 例1 11,AAA 5,BBB 1,AAA 54,BBB 8,CCC 同じ文字の数値を加算してまとめたいのですが 例2 (例1を処理したとした場合) 12,AAA 59,BBB 8,CCC どのように処理すれば良いですか? ご教授お願い致します。
>959 文字列と数字をmapで対応させる。
すまん、Cスレと思ってた_no 連想配列だな。 各行をsplitとかで区切って[文字列]をキーにして[数値]を加算。
正規表現で例えば、 $test=~m/文字列/; 文字列の部分に ー が入っているとエラーになるのはどうしてでしょうか?
>962 「ー」の文字コードを調べてみてください すぐにわかります
$hoge と、${hoge} という表現をたまに見かけますが、 これってどういう違いがあるんでしょうか? ラクダ本には、「$hogeと同じだけど直後に英数字が続く場合に使うよ」って書いてあるんだけど いまいち意味がわかりません。 直後に英数字が続く場合って???
966 :
964 :03/11/26 12:05 ID:???
>>965 なるほど!
"abc$hogedef";
になっちゃうのを防ぐためか。
勉強になりますた。
有難う
967 :
962 :03/11/26 12:50 ID:???
>963 >964 ありがとう。%5Bの部分が]として認識しちゃうわけか。 シフトJISでなんとか解決できるようにがんばってみます。
968 :
ぱくちゃん :03/11/26 13:42 ID:+ZoCfoLg
>955-958 ありがとうございます。 はずかしながら、Wine32モジュールのダウンロード、インストールについて全然知りません。 ご教授お願いできないでしょうか?あと、コマンドプロンプトで perl -e "print \a"で行ったところSCALAR(0X2752C8)が出力されて音はなりませんでした。 用法が間違ってるのでしょうか?
>>968 print "\a"; #ダブルコーテで囲ってやってください
誰か次スレ立てないのか?
972 :
ぱくちゃん :03/11/26 14:25 ID:+ZoCfoLg
>969-970 どうもありがとうございます。 print文のほうはうまく行きました。 インストールは、教えのとおりぼちぼちやってみます。また、分からないことが あったときには、よろしくお願いいたします。
973 :
頭が混乱してきた :03/11/26 14:33 ID:EtEk92p5
Perlでは尚且つ(&&)が多言語と違い、覚えてなく使いにくいのですが、 if ( ($x eq '') && ($y eq '') ) 、をシンプルにしようと if ( (!$x) && (!$y) ) 、とすると目的の動作をしてくれません。 $x , $y の両方に値が入力されてない時にエラー(&error)を実行したいのですが、 混乱してきました・・・。
orじゃねーandだ
976 :
nobodyさん :03/11/26 14:50 ID:YnQ/9PIJ
つか&&でなるし
>971 スローペースだし990超えてからで良いんじゃない。
>>973 unless( $x and $y )
979 :
978 :03/11/26 15:40 ID:???
まちげーた。 両方空の時ってことね。 unless( $x or $y ) { &error(); }
>>973 error() if !$x && !$y;
error() if not $x and not $y;
error() if not $x || $y;
error() unless $x or $y;
error() if not "$x$y";
error() unless "$x$y";
981 :
973 :03/11/26 16:03 ID:???
こんな低レベルでくだらない質問に答えて頂き、皆さんありがとうございました。 unless は混乱しそうだったので、なるべく使わないでおこうかと思ってたのですが 779の方法がスマートだなと思ったので、改心して使用させて頂きます。
if 使って否定文かくより、 unless 使うほうがわかりやすいと思うのは俺だけか
C出身なせいか、unlessわかりづらい・・・ 最初のうち使おうとはしたが、読みかえしたとき 混乱したのでそれ以来使って無いなあ
if、unlessどっちでも良い時はif使ってるかな……。
unlessは6文字も打たなければならないので、ifの勝ち!
>>984 if、unlessどちらかにしなければならない時ってどんな時だ?
elsif使う時とか?
「!」だけで文の意味全部が否定されるから結構危険なものだと思っテル。 なのーで、 if ( !$hoge ) よりは unless ( $hoge )
if ( $a == 1 or $a == 2 or ... or $a == 49 or $a == 50 ) これを簡単にしたいのですが、何かいい方法はありますか?
if(1 <= $a && $a <= 50 && $a !~ /\D/)
>>987 my $foo = 2;
unless ($foo == 2) { print 'unless' }
elsif ($foo == 2) { print 'elsif' }
else { print 'else' }
うほっ、使えるのか……
994 :
989 :03/11/26 20:33 ID:???
>>990 あ、、、そうでした!
ありがとうございます!
/\bA\b/ 入力する文字列にA以外に何が含まれていてもいいけど, Aが入ってないと駄目って書き方あります?
/A/
>>989 if(a/50 <= 1 && a != 0)
>997 $が抜けてるがC使いの方ですか? あと、そのやり方だと、-20や10.8も入ってしまいますよ?
my @list = qw(1 50 1.0e1 +10 10_true 0 1.01 -1 51 0_def); foreach(@list){ &check_v($_); } exit; sub check_v { my $v = shift; print "$v = ${\($v+0)} : "; if ((int($v) == $v) and ($v >= 1) and ($v <= 50)){ print "true\n"; } else { print "false\n"; } } こんな感じじゃない? というか、値が整数かどうかは必要に応じて別でチェックすべきだと思う。
>999 >989や>990より難しくなってるだろ 1000get
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。