Perl コーディング初心者質問コーナー Part28
1 :
nobodyさん :
03/09/15 03:01 ID:hl+VfJ8P いらっしゃーい、Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
9 :
nobodyさん :03/09/15 03:44 ID:BiFx7sod
ttp://member.nifty.ne.jp/hippo2000/perltips/dbimemo.htm >カラムをハッシュの内側の値に結びつけるという、さらにすごい例を示します(H.Merijn Brandに感謝):
> $sth->execute;
> my %row;
> $sth->bind_columns( \( @row{ @{$sth->{NAME_lc} } } ));
というのがあるんだが、これをサブルーチン化して、この%rowに結びつけるんじゃなくて、サブルーチンの外側からハッシュのリファレンスを渡して、それに結びつけて外側で使うって、可能?
イメージとしては、
main:
my %hoge;
$obj->exec_bind(\%hoge);
while($obj->next){
print $hoge{'NAME'}."\n";
}
######
sub exec_bind{
my $class = shift;
my $hash_ref = shift;
my %hash = %$hash_ref;
#略。prepare やら execute やら
$sth->bind_columns( \( @hash{ @{$sth->{NAME_lc} } } ))
}
sub next{
my $class = shift;
#クラスにひも付いているsthに対してfetchするだけ(略してます)
return $sth->fetch;
}
で、NAMEの一覧が表示される、という。
現状、改行がそのSQLの結果行の数だけ表示されています。
要するに、$hoge{'NAME'}のところにうまくバインドされていないのだけれど、SQLの実行はうまくいっているのです。
bind_columnsのところはどうかいたらうまくいくのでしょう??
>>9 %hash(%$hashrefからのコピー)の内側に結び付けられてるね、きっと。
$hashrefの内側のリファレンスの配列は取れた。
bind_columnsでうまくいくかわからんけど。
use strict;
my @name=qw(a b c d e);
my %hash=();
my $hashref=\%hash;
my @refs=\(@$hashref{@name}); #hashrefだけ使って結び付け
${$refs[0]}='a';
print join ",",$refs[0],\$hash{a};
print "\n";
print join ",",$refs[1],\$hash{b};
print "\n";
print ${$refs[0]},$hash{a};
11 :
nobodyさん :03/09/15 06:27 ID:OyC65Kol
>>9 3行目に
open (IO,"+<$logfile");
11行目に
while (<IO>){
if ($_ =~ /<>$ip/){
@y2=split(/<>/,$_);
if ($y2[6] ne $ip){
push(@log,$_);
}else{
$y2[0] = 'All Clear (^-^)v';
$y2[5] = 'All Clear (^-^)v';
push(@log,"$y2[0]<>$y2[1]<>$y2[2]<>$y2[3]<>$y2[4]<>$y2[5]<>$y2[6]<>$y2[7]<>\n");
}
}else{
push(@log,$_);
}
}
を入れると直ります。
12 :
9 :03/09/15 16:47 ID:BiFx7sod
>>10 前述のソースで、
$sth->bind_columns( \( @hash{ @{$sth->{NAME_lc} } } ))
を
$sth->bind_columns( \( @$hash_ref{ @{$sth->{NAME_lc} } } ))
に変えたら、できました。
勉強になりました。多謝。
>>前スレ999さん、ありがとうございます。 やりたい事は、あるクラスに2種類の振る舞いを与えたいのですが、 その振る舞いの違いが、組み込み関数のいずれを使うかといった違いのため その関数のリファレンスを取って処理を切り替えようとしたところ、 "Not a CODE reference at ..."と言われてしまいました。 ソースで言うと以下のようなことをやろうとしております。 { package Link; sub Switch { ・・・略・・・ if ($flag) { $self->{create_func} = \$link; } else { $self->{create_func} = \$symlink; } } sub Create { ・・・処理・・・ &{$self->{create_func}}($src, $dst); ・・・処理・・・ } } なので、Filter::Simpleはちょっと違うかもです。 うーん。sub {} とか、eval で逃げちゃうのが楽かなぁ。
$hoge{$hoge} ってどういう意味ですか?
キー$hogeで取り出せる、ハッシュ%hogeに含まれる要素。
17 :
16 :03/09/15 22:48 ID:???
訂正。キー$hogeと対を成す、ハッシュ%hogeに含まれるバリュー。
18 :
nobodyさん :03/09/15 23:35 ID:W9KyN8NY
DBD-Oracleをインストールしたいのですができません。 Error: PPD for 'DBD-Oracle.ppd' could not be found. ってでてしまいます。パッケージダウンロートしてきてReadmeに書いてあるとおりに 展開したディレクトリで ppm install DBD-Oracle.ppd とかやってみたんですけどこちらもだめでした。 ActivePerl 5.8.0をつかっています。どなたか知恵を貸してください
19 :
18 :03/09/15 23:37 ID:W9KyN8NY
すいません。二行目のエラーは ppm install DBD-Oracleとやったらでました。
21 :
18 :03/09/16 00:24 ID:???
>>20 うう。ちろっと見てみたけど全然わからんです。
どこらへんみればいいんだろうか・・・
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
IPアドレスからHNを返すサブルーチンは、次のうちどちらが効率的ですか? sub getHNfromIP { my $IP = @_[0]; if ( $IP eq "111.11.11.11"; ) { $HN = "Aさん"; } elsif ( $IP eq "111.11.11.22"; ) { $HN = "Bさん"; } elsif ( $IP eq "111.11.11.33"; } { $HN = "Cさん"; } … else { $HN = "?"; } return $HN; } sub getHNfromIP { my $IP = @_[0]; %HN = ('111.11.11.11'=>'Aさん','111.11.11.22'=>'Bさん',111.11.11.33'=>'Cさん' … ); return $HN{$IP}; }
>>32 ハッシュを使え。ソースも短くてすむ。
?が抜けてるけど。
34 :
32 :03/09/16 10:14 ID:???
>>33 おお、そうですか。どうもです。
急いで書いたので抜けがありました。
0014の形式(整数に対して、0で4桁にそろえてる) を、14(もとの整数)に変換するにはどうすればいいのでしょうか?
>>32 つか、バグがあるぞー。
それに、実行の度にハッシュを作るのもなんだかなあと思える。
大した差はないかも知れないけど。
use strict; # つけたほうがいいだろ?
%Main::IP2HN = ('111.11.11.11'=>'Aさん','111.11.11.22'=>'Bさん',111.11.11.33'=>'Cさん' … );
sub getHNfromIP {
my $IP = $_[0];
return ( exists ( $Main::IP2HN{$IP} ) ? $Main::IP2HN{$IP} : '?';
}
37 :
32 :03/09/16 10:44 ID:???
>>36 確かに。実行の度にハッシュというのは私も少し不安でした。
「return ( exists…」という書き方かっこいいですね。
こちらでやってみます。
38 :
32 :03/09/16 10:50 ID:???
あと、36の書き方のでgetHNfromIPを色んなスクリプトで使いまわしたい場合、 パッケージにすれば良いのですか?
# 下記のモジュールの使い方 package Main; my $ip = $ENV{REMOTE_ADDR}; my $handle = IP2HN->getHNfromIP($ip); $handle ||= 'IPがないよ!'; # IPを登録したハンドルに変換するモジュール # 引数:IPアドレス # 返値:対応するハンドル。 # 備考:引数を与えないと、undefを返す。IPに対応するハンドルがないと、?を返す。 package IP2HN; use strict; %IP2HN::list = ('111.11.11.11'=>'Aさん','111.11.11.22'=>'Bさん',111.11.11.33'=>'Cさん' … ); sub getHNfromIP { my $invocant = shift; my $IP = shift; return undef unless ( $IP ); return ( exists ( $IP2HN::list{$IP} ) ? $IP2HN::list{$IP} : '?'; } こんな感じかー。 1.呼び出し方に注意。# $handle = IP2HN->getHNfromIP($ip); 2.なんかサブルーチンの名前とか長いから、もうちょっと短くなるように考えてみるとか。 3.ハンドルの登録はハッシュで実装するのがいいだろうけど、 リストをソースにベタ書きするのもアレだから、外部ファイルを読み込むようにしてはどうか。
>>35 $num = sprintf '%04d', 14;
print $num, "\n"; # 0014
print $num + 0; # 14
>>38 #--- Conf.pm ---
package Conf;
use base 'Exporter';
our @EXPORT = qw(get_HN_by_IP);
my %HN = (...);
sub get_HN_by_IP { return $HN{$_[-1]} || '?' }
1;
#--- script ---
use Conf;
my $HN = get_HN_by_IP($IP);
>>35 頭に0が並んでる数値は、内部的には文字列として扱われている。
文字列なんだけど、強引に数の計算をしてしまえば、
内部で暗黙のうちに数値への変換がなされる。
これを利用して、0を足す(引くでもいいけど)と、文字列から数値になる。
CGI的な使い方になるが、「このフォームからは数字しか受け取りたくない」と
思った時には、フォームの内容に0を足したりすると、簡単な入力チェックになる。
どんな風に変換されるかは、らくだ本を読んでしっかり確認すること。
あくまで簡単チェックだから。
42 :
39 :03/09/16 11:22 ID:???
>>38 の方が、呼び出し方は簡単になっていい。反省。
ただ、
>>38 のやり方だと、存在しないハッシュキーを与えるたびに、
どんどんハッシュが増えていくんだよな。
ま、たいしたメモリ消費じゃないか。
43 :
39 :03/09/16 11:23 ID:???
44 :
32 :03/09/16 11:29 ID:???
>>39-40 ありがとうございます。
40は高度過ぎて私には理解できなかったのでとりあえず39でやってみます。
45 :
40 :03/09/16 11:58 ID:???
>>32 「ハッシュが増えていく」ってのはどういう意味でしょうか?
少なくとも
%foo = ();
$foo{'foo'};
print exists $foo{'foo'} ? 'exist.' : 'undef.';
は undef が返ってくるので、存在しないキーを評価しただけで
ハッシュの要素が増えるわけではないようですが、内部的には
メモリを食っていくんでしょうか?
またそれはどうやって確認できますか?
46 :
39 :03/09/16 12:49 ID:???
>>45 失礼しました。私の思い違いでした。
技術評論社 CGI&Perlポケットリファレンス 初版 1999.04 P269 より
「リリース5.005_02では、
if (exists $ref->{"x"}{"y"}{$key} ) { ... }
のような複雑なレコードのハッシュキーの存在テストを行った場合、
$ref->{"x"}, $ref->{"x"}{"y"}が存在しておらず、ハッシュキー$keyが存在していないケースでも、
$ref->{"x"}, $ref->{"x"}{"y"}が自動的に生成されてしまいます。
これは将来のリリースで対処される予定です。
」
この一文を読んだ当時の私は
「ハッシュのキー回りについては(バグがありそうなので)厳密にやった方がよさそうだ」
と考えてしまったようです。
それがいつのまにかハッシュキーに関する誤解になっていました。
同じコードをこちらでも確認しましたが、同じ結果になりました。
# v5.6.1 built for MSWin32-x86-multi-thread
ですので、この点に関しても
>>40 氏のコードの方が優れていることになります。
勉強になりました。ありがとうございます。
>>32 氏へ。
>>40 氏のコードの方が全ての面で私のよりも優れています。
そちらを使う方をおすすめします。
>>46 多次元ハッシュにいきなりアクセスした場合は、中間のみ動的に
生成されます。
my $ref = {};
my $key = 'z';
print 'z' if exists $ref->{'x'}{'y'}{$key};
print 'y' if exists $ref->{'x'}{'y'};
print 'x' if exists $ref->{'x'};
print 'z' if exists $ref->{'x'}{'y'}{$key};
# yx
5.005_03 でも 5.8.0 でも同じ結果になったので、これは仕様だと考えて
いいと思います。こういう構造で疎な場合は確かに注意が必要ですね。
>>47 確かに中間は生成されますね。末端は生成されない、と。
……Perl6では修正されるんでしたっけ?
あるディレクトリに、ip****.txt という名前のファイルが多数ある。(**は月日を書いてある) そして、すべてのip****.txtを開いて一つの配列に入れたい。 ファイルの中身は 123.123.456.7 234.567.7.8 ・ ・ ・ という風に一行に1個IPがある。 一個のファイルを開いて配列に入れるのは問題ないんですが、 ディレクトリ内で、条件に当てはまるファイルすべてを開く、というのが 分かりません。ご教授お願いします。
>>49 glob()でファイルリストを取得して、あとはforeachでぶん回せばよい。
52 :
49 :03/09/16 18:26 ID:???
>>50 条件、と言いますと?
ip***.txtというファイルをすべて開いて配列に格納したい、ということです。
本読んで今、ちょっと自分なりに考えてみました。
opendir DIR, ".";
@files = readdir DIR;
foreach $file (@files){
if($file_=~ /ip*.txt){
open(FILE, "$_");
foreach $ip (<FILE>){
push(ip,$ip);
}
}
}
これは効率が悪いですか?
もう少しスマートなのがあったらお願いします。
53 :
49 :03/09/16 18:27 ID:???
すいません。 ×open(FILE, "$_"); ○open(FILE, "$file"); です。
わかって使う分には便利な機能だし、修正はされないだろう ちなみに、自動生成されないとかなり面倒なことになる my %h; my $has_x_y = exists $h{x}{y}; # Runtime error: Not a HASH reference $h{x} = {}; $has_x_y = exists $h{x}{y}; # OK: false my $has_x_y_z = exists $h{x}{y}{z} # Runtime error $h{x}{y} = {}; $h{x}{y}{z} = 1; $has_x_y_z = exists $h{x}{y}{z}; # OK: true
>>52 それでいいんじゃないの?
できればちゃんとclosedirするようにね。
>>52 読み込まれるファイルの末尾が、IPで終わってるのか、改行で終わってるのか、
判断しなくていいのかね?
何も考えずそのままpushしていくと、
xxx.xxx.xxx.xxxyyy.yyy.yyy.yyy
なんてーのができるかも。
57 :
49 :03/09/16 19:05 ID:???
とりあえず上のソースは即席で間違いだらけだったの動くように書き直しました。
$dir="D:\iplist";
opendir DIR, "$dir";
@files = readdir DIR;
close DIR;
foreach $file (@files){
if($file =~ /ip/){
open(FILE,"${dir}/$file");
foreach(<FILE>){
push(@ip,"$_");
}
close(FILE);
}
}
foreach(@ip){
print "$_\n<br>";
}
>>56 改行で終わっていた場合はどうなってしまうのですか?
詳しく教えていただけないでしょうか?
58 :
49 :03/09/16 19:05 ID:???
また間違えました。スイマセン ×$dir="D:\iplist"; ○$dir="D:/iplist";
vvvvvvvvvv aaaaaaaa 22222222 44444444 11111111 55555555 bbbbbbb 3333333 これをソートして 11111111 22222222 3333333 44444444 55555555 aaaaaaaa bbbbbbb vvvvvvvvvv こうしたい。 しかしならない。 やってみたのは文字列、数字、二つの配列に分けた。 1つの配列で数字、文字の順でソートするようにできないでしょうか?
>>59 ただ sort したらそうなったけど…?
www.www.www.www xxx.xxx.xxx.xxxyyy.yyy.yyy.yyy zzz.zzz.zzz.zzz ってなるって事?
>>57 ん、ちょっとこっちも誤解があったな。その点は謝るです。
まず、IPが入ってるテキストは、IPが改行区切りで入ってるんだよね。
だとしたら、「一行取り出した」場合は、最後の改行もその行にくっついてくる。
従って、@ipに入っているのは、「IPアドレス+\n」の文字列ばかりの配列。
心配なのは、最後に改行がついていても構わない、気にしないのかどうか。
もしついてたら、普通にIPと比較した場合引っかからなくなるだろ?
それはそっちの立場としてまずくはないだろうか?
まあ、さておき。
$dir = 'ディレクトリ';
opendir ( DIR, $dir );
@files = grep { /^ip.+\.txt$/ } readdir ( DIR );
closedir ( DIR );
foreach $file ( @files ) {
open ( FILE, $file );
while ( <FILE> ) {
chomp; # これですっきり。
push @ip, $_;
}
close ( FILE );
}
こんな感じじゃね?
63 :
62 :03/09/16 21:34 ID:???
あ、openとこ間違ってたか。 正しくは、こう。 open ( FILE, $dir.'/'.$file );
64 :
49 :03/09/16 22:17 ID:???
>>62 >>63 あーそうでした。
chomp忘れてました・・・
ありがとうございました。
65 :
nobodyさん :03/09/16 23:18 ID:R8eB7Ifo
<input type="submit" value="合計" class="button1"> というボタンを小さくしたいのですが、 どうやったら出来るでしょうか?
Perl コーディング初心者質問コーナー Part28 1 名前:nobodyさん 03/09/15 03:01 ID:hl+VfJ8P いらっしゃーい、Perlのコーディングで困ってる人のスレです。
>>65 とりあえず、Perlじゃできないとだけ。
68 :
65 :03/09/16 23:29 ID:R8eB7Ifo
タグじゃないよね?
69 :
65 :03/09/16 23:32 ID:???
でもさあ、知ってるんならぱっと答えれば良い事だし、 煽ってる奴は結局知らないだけなんだろうな。
>>65 とりあえずマジレスしとくと、
Javaスクリプト池
うん、知らないよ。
72 :
nobodyさん :03/09/16 23:39 ID:eIqFz7x6
print qq(<input type="submit" style="width:5px">);
73 :
32 :03/09/16 23:41 ID:???
>>65 デスクトップ上で右クリックして解像度を最大に上げてみてください。
なかなか愉快なスレですね。
>>65 ボタンの大きさとかどうでもいい。
そんな枝葉末節にこだわる奴が作るもにロクなものはなさそうだ。
ついでに、スタイルシートの本が一冊あれば全て解決するようなことを聞く奴も、
ロクなもんじゃない。
スレ違いでも悪びれずに、煽って答えを催促するのはDQNの常套手段。
放置もできずにこぞって餌をやる奴もよっぽど迷惑だがな
人が良いな・・・おまいら。
あのー。かなり初歩的で初心者な質問なんだけど…。 sjisで「ー」を使うとエラーになるのはなぜでしょう?? 正規表現でも使えないし、 以下のように書いただけでもエラーになるんですが…。 $main::ref = { q[ティーカップ] => { #略 }, }; まぁ、普段はEUC使ってるんだけどね。
>>80 「ー」の2バイト目が [ と同じ文字コードだから。
>>80 次のコードを実行してみ。
#!/usr/bin/perl
$_ = <<'EOF'; # $_に「ティーカップ」を代入
ティーカップ
EOF
tr/\x7f-\xff//d; # 8ビットコードを除く
print; # 表示
<<'EOF' は、デリミタ以外のどんな文字列でもエスケープせずに代入できるから、
どうしてもShift_JISでやりたいなら覚えておくと便利かもな。
まぁどのみち初心者にお勧めはしないけど。
83 :
80 :03/09/17 03:25 ID:???
(´Д`;)
>>81 ありがとう。
sjisなんてもう使わないよ。sjis使うとイツーモ起きるんだよね、こゆーの。
ホントはwinでパパッと動かす時はsjis使うのが手っ取り早いんだけどなぁ。。
84 :
80 :03/09/17 03:29 ID:???
>>82 時間差。ありがとう。
でも、そんなめんどくさいの嫌いだし、文字コードもめんどいから全然覚えてないんだよね。
「\」になるsjisは少し覚えてたけど。イツの間にか。
85 :
82 :03/09/17 03:30 ID:HZ7eFLYT
>>83 必要のない半角カナコードを残すために、無理矢理ASCII領域に片足を突っ込むような
無理矢理な文字コード体系を思いついた某マイクロソフト社が全て悪い。
・・・ということにしとけ。
>>84 全部の文字の前に入れとくと吉かも。それでもエラーが出る場合は、文字の後にも。
全部の文字の前に「\」をな。分かると思うけど。
87 :
82 :03/09/17 03:50 ID:HZ7eFLYT
ちと作業待ちでヒマなので余計だとは思うが、知らない人もいるかもしんないので追伸。 Shift_JISの2バイト目で、ASCII領域に引っかかってるのは、\x40-\x7Eの範囲。 この中で、記号に属するのが、 @ [ \ ] ^ _ ` { | } ~ とこれだけ。だからq[..]を使うのはちょっと危険かもな。 クオートや「$」が混じる心配しなくて良い。ダブルクオートで囲むと 「@」と「\」が問題になるが、シングルクオートなら問題になるのは、「\」だけ。 んで、2バイト目が「\」の場合、どうやってエスケープするかというと、 その後ろに「\」を連ねれば、2バイト目を含めて「\\」となりちょうど エスケープされた状態になるので、うまく行く。かなり強引な解決方法。 <<'EOF'ならその問題もないが、コードが読みにくくなるのが難点。
>>80-86 Shift-JISに関する話題は呆れるくらい繰り返されてるよな。
どうしてもShift-JISじゃなきゃダメな時はgettextやResourceBundleのようなものを作れと言いたい。
ところでShift-JISじゃなきゃダメな時ってどんな時?
ActivePerlはEUCやUTF-8じゃダメなの?
・エディタがEUC対応してない ・シフトJIS出力なのでシフトJISで書いたほうが変換とかしなくてすむ ・めんどくさい ・わからない どれも本人の努力なり工夫なりでなんとかできる。
2番目の「変換しないですむ」と、 3番目の「めんどくさい」って理由はけっこう正当だと思われ。 ビシッした物じゃなくて、 数分で作って1回使ってポイ。なんてコトもあるしねー。(さらにそれを連打で繰り返しってコトもあるし) あとは、クウォートした文字列のビットまでイチイチ考えなきゃならないのもやってられん。 結論:だからEUC使え。WINだと手っ取り早くなくて嫌ならUNIX使え。Mイクロ死ね。
ちゃんとわかってSJIS使えるならそれでいいと思うよ imodeなどの携帯サイトもあるしね
というかJcode使うのだ。
Encode使えよ
どれでもいいじゃん
95 :
教えて君 :03/09/17 15:18 ID:oNybdODB
あぼーん
98 :
nobodyさん :03/09/17 16:58 ID:VZUOb5JF
print おーばーらいどしたら?
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
たまには回答しろよなコピペヲタクちゃん(w
>>106 if文すら理解できない小学生に無理難題を押し付けちゃ駄目だよ
バカの後に不必要な>>xxでリンクつけないほうがいいよ。
新入社員キタアアアー(=゚ω゚)ノ 女の子とは無縁だと思ってたうちの職場に、つっここついに花が咲いたよ!! つうか、22歳でPerl、PHP、JSPサラサラ書いてるんですが…。僕負けてますが…。 ここまできたらPerlマスターになるしかないか(つд`)
┌────┐ / ̄\ 「全部彼氏に教わったらしい・・」
│┌──┐│| | と
>>109 がうなだれてる夢をみますた。
│| ││ \_/
┌─┘│ ││
└──┘ └┘
113 :
nobodyさん :03/09/17 22:47 ID:uqvgNz0w
おれに答える知識があるわけねーだろ!ヴォケ!!それより下げろよ、コノヤロー!
(巛ミ彡ミ彡ミ彡ミ彡ミ彡)ミ彡ミ彡)ミ彡)
,,从.ノ巛ミ 彡ミ彡)ミ彡ミ彡ミ彡)ミ彡)''"
人ノ゙ ⌒ヽ 彡ミ彡)ミ彡)ミ彡)''"
∧_∧ ,,..、;;:〜''"゙゙ ) 从 ミ彡ミ彡)ミ彡,,)
√(:::.`∀´)アヒャヒャヒャヒャヒャ!_,,..、;;:〜-:''"゙⌒゙ 彡 ,, ⌒ヽ 彡"__∧ あ゛〜
| (:::..、===m==<|::::::゙:゙ '"゙ ミ彡)彡'
>>109 )
|_=|:::. |::. | ' ``゙⌒`゙"''〜-、:;;,_ ) 彡,,ノ彡〜''" ,,ミつ つ
(__)_) ゙⌒`゙"''〜-、,, ,,彡⌒''〜''"人 ヽノ,,ミ 人 ヽノ 熱いよ〜
"⌒''〜"し(__) し(__)"''〜し(__)助けて〜
∧ ママーン
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| Perl使うアホどもを抹殺完了!!
いくら放置しろっつっても頭ポッポーな馬鹿がいるからなあ
115とかな。
Perl標準の暗号化する関数としてcryptがありますが、復号が可能な 強度な暗号化関数というものは通常どういったものがあるのでしょ うか。 初心者質問ですみません。
>>117 暗号化のアルゴリズムはPerlとは直接関係ないので、
暗号化スレに行くべし。
プログラム技術板か、セキュリティ板にないか?
>>118 Perlにそういう関数がないか聞いているんですが。
>>119 リファレンス見るだけで済むようなことを聞く奴は嵐も同然。
標準関数じゃないけどCPANにモジュールが幾つかあったな。あとは自分で探せ
122 :
nobodyさん :03/09/18 03:00 ID:t5UOEVw8
掲示板の書き込みで、禁止ワードを 作って、その言葉は書き込めない様 に設定したいんですが、 perl でどう書けば良いんでしょうか?
>>122 if ($input =~ /$ngword/){&error;}
こんな感じ?
>>89 カメレス気味かもしれんが、
おいらは、ありがちなコードは単語登録してる。
プリコン⇒print "Content-type: text/html\n\n";
ジェイコン⇒&jcode::convert(\$in{$key}, "euc");
みたく。
ウリャ⇒&jcode::convert(\$HTMLALL, "sjis");
みたくポリシー決めときゃ、らくじゃない?
ただ、print "Content-type: text/html\n\n"; を忘れて、そらで言えなくなってしまうが・・・
あのーーーーーー。 { if(my $aaa){ } } こーやって書いたら、$aaaはドコのスコープで有効カナ? ifブロックの中が俺の期待値なんだけど。
>>124 俺もそれやってる。
そけっと -> socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
とかね。
ビジネス文章もかなり登録してある。
へいおせ -> 平素お世話になっております。xxのxxでございます。
さしゅけん -> 以上ご査収の上、宜しくご検討下さいますようお願いいたします。
関係ないのでsage
>>125 やってみりゃいーじゃん。フック入れるのがそんな面倒か?
>>125 my $aaa = 1;
{
my $aaa = 2;
if (my $aaa = 3) { print "if1: $aaa\n" }
if ($aaa) { print "if2: $aaa\n" }
print "in: $aaa\n";
}
print "out: $aaa\n";
この板ばかり構わないで他の板も見て欲しいな。
優しくね!!
131 :
nobodyさん :03/09/18 20:28 ID:uVnVZUjf
DB_Fileってのが便利そうだったから、とりあえずRECNOを試してみたらプロバイダでうごかねー。 MT動いてるのになぜだと思ってよく調べたらHASHとBTREEしか使ってやがらねー。 RECNOって使えないもんなん?マジ時間無駄にしたよー!!
>>131 最低30〜50メガくらい(目安)の規模にならないと、DB_File自体無駄。
そこまでやるなら、DBMS使おうぜ。
1. A.pl から B.pl を 1 分おきに実行させたい。 2. 以下のようにしてみた。 A.pl の内容 open (PID,">./A.pid") or die "Can not touch 'A.pid' :$!"; print PID $$; close(PID); chmod 0600,"./A.pid"; for(;;){ unless(-e "./A.pid") { exit; } # ./A.pid が存在しなければ終了。 if (time % 60 == 0 && not -e "B.pid") { system "./B.pl &";} ほかの処理(数秒で終了) } B.pl の内容 open (PID,">./B.pid") or die "Can not touch 'B.pid' :$!"; print PID $$; close(PID); chmod 0600,"./B.pid"; 処理(数秒で終了) unlink("./B.pid"); exit; 3. B.pl の終了を待たずに A.pl の作業を続けたいのですが、このような礼儀作法でよいのでしょうか?個人的には少々強引すぎるように感じているのですが。
134 :
age :03/09/19 00:18 ID:6y2Z5YTQ
HTML出力が途中で止まる現象が起きています。 サブルーチンsub1,sub2があり、 MAIN:からsub1を実行するとちゃんと出力されるのですが、 sub2で条件分岐してsub1を呼び出すとHTMLが途中までしか出力されません。 sub1を呼び出すときに引数は無く、またsub1の最後でexitしています。 コードがないと何とも言えないと思いますが、 「これが原因では?」ってのありましたらお願いします。
>133 sleep 60; した方が。 別に *.pid 作らなくてもpsの結果見た方がファイル操作なくて楽な気がするし。 >134 とりあえず、 $| = 1; しとけ
136 :
134 :03/09/19 00:53 ID:???
>>135 ググってみたんですけど、理解できんかった・・・
出力をバッファリングしなくなる???
どこに書いたらいいのかもワカリマセン。
>>136 コード晒したほうが早いと思うが
ま、$| = 1; はわからないならコードの先頭に書いておけば
>>136 プログラムの一番最初(とは言っても#!/usr/bin/perlとかのあと)に、
BEGIN{
print "Content-Type: text/html\r\n\r\n";
open(STDERR, ">&STDOUT");
$| = 1;
}
$SIG{__DIE__} = sub { print @_; exit }
って書いてやってみろ。詳しくは面倒だから省略。
139 :
136 :03/09/19 01:09 ID:???
Scalar found where operator expected at hoge.cgi line 24, near "$Conf" (Missing semicolon on previous line?) syntax error at hoge.cgi line 24, near "$Conf " BEGIN not safe after errors--compilation aborted at hoge.cgi line 31. こんなん出ました。どういうことでしょう?
140 :
138 :03/09/19 01:11 ID:???
>>139 やっぱエラーで止まってたか。
みての通りだ。24行目が間違ってる。前の行のセミコロンがないのでは?
とか言ってやがる。あとは自分で調べれ。
141 :
139 :03/09/19 01:14 ID:???
>>140 えぇと、24行目より前はコメント行と上記のコードしか無いんです。
う〜んもうちょっと調べてみます。
ありがとうございました。
142 :
138 :03/09/19 01:35 ID:???
つーか、セミコロンがねーの俺のコードじゃねーか。 俺のバカバカバカ。 BEGIN{ print "Content-Type: text/html\r\n\r\n"; open(STDERR, ">&STDOUT"); $| = 1; } $SIG{__DIE__} = sub { print @_; exit }; 何回もスマンが、これでもっかいやってみてくれ。
143 :
141 :03/09/19 01:42 ID:???
>>142 上記コード入れましたが、エラー出ませんでした。
で、自分なりに色々調べてみて、KCatchていうモジュール
http://www.kawa.net/xp/index-j.html を入れてみました。
んで実行したところ、
[hoge.cgi:20:die] Global symbol "$Admin_password" requires explicit package name.
Global symbol "$Send_BCC" requires explicit package name at (eval 1) line 10, <DATA> line 2392.
Global symbol "$Conf" requires explicit package name at (eval 1) line 16, <DATA> line 2392.
Global symbol "$Jcode" requires explicit package name at (eval 1) line 17, <DATA> line 2392.
Global symbol "$Mime" requires explicit package name at (eval 1) line 18, <DATA> line 2392.
BEGIN not safe after errors--compilation aborted at (eval 1) line 23, <DATA> line 2392.
といろいろ出ました。
これは変数名が悪いってことでしょうか?
144 :
138 :03/09/19 01:44 ID:???
お手数取らせたので、お詫びといっちゃなんだが、
>>143 プログラムのどこかで、 use strictしてるからだと思う。
use strict;を入れてると、全てのユーザー変数は$main::Conf のように、明確にパッケージを指定するか、
使う前にmy宣言をする必要がある。
145 :
141 :03/09/19 01:49 ID:???
本体、requireしてるファイルなどなど調べてみましたが、 use strictしてないですねぇ・・・ 試しに変数名変えてやってみます。
>>133 00秒ジャストでチェックを通らないと、b.plを起動できない罠。
どっかに分を記録して、それを比較しる。
147 :
141 :03/09/19 02:08 ID:???
変数名変えてもダメでした。 少し進展。 $Admin_passwordなどのMAIN:以前で宣言してたのを、 MAIN:の中に入れたら上記のようなエラーが沢山出た・・・ (Global symbol...ってやつ) これ全部パッケージ指定しないと・・・だめですか?
%hash = ('a' => 1, 'b' => 2 ...); とこれが200個くらい続くのですが、何か効率の良い書き方が ありましたら教えてください。
$_[0]=~s/(\W)/sprintf("%%%02X", ord($1))/eg; と $_[0]=~s/(\W)/'%'.unpack("H2", $1)/ego;} urlエンコードの違いについて教えて下さい。
>>149 処理が違ってて、結果は一緒。
処理速度は当然違ってくるけど、問題にはならんじゃないかねぇ
>>148 my $i = 0;
my %hash = map{$_ => $i++} ('A'..'Z', 'a'..'z', '0'..'9', '+', '/');
>>149 アルファベットが大文字か小文字かぐらい?
下のoオプションはいらないと思う。
>>148 %hash = qw(
a 1
b 2
c 3
d 4
e 5
);
qw()で囲むと、split /\s+/したような結果になる。
>>148 別解。
my @a = ('A'..'Z', 'a'..'z', '0'..'9', '+', '/');
@hash{@a} = (0 .. $#a);
>>151 の方が余分な変数使わない分すっきりしてるけどね。
>>154 ログ見れば分かるだろ。馬鹿かこいつは。
>>134 > MAIN:からsub1を実行するとちゃんと出力されるのですが、
> sub2で条件分岐してsub1を呼び出すとHTMLが途中までしか出力されません。
> sub1を呼び出すときに引数は無く、またsub1の最後でexitしています。
ここまでのレスを読んでいると、134は変数のスコープも知らないと
思われる。
言うまでもないことだが、何も宣言せずにsub1,sub2 で同じ名前の変数
を使うと、同じ変数として扱われる。
「sub1で使用する変数をsub2でいじってしまった」ということがオチ
だと思われ。
>>156 それじゃ、途中で止まっちゃうことの理由が説明つかないじゃん。
変数の内容を間違っていじったくらいで、
>>142 のフック入れて
何も表示されずに途中で終わるような現象が起きるとは考え難いんだが。
158 :
147 :03/09/19 14:40 ID:???
>>157 >何も表示されずに途中で終わるような現象が起きるとは考え難い
補足ですが、HTMLの途中までは表示されるんです。
で、ブラウザのステータス部分には「ページを開いています」と。
$|=1;した場合はページは全て表示されますが、「ページを開いています」と出続けます。
もうソース出しましょうや
>>158 だからそのおかしいコード晒せよ
ここはクイズコーナーじゃないんだよ
161 :
nobodyさん :03/09/19 15:05 ID:CWu85PEx
>>158 > で、ブラウザのステータス部分には「ページを開いています」と。
おいおい、なんでそういう一番大事なところを黙ってるかなあ。
そりゃどっかで無限ループしてんだよ。ソース、特にループ部分を最初から見直せ。
> $|=1;した場合はページは全て表示されますが
おいおい、それ早く言えよ。なんでそんな大事なことを書かずにほっとくんだよ。
症状が変わるかどうか確かめるために、みんな$| = 1しろって言ってるんじゃん。
「エラーがでない」だけじゃ症状変わらなかったんだと思うだろ?
俺はてっきりどっかでcore dumpでもしてんのかと思ったよ。
162 :
158 :03/09/19 15:20 ID:???
すいませんでした。ループ部分見直します。
163 :
156 :03/09/19 15:50 ID:???
>>158 やっぱりソースを見せてもらえないとわからないね。
しかし、その前にプログラムを単純化してね。
最も単純化したプログラムというのは、つぎのようになると思うが、
ここまで単純化する以前に正常に動くようになるだろう。
その時点で、正常に動くようになった前後のプログラムの違いを明確にして
もらえると、アドバイスしやすいと思うが。
MAIN:{
sub2;
}
sub sub1{
# 何かhtmlファイルを出力するルーチン
exit;
}
sub sub2{
sub1;
}
164 :
148 :03/09/19 15:55 ID:???
>>151-155 ごめんなさい、説明不足でした、、、
%hash = ('a' => 1, 'b' => 2, 'f' => 4, 's' => '#' ...);
こんな感じで不規則なんです。
雰囲気壊してしまいましてごめんなさい。
ただ、お答えいただいた方々のご意見は非常に非常に
勉強になりました。
これらを参考に、さらにいろいろ勉強したいと思います。
本当に有難うございました。
166 :
133 :03/09/19 16:20 ID:???
返事が遅れまして申し訳ありません。
>>135 sleep 60; だと微妙にずれては来ないでしょうか?
・・・といっても、ずれたからといって実害は出ないから大丈夫かもです。
*.pid は、将来的には A.pl の起動スクリプトを作ろうかと考えていまして。
init.d の起動スクリプトのような。
>>146 なるほど。
脳内では「スカポンタンしない」で考えてみましたが、そうなることも考えられますよね。
こちらは対処してみようかと思います。
あと、気になっているのが「system "./B.pl &";」のようにバックグラウンド起動する点です。
バックグラウンドで起動させる実行制御関数というものはあるのでしょうか?
do、eval、require、use、``、qx()では実行結果を待っているようなので。
200以上あるんなら、下のようにしてファイルの尻に引っ付けるのも 手だけどね。 while(<DATA>){ chomp; my($key, $value) = split; } …別のコード… __DATA__ a 1 b 2 c 3 d 4 f 8 * z : : :
>バックグラウンドで起動させる fork で
> do、eval、require、use、``、qx()では実行結果を待っているようなので。 全然関係ないものが多数混じってる気がするが。
170 :
nobodyさん :03/09/19 19:58 ID:AgTkEqqe
ねぇねぇ、最新10を表示させるにはどうするの?
>170 新しいところから十回回してプリント汁。
??????
>133,166 for(;;){ something if (time %60 == 0); } だと、CPU常に100%使ってる気がするんだけど? nice値下げとくとかしないとつらい気が。 ところで、cronじゃだめなのか?
176追加 配布とかしたりするんでなければ、daemontools使えばよろし。
178 :
148 :03/09/19 21:39 ID:???
>>165 ,
>>167 有難うございます。
最終的に、
my %string = qw(a I b u c p ...);
こんな感じで決まりました。
これでもちゃんと a=>I, b => u とやってくれるんですね。ちょっと驚きました。
いろいろなご意見、本当に有難うございました。
$moji = 'abcde'; の$mojiをそのまま@mojiにして$moji[0]がaとなるような 効率の良いやり方はないでしょうか。 1文字ずつ処理するしかないですかね。 これが一番速度的に速ければこしたことないのですが
180 :
133 :03/09/19 22:18 ID:???
>>168 ,171
fork すると自分自身が親プロセスなのか子プロセスなのかの判定が必要になってきますよね?
鯖プログラムではないのでそこまでは考えていませんでした。
>>169 ちょっと範疇を広げすぎたかもしれませんですm(_ _)m
>>176 ,177
nice 値が低いので、別プロセスが動くと CPU 稼働率が下がることは確認できました。
現状では crond で動かしているのですが、止めたり再稼働したりするのが不便なので
>>133 のような機構をやってみた次第です。
ゆくゆく安定して稼動するようになれば、/service に放り込んでみたいと思います。
>>179 my $moji = 'abcdef';
my @moji = split '', $moji;
print $moji[0];
182 :
133 :03/09/19 22:19 ID:???
>>179 @moji = split(/ */,$moji);
ってのは如何でしょう?
183 :
133 :03/09/19 22:21 ID:???
見事に被ってしまいましたね(恥)
>179 ぱっと思いつくのだと、(split以外で) -- for (my $i; $i < length($moji); $i++) { push @moji, substr($moji, $i, 1); } -- while (length($_ = chop $moji)) { unshift @moji, $_; } -- @moji = ($moji =~ /./g); 試してみたけど、上の2つはsplitより遅くて、 正規表現はsplitよりちょっとだけ早い
>133 気持ち悪いかもしれないけど、すでにcron使ってるなら A.pl で起動時に -e A.pid だけして、 起動スクリプトで/var/run/A.pid の作成だけやる B.pl は ps ax| awk '{print $5}'| grep '^B.pl'| wc -l な感じ。 pid使わない+起動スクリプトな方向で考えてたら、よけいややこしくなったw
>>179 @moji = unpack 'A' x length $moji, $moji;
187 :
185 :03/09/19 22:55 ID:???
133見直したら、A.plは常駐してB.plを監視するのが目的なのね。 A.pl を cron してたら意味ないじゃん。 185はむしって
qwって、 qw( ! " # $ % & ' ( ) = ~ ^ | \ ` @ { [ + ; * : } ] < , > . ? / _) こんなふううにつかうと、もちろんエラーが返ってきますが、 正規表現でいう\Q\Eのようなものとうまくあわせて使う 良い記述方はありませんか。 質問わかりにくくてスマソ
qwがどういうものか理解できていないのでは・・・
>>189 qw( ! " # $ % & ' ( )
で終わっちゃうから無理っしょ
大人しくsplit使うのがいいと思われー
エスケープ無しで全てのアルファベットと記号をリストにするって可能?
qw( ! " # $ % & ' = ~ ^ | \ ` @ { [ + ; * : } ] < , > . ? / _) ,qw[( )]
194 :
193 :03/09/20 08:28 ID:???
素直にエスケープしろ
逃げちゃだめだ
>>192 @chr = map chr, 32..126;
>>191 POSIXなshならecho $(echo $(pwd))とかできるんだから、ちゃんとパースしないのは怠慢。
>>198 いや、それは変だ。動くだけで、意図した結果にはなってないんじゃないか?
print join ",", qw(! " # $ % & ' ( ) = ~ ^ | \ ` @ { [ + ; * : } ] < , > . ? / _); --結果 !,",#,$,%,&,',(,),=,~,^,|,\,`,@,{,[,+,;,*,:,},],<,,,>,.,?,/,_ なんか問題あるのか?
スペースは?
スペースも入れようとしてたん? 「全てのアルファベットと記号」にゃスペースは入らんと思ったけど。 スペースは無理だろうね。エラーはでらんけど
>perl -e "@a=qw(! \" # $ % & ' ( ) = ~ ^ | \ ` @ { [ + ; * : } ] < , > . ? / _);" > の使い方が誤っています。 windowsは糞
別に qw((((()))));でも動くぞ。
>>191 >>197 >>199 おまえら試してから書けよ。
qw()の中にShift_JIS入れてハマってるヤツが別スレにいたなあ・・・。
>201 デリミタに日本語使うとか。 やった事無いから出来るか知らんが。
Perlの場合、シングルクオート中に含まれて特別な意味を持つ文字って、 \\ \' ' の2つだけですよね?ということは、Shift_JISは「'」を含まないので、Shift_JISをクオート中に 含ませた場合に出る問題というのは、最後のクオートの前に「\」が含まれる文字が出た 場合だけだと考えて良いでしょうか? だとすると、常に 「\」はきちんとエスケープして「\\」と書くようにし、chop($abc = "シフトJIS文字列 "); のように、 一文字余分に書いておけばエラーはでないということで良いでしょうか? #正規表現などでも問題がでるのは知っていますが、今回は変数に代入することだけ考えています。
> の2つだけですよね? 2つじゃなくて3つの間違い
>>206 >シングルクオート中に含まれて特別な意味を持つ文字
んなもんありません
馬鹿はほっとけ
>>208 いや、そこは知ってるんですが、「シングルクオートで囲って、最後の1文字を空白にしてchopする」
という解決策がどこにも見当たらないので、その正当性について質問してる次第です。
まずそんなアフォなコードを書かなくてすむようにしたほうがいいんでないか?
use strict使うと、 ${"test$num"}[$a] これでどうしても引っかかってしまいます。 何か良い方法はないでしょうか。
use strict; no strict 'refs'; でOKだけど、そんなモン使わずに済む方法を考えた方が良い。
>>214 自分が書く時は常にEUC-JPで書いてます。
「Shift_JISを使う場合、シングルクオートで囲って、最後の1文字を空白にしてchopする」
が正しく動作するかどうか単に興味があるだけです。
>>218 とりあえずkakasiで分割した文を適当にパースさせて回してみた結果、大丈夫なようには
見えるんだけど、こういう方法って意図的にやらないと再現しないような欠陥があったり
するじゃない。
まぁ手法自体に対する批判がつかないところを見ると、客観的に見ても致命的な欠陥は
見当たらないってことなんだろうけど。
理屈としては上手くいくはずですが、こんなに単純な方法なのに、
提示されている場面を見たことがなかったので、イマイチ自信が持てないのです。
理由がない限りはchopなんか使うな。 chompの方が安全だろ?
>>219 リテラルなら、エラーが出るか、テストしていれば分かる問題で、
その場で対処できれば、問題ないから。
>>217 そもそも、何のためにそんな処理してんの?
想像できないんだけど。
テンプレートを読み込んで置換して表示と言うのをやろうとしているのですが、 表とかリストみたいにタグ自体の数(と言うか行数)が変わってしまうときってどうやってますか? --出力-- <ul> <li>str1</li> <li>str2</li> </ul> --テンプレート-- <ul> <li><!--str--></li> </ul> や <ul> <!--str--> </ul> とか。 後者が楽なんですがスクリプト中から完全にタグを取り去ってないと言うところが引っかかって 前者の方法でやりたいなとか思ってるのですがどうにもやり方が思いつきません…。
>>220 chompだと動かないと思いますが……。
>>223 あ、それがありますね。ありがとうございます。
EUCでの
'表\' '
と同じ動作にしようと思った場合、Shift_JISだと
'表\\\\' '
としないと文字化けしてしまいますね。
>>224 >>206
>>225 HTML-Templateモジュール使え。
--テンプレート--
<ul>
<!-- TMPL_LOOP name="loop" -->
<li><!--TMPL_VAR name="str"--></li>
<!-- /TMPL_LOOP -->
</ul>
>>225 個人的には、sprintf で追記しちゃう。。。
$tmp =<<"EOS";
--テンプレート--
<ul>
%s
</ul>
EOS
ループ〜
$str .= qq(<li>いろいろ</li>\n);
〜ループ
printf $tmp,$str;
みたいな・・・
>>226 なんか禿しく勘違いしてるようだけど、特別な意味を持つ2バイト目の“\”をエスケープ
しなけりゃ駄目だろ。
×'表'
△'表\ ' ←結果的には\225\\になるけど、2バイト目をエスケープしているわけではないから△
>>226 Shift_JISなら
'表\\' '
では?
この問題は、Shift_JISに対応していなくて、文字リテラルで\が特別な意味を持つ
プログラミング言語すべてにあてはまると思うけど、他の言語ではどうやってるんだろうね。
>>230 あ、そでした。[表\' ]という文字列をぶちこもうとしてました。失礼。
てことは、'表\\\' 'の場合も引っかかりますね。この場合は
>>226 に書いたように、
'表\\\\' 'としないとNG。
HTML::Templateって標準モジュールじゃないのね… と言うわけでこれからインスコしてみます。 #どうでも良いが perl -MCPAN でインストール出来なかった…
>>232 実は、特別にインストールしなくても使える罠。
荒っぽいけどねー。
鯖に置くなら、鯖の中にHTMLディレクトリを作って、その中にTemplate.pmを置く。
楽なのは、HTML::Templateを使うスクリプトと同じディレクトリにHTMLディレクトリを置いて、
スクリプトの方からuse HTML::Template;することだな。
use libした方が、後々便利かも知れないが。
一度CPANのセットアップを済ますと、もうそれしか使えない。
>>235 それならそれでいいじゃないか。
CPANが使えないレン鯖ならどうする?
そうだったのか・・・。勉強になった。 レンタルサーバで動かすかもしれないから、という理由で使ってこなかったなあ
WinでMCPAN installするとtar.gzが展開されないらしいのですが 展開用ツールって何処にあるのですか?
pure Perl のモジュールは全部この手が使えるらしいぜ?
>>236 telnet出来るところならどこでもつかえるが。
そうでないところじゃ、事実上モジュールなんて使えないも同然だろ。
こないだ、Win鯖のレンタル領域で、 モジュールが両手の指で足りるくらいしか入ってないとこを見た。 素直にクライアントには、この領域で仕事すんのはやめた方がいいと告げた。 まあ、この仕事は結局なしになったんだが。 思うのは、最低限の標準モジュールが使えないとなると、 非常に仕事がやりにくくなると言うことだ。 Perlのバージョンにもよるだろうが、今更Perl4とか、5.0とか言われてもやる気が失せる。
242 :
nobodyさん :03/09/21 20:10 ID:YI8JPbKq
正規表現を使った文字列置換で、うしろからやる方法教えてください。 my $str = '01230123456'; $str =~ s/0123/aaaa/; # これだと aaaa0123456 $str =~ s/0123/aaaa/g;
243 :
nobodyさん :03/09/21 20:11 ID:YI8JPbKq
すまん、途中で書き込んでしまった、、もういっかい。 my $str = '01230123456'; $str =~ s/0123/aaaa/; # これだと aaaa0123456 $str =~ s/0123/aaaa/g; # これだと aaaaaaaa456 じゃあ どうしたら 0123aaaa456 にできるのか。
>>243 最長一致を応用すればいい。
$str =~ s/(.*)0123/$1aaaa/;
245 :
nobodyさん :03/09/21 20:19 ID:YI8JPbKq
うぉぉ、サンクス。
文字列探すなら、indexで後ろから探して、substrで置換した方が早いとイッテミル
>>245 それをやるとマッチ行こうが消えると言うカワイソウな結果に…。
>247 ネタ?
249 :
247 :03/09/21 23:21 ID:???
>>248 いや。「勘違い」です。きわめてごめんなさい。
250 :
:03/09/21 23:28 ID:???
Template.pmで__FIRST__って使えなくなるバグあるの?
251 :
nobodyさん :03/09/22 00:07 ID:iyIOOC/l
上級者スレから流れてきました。よろしくお願いします。 CGI::new()で得たCGIハンドルからredirectを呼び出してリダイレクトする場合、 与えるURLはあらかじめURLエンコードしておかなくてはいけないのでしょうか? それとも、日本語などが混じっていても自動的にURLエンコードしてくれるのですか?
>>251 やってみろよ。一から十まで聞いて作る気か?
URLエスケープされるってことは
$q->redirect("
http://hoge ");
が、
Location: http%3A%2F%2Fhoge
になることぐらい予想できんのか
>>246 indexって後ろから探す機能なかったよね。
$pos使って後ろから探させたらindex+substrの方が3倍以上遅くなったけど。
インデントは面倒だからつけなかった。許せ。
index+substr: 5 wallclock secs ( 4.87 usr + 0.00 sys = 4.87 CPU) @ 2054.57/s (n=10000)
s///: 1 wallclock secs ( 1.44 usr + 0.00 sys = 1.44 CPU) @ 6956.52/s (n=10000)
#!/usr/bin/perl
use Benchmark;
$str = 'woejpaowuehfiwauhfwuhfiwugfuawbjkhsbvi0123jwanipeufhwibvj0123hwbvoiwayefoiujvkljbiwuhf0123opiwuefhiwjnefkjhkjhfpiwhuf';
$target = '0123'; $sub = 'aaaa'; $count = 100000;
timethese($count, {
's///' => sub {
$_ = $str;
s/(.*)0123/$1$sub/;
#print "$_\n"
},
'index+substr' => sub {
$_ = $str;
$pos = length($str) - length($target);
while($pos > -1){
last if (($found = index($str, $target, $pos)) > -1);
$pos --;
}
substr($_, $found, length($target)) = $sub;
#print "$_\n";
},
});
__END__
おっと。 s/(.*)0123/$1$sub/; は s/(.*)$target/$1$sub/; の間違い。やり直してみたけど結果は同じ。 index+substr: 4 wallclock secs ( 4.77 usr + 0.00 sys = 4.77 CPU) @ 2094.93/s (n=10000) s///: 1 wallclock secs ( 1.49 usr + 0.00 sys = 1.49 CPU) @ 6701.57/s (n=10000)
>253 いやほら、上級者だから(藁 >254 スマソ rindex 使ってくれ
ところで、rindex の "r" って、何の略?
れろれろ
reverse(d)?
>>256 おっけ(w
rindexなら圧倒的に早い。
index+substr: 6 wallclock secs ( 5.37 usr + 0.00 sys = 5.37 CPU) @ 18631.73/s (n=100000)
s///: 16 wallclock secs (14.85 usr + 0.00 sys = 14.85 CPU) @ 6733.30/s (n=100000)
'rindex+substr' => sub {
$_ = $str;
$found = rindex($str, $target);
substr($_, $found, length($target)) = $sub if $found > -1;
#print "$_\n";
},
>>257 マニュアルくらい嫁。というか、逆順に探すんだから想像つかんか?
>>261 だって、JavaScriptだと lastIndexOf で "エル" なんだもん。
だってじゃねーよバカ
>>262 Larry WallがLとRを間違えたと言いたいのか?
あんな名前にLとRが混じりまくってるやつが間違えるわけないだろ。
Rally Warl?
CGI.pm(Ver2.89) から $query->start_html とかやって XHTML の頭が出るんですけど、 ついでに出力される XML宣言の encoding属性の値ってどーやって変えるんでしょか? デフォだと UTF-8 だけど、これをShift_JIS に変えたりとか。
perldoc CGI
初心者スレだし言っとく 1にマニュアル 2にgoogle 3,4が無いようなので 5に2ちゃん
271 :
267 :03/09/22 02:36 ID:???
あー、ごめん。ウソ書いてた。 CGI.pmのバージョンをよくよく見直したら 2.75 なんてフルすぎな奴だった。 ソースみたら utf-8 でオンコーディングしてるし。 # マニュアルみてもググっても見つからないわけさね。 ver3.00に上げたら治りました。逝ってきます。
272 :
nobodyさん :03/09/22 18:09 ID:7DCR1SyV
まず、ROMの定義は何かね?
>>272 マルチはんたーい。
コピペはんたーい。
スクリプトの内容を読もうとしない奴に改造とかする権利はなーい。
210.153.84.0/24 このIP範囲を判別したいのですが、 $ENV{'REMOTE_ADDR'} =~ /^210\.153\.84\.[0-255]$/ こんなイメージでかける一番手っ取り早い方法はありませんでしょうか。
$mask = 0xffffffff << (32 - $subnet); $ip_address = ($ip[0] << 24) + ($ip[1] << 16) + ($ip[2] << 8) + $ip[3]; if (($client_address & $mask) == ($remote_address & $mask)) これなら/24 が0-32まで使える
277 :
276 :03/09/22 18:59 ID:???
ところどころ抜き出したんで適当だけどわかるよな? アドレスはsplitで分けると吉
>>274 何この自治房
>権利
( ´,_ゝ`)プッ
権利っつうか資格がないって話だな。
氏ね
>>272 コーディング丸投げなら適当なプログラマに金払ってやって貰ってくらはい。
>>278 質問に答えてもらえなかったからって逆恨みはいかんよ。
普通に考えてコピペ&マルチはイクナイだろ。
他人に改造を頼むってのもなぁ。どうせ成果物をオープンに
する気はないんだろうし、いまいち萎える。
283 :
nobodyさん :03/09/23 01:46 ID:LoXsSFLp
板に書き込まれたURLをリンクさせたいのですが何を追加させれば良いのですか?
似たような事してるスクリプトのソースみて、どうやってるか調べてみれば? それを見ても、何をやってるか分からないようなら・・・改造ならスレ違い。
>>283 <a href="・・・・">URL</a>
値から変数名を得る事って出来ますか? できるのであれば、その方法を教えてください。 $hoge = 'fugafuga'; として、 fugafuga から hoge を得たいのれす。
何ゆえそんな処理が必要かわからん そんなことしないで良いようにロジック考え直した方がいいんでない?
>>287 何ゆえそんな処理が必要かといわれれば、
とあるBBSを改造中なのれすが、必要があって選んだアイコンのログ書き込みフォーマットを
変数名($icon[数字]の数字がログに記載される)から
値(そのアイコンのアドレス)に変えちゃったんです。
それはそれで出来たんですが他の部分で不都合がありまして、値から変数名を得る事って出来たら解決なんれすが
> そんなことしないで良いようにロジック考え直した方がいいんでない?
といわれればごもっともなのれす。
grepとかで@iconの中身をスキャンして番号を得る方法になるが、なんか無理矢理っぽい。 やっぱりロジックを見直すべきかと。
AA荒らしがいない。つまらない・・・・
アク禁かかってたからか。 かけなかったぞ
292 :
nobodyさん :03/09/23 13:39 ID:1GkKuoEI
教えて頂きたいのですが。 Win2000で、現在走っているプロセス数をPerlでgetできない でしょうか?タスクマネージャを開いた時に左下に出てくるあの 数字です。 やりたいことは、「親プロセスから子プロセスを立上げようとする 時に、現在の全プロセス数を見て、全プロセス数が多すぎれば子プロ セスの立上げを待機する」ということです。
少なくとも Perl でやることじゃないと思うが。
>>292 スレ違いだが、Windowsのtlistコマンドを使えばできるかと。
Windows2000CD-ROM\SUPPORT\TOOLS\SUPPORT.CAB\tlist.exe
297 :
292 :03/09/23 14:28 ID:???
>296 にぴったりのモジュールがありました。 ありがとうございました。 use Win32::Process::Info @pids = $pi->ListPids (); # Get all known PIDs
>>288 「値から」変数名ってとってもめちゃくちゃなコト言ってるね…あんた。
ログ形式を変更せず作りたいのであれば、リファレンスを使用すれば多分OKな予感が。
なるべくシンボリックじゃなくて、ハードのほうね。
それはそうと、全然関係ないし今さらだけど、
スレ立て!
ちゃんと前スレとかヤレや!
本当の前スレが紛失したぞ。
>>288 キーをアドレス、バリューを$iconの添え字(もしくは、直接リファレンス)とするハッシュを作る。
アドホックなやり方なのは否定できないけど。
>>298 >>8 の奴は違う?
300 :
nobodyさん :03/09/23 16:00 ID:PRppzaj7
パーミッションの事で、 cgi のファイルは 705 で他のを忘れたから 書いて下さい。分かるでしょう。
301 :
298 :03/09/23 16:16 ID:???
>>299 >8のは、前々スレじゃない?
御丁寧に前スレの前スレ表示をコピーしたような。。
俺の勘違いじゃないよな?
302 :
nobodyさん :03/09/23 16:22 ID:zIFEzOvG
文字列が+−付き整数であるか(省略は+)、というチェックで以下のように書いてみたのですが、 うまく動きません。 if( $hoge =~ /^[+-]?\d+$/ ) { print '整数じゃねぇぞゴルァ!'; } これで+付きだけはtrueになるのですが、省略と−付きがfalseになってしまいます。 おそらくFAQだとは思うのですが、何かご存知の方がいらっしゃれば 「おめー正規表現わかってねーよ」とお叱りください。お願いします。
303 :
299 :03/09/23 16:24 ID:???
304 :
302 :03/09/23 16:25 ID:zIFEzOvG
>>302 trueとfalseが逆でしたね(^^;
+付きがfalse(成立せず)、−付きと省略がture(ゴルァ!と怒られる)です。
訂正してお詫びいたします。
ほんとだ Part27が行方不明だ
>>302 うちではその正規表現で問題ないみたいだけど。
Perlのバージョンはv5.8.0 built for cygwin-multi-64int
sub IsInteger {
my $num = shift;
if ($num =~ /^[+-]?\d+$/) {
print "$numは整数\n";
} else {
print "$numは整数じゃない\n";
}
}
IsInteger("10");
IsInteger("+10");
IsInteger("-10");
IsInteger("10.1");
IsInteger("hoge");
#結果
10は整数
+10は整数
-10は整数
10.1は整数じゃない
hogeは整数じゃない
>>302 [ ]の括弧の中にハイフンが入ってるからだな。
>>309 みたく先頭にもっていけばOK。
ところで、
> IsInteger("10E10");
> 10E10は整数じゃない
10E10は整数なんだけどなぁ、と意地悪を言ってみる。
>>310 perl -e 'printf("%d\n", 10E10)'
1410065408
実数だと思うぞ。
整数です。Perlの32bit整数では表現できないだけ
正の整数は実数ですが
316 :
nobodyさん :03/09/24 01:13 ID:vmnUXdRh
演算子についての質問です。 $goukei の値に23を加えるとき通常 $goukei = $goukei + 23 としますが、これを簡略化して $goukei += 23 と記述するのはたやすいですが、では条件演算子の簡略記述はどうすればよい? 例えば $goukei = $goukei ? $goukei : 0 こういうケースです。 やってることは、$goukei に何らかの値があればその値を維持、未定義ならば0を代入します。 なんでこういうことやるかってと、mod_perlでは、未定義値を参照しようとすると ワーニングが出るっしょ?それの対策です。 でもこの記述、$goukei という文字が3つもありますね。 なんかイヤじゃない?
defined $goukei or $goukei = 0; っていうのはダメ?
$goukei ||= 0; では?
319 :
nobodyさん :03/09/24 01:34 ID:vmnUXdRh
321 :
nobodyさん :03/09/24 01:38 ID:vmnUXdRh
>>320 やかましい!!!w
いやでもperlってこういう記述ができるからおもしれーなーーーーーー
322 :
nobodyさん :03/09/24 06:25 ID:ou/l0CeA
携帯電話対応掲示板スレにも書いたんですが、人がいないので
ここで失礼します。スレ違いだったらすみません。
http://specters.net/cgipon/ にあるスレッド天国なんですが、書き込んだ際にスレッドが上がらないようにするには
どの項目をいじればいいんでしょうか?それじゃスレッド式の
意味がないじゃんと思われるかもしれませんが、荒らし対策が
できないので日付順にしたいのです。もし分かる方いたらお願いします。m(_ _)m
324 :
:03/09/24 06:43 ID:???
またあんたか。
325 :
322 :03/09/24 06:47 ID:???
>>323 これは失礼しました。1は読んでなかったのですが
一応過去ログで「改造」を検索したんです。なんで当たらなかったんだろう?
とりあえずスレ汚し失礼しました。
>>316 あまりマニアックな記述をすると、後でいじる時に何をやっているのか
解りにくくなるぞ。
$goukei = 0 unless defined $goukei
のように自然言語(英語)に近い表記が得策。
オレunless も苦手。なるべく if not にしてる
俺は文章が長くなると直感的な可読性が減って苦手。 だから ||= を使ってしまう。
人によって好みが違っておもろいな
330 :
:03/09/24 14:09 ID:???
趣味で変わるわけではない様。 俺シンタクスでいいヒトと、そうでないヒトの差。
331 :
nobodyさん :03/09/24 14:21 ID:Y8yvZ7Uq
use strict; my %hash = (a => 1, b => 2); print join ',', @hash{qw(a b)}; は、OKなのに use strict; my $hashref = {a => 1, b => 2}; print join ',', @hashref->{qw(a b)}; は、エラーになる。なんで?
>>331 @hashref をデリファレンスしてる上に
@hashref は宣言されていないから当然エラー。
@{$hashref}{qw(a b)}
>>326 $a ||= 0;
は充分直感的だと思うぞ。
LarryWallもデフォルト値の設定法として推奨してた気がする。
俺シンタクスは言い過ぎ。
偶数値取るのに、
$a &= 0xfffffffe;
とかは意見が分かれると思うけど。
>>333 んな移植性悪そうなコードかかなくてもいいんじゃないだろか
$name ||= 'nobodyさん'; くらい普通だろ
>>334 ?
移植性は悪くないと思うが。
取れる値は32bitに制限されるが、そのことか?
何万回も回すようなループの中ではこういう記法は
かなり威力を発揮するのだが。
こういう場合、可読性よりも効率を優先させるな俺は。
>>335 それだと「0」というハンドルの人がnobodyさんになってしまう罠。
てすとん
>>337 少なくとも2chのBBSは0と入れると名無しになるようだ。
>>338 俺も同じことやってみた。
まさに2chがその状態だな。「0」というハンドル入れるとnobodyさんになる。
周知の事実なのかも知れんが、俺は知らなかったよ。てことは書き込み部分は
いまだにPerlのままなんだろうな、きっと。
341 :
338 :03/09/24 16:57 ID:???
これはしらんかったなぁ。メール欄に0なら何度かやったけど。
>>340 Cで書かれているのはread.cgiだけじゃなかったかな。
>>341 '0'問題はPerlの落とし穴だよね。
Larryもwhile(<HANDLE>)で、ファイル末尾の0だけの行を落としてしまう問題について
「Perlの致命的な欠陥」と言っていたように思う。
俺も不用意にunlessとか使って、'0'に定義された変数をfailさせるミスをした経験が何度かある。
話の始まりは0に初期化するやつだったから そのままにしてた。falseでも上書きされるが大きな影響ないしなあ
0
345 :
0 :03/09/24 18:56 ID:???
0
0
テストスレじゃないんだけど、名前0テスト。 たしかメール欄0はブラウザで見た時メール欄が何もないことにされていたんだよね 今はどうか知らない。かちゅだしさ
つーかオマエらここでテストするのやめろ。
>>342 最近は(どのバージョンからかは知らんけど)while(<HANDLE>)は勝手に別扱いになって、問題は起きないと思う。
今はEOFなら偽でふね<<>演算子
暫く仕事でPHPばっかり弄ってたんだけど、 久しぶりに昔の自分のCGI直してたらすげーやりたくなってきた。 終ったらPerlガリガリ書こうっと。
>>350 それは無関係
昔はwhile(<HANDLE>)をwhile($_ = <HANDLE>)と解釈するバグがあったが、
今はバグが除かれ、while(defined($_ = <HANDLE>))と解釈する。それだけのこと。
353 :
nobodyさん :03/09/25 13:19 ID:4nYFDlXP
age
354 :
nobodyさん :03/09/25 15:58 ID:65BUr4Cp
cgiをcronから起動したいんですが cgi(perl)の中で、そのcgi以下のlibディレクトリあるファイルを requireしてるんですが、cron実行時にそのrequireしてるファイルが 見当たらないとかっていうエラーが出てしまうんですが 多分パスが通ってないだけだと思うんですが perl実行時にカレントのパスを追加するオプションってあるでしょうか? cgiの配置 a.cgi (lib/a.plをrequire) lib/ a.pl cronの設定 usr/local/bin/perl usr/local/apache/htdocs/a.cgi
use lib
357 :
nobodyさん :03/09/25 16:25 ID:65BUr4Cp
>>356 一応、a.cgiの中で
require 'lib/a.pl';
とはやってるんですが
さらに
use lib;
が必要ってことでしょうか?
(すんませんが今すぐに試せる環境がないもんで・・)
require './lib/a.pl'; or use lib 'libへのフルパス';
359 :
nobodyさん :03/09/25 17:34 ID:SJg8VSvj
undefって引数を複数とれますっけ?
ln -s lib.pl /usr/local/lib/perl/.../site/lib/lib.pl
すんません、正規表現で質問です。 全角文字しか入力できないフォームのエラーチェックに、 ASCII文字にマッチ = 全角文字じゃない と判断してます。 間違いないでしょうか? また、全角カタカナしか入力できないフォームのエラーチェックに、 if ( $str =~ [^ァ-ヶ・ーヽヾ] ) { print "全角カタカナじゃないです。"; } とやってますが(文字コードはフォームページ、ソース共にEUC)、 「あ」を入力してもひっかかってくれません。。 どなたかご教授いただけますでしょうか??
362 :
nobodyさん :03/09/25 17:40 ID:i6y0iSpN
↑すいません、書き間違いです × $str =~ [^ァ-ヶ・ーヽヾ] ○ $str =~ /[^ァ-ヶ・ーヽヾ]/
上の正規表現で「あ」「い」「う」「ア」「イ」「ウ」が通っちゃう。。。(鬱 そして、「え」「エ」以降の文字だとひっかかる。。。(鬱
文字クラスの中で2バイト文字使ってる段階でダメでしょ $str =~ /[^ァ-ヶ・ーヽヾ]/ ↓ $str =~ /[^\xA5\xA1-\xA5\xF6\xA1\xA6\xA1\xBC\xA1\xB3\xA1\xB4]/ ↓ $str =~ /[^\xA5\xA1\xA2\xA3\xA4\xA5\xF6\xA1\xA6\xA1\xBC\xA1\xB3\xA1\xB4]/ ↓ $str =~ /[^\xA1\xA2\xA3\xA4\xA5\xA6\xB3\xB4\xBC\xF6]/ で、EUCでは 「あ」 \xA4\xA2 「い」 \xA4\xA4 「う」 \xA4\xA6 「ア」 \xA5\xA2 「イ」 \xA5\xA4 「ウ」 \xA5\xA6 なのでマッチしない。 「え」 \xA4\xA8 「エ」 \xA5\xA8 はマッチする。
>>364 ありがとうございます!
なんとなくわかってきました。
(?:\xA5[\xA1-\xF6]|\xA1[\xA6\xBC\xB3\xB4])
っちゅうことですか(全角カタカナ)
となると、
(?:\xA5[\xA1-\xF6]|\xA1[\xA6\xBC\xB3\xB4])
以外。。。
すいません、どうやって表現するんでしょう。。
[^ がないと○○じゃないとできないのでしょうか?
>>365 否定すればいいんでないの?
if ($str !~ /^(?:\xA5[\xA1-\xF6]|\xA1[\xA6\xBC\xB3\xB4])*$/) ...
おっと。Perlメモによりますと、 # EUC-JP文字 $ascii = '[\x00-\x7F]'; # 1バイト EUC-JP文字 $twoBytes = '(?:[\x8E\xA1-\xFE][\xA1-\xFE])'; # 2バイト EUC-JP文字 $threeBytes = '(?:\x8F[\xA1-\xFE][\xA1-\xFE])'; # 3バイト EUC-JP文字 $character = "(?:$ascii|$twoBytes|$threeBytes)"; # EUC-JP文字 EUC-JPのふつーの文字はASCIIと重なっていないから、 if ($str !~ /^(?:$twoBytes|$threeBytes)*$/o)
ごめん。367は全然だめ。 $strはEUC-JPであると仮定。 全角文字のみ許可: if ($str =~ tr/\x00-\x7F//) { だめっぽい }
ちなみに、
>>366 の方法では、EUCの「ぅあ」のような連続した文字で
「ぅ」の2バイト目と「あ」の1バイト目が \xA5\xA4 となるので
\xA5[\xA1-\xF6] にマッチし、「全角カタカナ」とみなされる。
>>366 その通りですね。。
逝ってきます。。。
>>368 if ( $str =~ /[\x00-\x7F]/ ) { print "全角じゃないぽ" }
じゃだめぽですか
>>369 その通りですね、「ぅあ」で全角カタカナと誤認してます…
ずるぽんあぷろだにて、ディスクの空き容量も併記したい。 とりあえずsub calc_disk_usageを眺めてみて、 流用効かないと分かる。 そう言う関数がperlにないか、 Googleでキーワードとっかえひっかえ検索するも撃沈。 どうすればいいか分からん… _| ̄|○ボスケテ… 環境:Win2k, Perl5, Apache 1.3.28
>>372 open(FILE, "C:\TMP\check");
while(1){
print FILE " " x 1024;
$kb += 1;
print "available up to ${kb}KB...<br>\n";
}
そもそも、「全角カタカナ」にマッチは不可能!?!?
375 :
372 :03/09/25 19:55 ID:???
>>373 ◎___
. // /
. // ソ /
// ラ ./
// ネ /
// / ./
// ヨ /
∧空∧/___/
_______ {´ ◎ `}<ソラネーヨ!
,ィィ,ィィ\):::::::::(
しししし(_つ:::::::::ヽ
ヽ__ノ::::::::::::::|二手
(;;;;;;;;;;;;;;;;;;;)
// >>__
<◎:::> <::::◎ノ
ディスクを埋めるなんて無茶だって…
しかもループ終了条件無いよ… _| ̄|○
あ、selectして$|の値いじってバッファリングをoffしといてくださいな
>>375
>>369 前からぜーんぶ全角カタカナ、っていう条件なら、それは問題にならないんじゃないんー?
379 :
372 :03/09/25 20:27 ID:???
>>379 最大容量から、使用済みを引けばいいんじゃないの?
381 :
372 :03/09/25 20:32 ID:???
>>380 ごもっともなんですが、公開ディレクトリ以外にもファイルがあるので…
ディスク全体を毎回スキャンするのもどうかと。
それに、スラック分が無視されてしまいますです、はい。
>>381 そんなに無駄遣いが多いファイルシステムは無いはずだし、
アプロダ以外はファイルをいじらないんだから、スキャンしなくても、
追加、削除したときに、前回までの合計から調整すればいいやん。
383 :
302 :03/09/25 20:43 ID:yHKLmlBq
>>309 これでOKでした。ありがとうございます(T_T)
>>361 use String::Multibyte;
my $euc = String::Multibyte->new('EUC_JP');
my $string = 'ピッタンコカンカン';
my $katakana = join('', $euc->mkrange('ア-ン'));
if ($euc->length($string) != $euc->strspn($string, $katakana)){
print "Not match.\n";
} else {
print "Match.\n";
}
>>379 悪い悪い。UN*Xならstatfsでできるんだが、Win2Kも似たようなシステムコール
あるんじゃないの?
386 :
251 :03/09/25 21:21 ID:0BOu5flf
>252 なんとか自分でここまでコーディングしましたが、checkboxなどの複数存在するパラメータが文字列化できません。お知恵をお貸しください(T_T) my $queryParam = ''; my $paramValue = ''; my $paramKey = ''; # $CGIHandleのパラメータを全て検索 foreach $paramKey ($CGIHandle->param) { # 値のあるパラメータが処理対象 if ( length($CGIHandle->param($paramKey)) > 0 ) { if (length($queryParam) > 0) { $queryParam = $queryParam . '&'; } # 値をURLエンコード $paramValue = $CGIHandle->param($paramKey); foreach ($paramValue) { $_ =~ s/(\W)/'%'.unpack("H2", $1)/ego; } # クエリー文字列を生成 $queryParam = $queryParam . $paramKey . "=" . join('&' . $paramKey . '=', $paramValue); } }
387 :
372 :03/09/25 21:50 ID:???
>>385 キタ*・゜゚・*:.。..。.:*・゜(゚∀゚)゚・*:.。. .。.:*・゜゚・*!!
サンクス! おかげさまでsystem関数見つけられますた。
system('dir c: >c:\text.txt');
な感じで標準出力取ってコーディングしてみます。
やっぱ下らないコトでevalを使わないほうがいいのかな? リファレンスの構造がめんどくさいんで。 use Data::Dumper みたいなコトやりたいんだけど。理由は一番手っ取り早いし、保存された物がみやすいから。でつ。
>>387 毎回dirすると負担かかりそうなら、ファイルアップロードされたときに、そのサイズ名を配列に入れておくとイイかも
それで
for($i=0; $i<#$i; $i++){
$size+=size[$i];
}
配列の最大の添え字って#$iであってたっけ?ミスってたらスマソ
390 :
389 :03/09/25 23:45 ID:???
×サイズ名 ○サイズ スマン
391 :
389 :03/09/25 23:46 ID:???
またまちがってるーー ×#$i ○#$size スレ汚しごめん
>>388 モノによるが、複雑なデータ構造を自前で解析するくらいなら、素直にeval()した方が速い。
ただしeval()は下手すると「何でもできる」ので、安全でない可能性があるデータをeval()する時には
Safe.pmの使用も検討するといい。
>>372 Win32::kernel32
CPANのみだけど。
395 :
388 :03/09/26 00:31 ID:???
>>392 そっかー。ありがと。
ぐーたらな俺はData::Dumperが気にいちゃってさー、データ構造の保存で思いつくのはマズこれになったんだよねー、最近。
まぁ、今回は複雑きわまりないのでこれ使っておきます。
396 :
388 :03/09/26 02:33 ID:???
testで理想のデータに近いデータ構造をループで作り、Data::Dumperしてみました。 すると、一万行近く逝きました。 これって、CGIで使うデータなんだけど、毎回のアクセスでイチイチevalで読みこんで普通? 一般的な量?? 取り敢えずしつこくてすみません。
>>396 一般的な量とは言えないだろうが、必要なのならそうするしかないでしょう。
けど、それが本当に必要なものなのか、そのデータ構造の設計は適切な物なのか
再考する余地は多分にありそうだね。
398 :
初心者 :03/09/26 05:58 ID:AJpvkVZp
文字化けしてしまいます↓ print <<EOF; @\docomo.ne.jp @\ezweb.ne.jp EOF [@docomo.ne.jp]はOKですが、 ezwebのほうは [@・zweb.ne.jp]となってしまいます。 モノは試しに[@\e\zweb.ne.jp]とやってみてもダメでした。。。 ご教授をお願いいたします。
399 :
nobodyさん :03/09/26 06:01 ID:Fdg6MiWp
Σ(´Д`;)…… \、は@の前につけようか。
400 :
初心者 :03/09/26 06:13 ID:???
>>399 殿
出来ました。
ありがとうございました。
後ろに[\]かと思ってました。(;・∀・)
>>398 もしくは
print <<'EOF';
HTML表示の掲示板でクッキーが保存されない
( ´_ゝ`)フーン
( ・∀・)ノシ∩ ヘェーヘェー
2003 200309 20030927 を、それぞれ 2003、2003-09、2003-09-27 に変換するスマートな書き方をご教授下さい。 $str =~ s/(\d\d\d\d)(\d\d)(\d\d)/$1-$2-$3/; では20030927しか変換されませんし、 $str =~ s/(\d\d\d\d)(\d\d)(.*)/$1-$2-$3/; では 200309 は 2003-09- になってしまいます。。
>>406 $str =~ s/(\d\d\d\d)(\d\d)?(\d\d)?/$1.($2 and "-$2").($3 and "-$3")/e;
>>406 $str = join '-', grep $_, unpack 'A4A2A2', $str;
$str =~ s/(?<=\d\d)(\d\d)(?=\d)/$1-/g;
substr($str, 2) =~ s/(\d\d)(?=\d)/$1-/g;
すっかりいなくなっちゃったね・・・
410 :
nobodyさん :03/09/27 16:55 ID:2g7zZILz
cgi関係ですが、質問よろしいでしょうか? /xxx/data にアクセスしたとき、/xxx/index.cgi の PATH_INFO に /data が渡される方法はないでしょうか? 掲示板のURLをすっきりさせたいもので・・・。
>>410 xxxって名前のCGIスクリプトを作る。
>>401 /xxx/data にアクセスすると、/xxx/index.cgi が呼ばれるようにするのは
できてるのね?
413 :
nobodyさん :03/09/27 17:12 ID:2g7zZILz
>411 ごもっともです。でもそれしかないでしょうか? >412 /xxx/?data なら index.cgi を呼べるのですが・・・ /xxx/data では呼べていないようです。
スレ違い
>>410 本質的にはCGIの問題でもないので、
移動するならお使いのHTTPdの質問スレへどうぞ。
416 :
410 :03/09/27 17:25 ID:???
スレ違い失礼いたしました。 どうもありがとうございました。
mod_rewrite と言ってやればすんだものを
apacheかどうかわからんがな
>>417 条件によってはmod_rewrite使わなくてもできるし。
>>418 /xxx/?data
GETならindex.cgiってことは、htaccess使ってるのでは??
IISにこんな機能あったっけ?
自作HTTPdかもしれんし
>>421 それならそれですごいなー
つーか、自作なら仕組みすべて理解しておけよ、とw
423 :
nobodyさん :03/09/27 23:36 ID:uv3VqwCS
質問です。 index.cgi?t1 のようにCGIを呼び出してCGIの方で t1 = xxx.htm t2 = aaa.htm t3 = zzz.htm にlocationヘッダで飛ばしてPHP風なサイトを作ろうとしているのですが、 if文を使うと膨大に長くなってしまうので短く書く書き方はありますでしょうか? $xx[] というのをつかえばいいのでしょうか?
>>423 %location = (
t1 => 'xxx.html',
t2 => 'aaa.html
);
print "location: $location[$ENV{'QUERY_STRING'}\n\n";
飛び先は絶対パスのほうがいいらしい
うん。
>424 エラーにならないか?
427 :
432 :03/09/27 23:44 ID:uv3VqwCS
ためしに %location = ( t1 => 'xxx.html', t2 => 'aaa.html' ); print "Content-type: text/html\n\n"; print "$location[$ENV{'QUERY_STRING'}<br>"; exit; と表示をさせてみようと思ったらサーバエラー(500)になってしまいました。 perlのパス等は合っています。 あと、%の使い方がよくわからないので解説してくれるとありがたいです。
>427 共用サーバでテストするな。 テストはローカルでやれ。 ローカルでやったならエラーログ見ろ。
429 :
432 :03/09/27 23:48 ID:uv3VqwCS
あ、[$ENV{'QUERY_STRING'}]の]が足りてなかったんですね・・ でもxx.cgi?t1を開いても何も表示されません。 なぜなのでしょうか?
自分でlocationヘッダといいつつなんでContent-typeをつけるかな、この子は。 %の使い方は自分で調べれ。初心者スレって言っても甘えすぎでないかい?
432 :
432 :03/09/27 23:59 ID:uv3VqwCS
>>428 自宅鯖でやっています。
エラーログ見たらsyntax errorとあったので解決しました。
>>430 いや、テストのため表示させてみようと思ったのです。
locationヘッダで無いと使えないのでしょうか?
433 :
432 :03/09/28 00:30 ID:a1I0tWLx
>>427 使い方わかりました。ハッシュって言うんですね^^
locationヘッダにしたところ404になってしまいました。
├/index.cgi
├/xxx.htm
└/aaa.htm
と置いて
t1 => ./xxx.htm
t2 => /xxx/aaa.htm
とやってみたのですが両方とも404でした。
下の方のファイルのパスはあっています。
どうすればいいのでしょうか?
435 :
aaa :03/09/28 01:45 ID:???
テスト
436 :
nobodyさん :03/09/28 01:50 ID:lxnHIT50
SSH接続が許可されてなくて、FTPしか使えない環境でホームページを作っています。 で、CPANモジュールのうち、 たんにFTPでファイルやフォルダを置くだけで使えるものがあれば、 使いたいと思ってます。 しかし、どうすればそれを判断することができるのでしょうか? マニュアルには載ってないみたいですし。。。 とりあえず、HTML:Templateだけは、 2chのカキコで「置くだけで使える」とあるのを見て、 実際今使ってるのですが・・・
437 :
437 :03/09/28 02:09 ID:???
御教授お願い致します。 $aに100バイトの文字が入っているとします。 それを、50バイトずつ2つの変数$bと$cに代入するには どのような処理・関数を使うと良いでしょうか?? (length関数とか使うのでしょうか?) 宜しくお願い致します。
438 :
437 :03/09/28 02:15 ID:???
追伸 処理的には、 もし、$aが50バイトを超えたら 残りは$bに。 そして、$bが50バイトを超えたら 残りは$cに。 ・ ・ ・ ・ といった具合です。 「超過分文字のみを次の変数へ代入させる」という処理方法について 悩んでいます。。。
>438 lengthとif文とsubstrを使え。
440 :
nobodyさん :03/09/28 02:35 ID:lxnHIT50
>>438 ためしてないけど、こんなかんじか?
while ($string){
$txt[$i] = substr($string,0,50);
$i++;
}
441 :
437 :03/09/28 02:46 ID:???
>>439 ありがとうございます。
substr関数←この関数を知りたかったので大変助かりました。
>>440 例文に感謝♪♪♪♪
お手数おかけしてすいません。
あとは、自分で出来そうです。
本当にありがとうございました。ヽ(´ー`)ノ
442 :
kool :03/09/28 04:00 ID:Xrh1/qz9
443 :
nobodyさん :03/09/28 04:56 ID:SGKixdue
phpでincludeみたいな機能はperlにありまつか?
>>446 rfc2616(HTTP/1.1)だと思うけど。
locationに関してはHTTP/1.0でも変わらないと思うよ。
424だが print "location: $location{$ENV{'QUERY_STRING'}\n\n"; だったな。スマソ。無駄にナニさせてしまった。
>448 だから、エラーになるって。 カッコの組み合わせの数考えろよ。
>>449 ごめん。 激しく欝デス。逝って来ます。
2chのIDって、何と何の構成でできてるの?
>451 日付とIPと板ごとのID
>>452 うい。
板ごとのIDって、WebProgで言うと「php」でつか?
>>453 その日の最初のカキコ時に生成される16バイトのランダムID
455 :
nobodyさん :03/09/28 11:41 ID:R65WBK9G
phpでポップアップウインドウを出すにはどうするんですか?
456 :
nobodyさん :03/09/28 11:43 ID:R65WBK9G
あ 間違えた スルーしてください
矢駄
458 :
446 :03/09/28 12:14 ID:???
>>447 ふむ、けどHTTPの仕様とCGIからの出力の規定はちがうのですよ。
459 :
458 :03/09/28 12:16 ID:???
s/から//
crypt($addr,$mday,$bbs?)
質問です。 if($abon){ 〜 } という基本的なif文に於いて、$abonが定義されてなければ、どうなるのでしょうか?? 500Internal Server Error?
やってみろよ
>>462 なんで httpd のレスポンスコードなのか?
500エラーだけを頼りにデバッグするのって、もの凄く効率悪いと思うのだが。 本人は疑問に思わないのか?
500Internal Server Error? ↑ これはperlのエラーじゃない事をキミに教えてやる。
467 :
447 :03/09/28 19:05 ID:???
468 :
467 :03/09/28 19:23 ID:???
Apacheのmod_cgiですが、内部リダイレクトしてると思ったら、301返してきますね。 ちゃんとabsoluteURIに直されてますけど。。
469 :
馬鹿 :03/09/28 19:34 ID:NOFJe5gI
STDINにseekを使うことはできますか?
470 :
458 :03/09/28 19:36 ID:???
>>468 うちでは正常(Apache 1.3.27)。これ以上続けるならCGIスレに移動しよう。
472 :
馬鹿 :03/09/28 20:11 ID:Be3Qxp63
うっほーい
>>462 それはおまえが use strict の住人かどうかによる。
なんでもいいが、KCatchかなんか使ってろよ。
474 :
馬鹿 :03/09/28 21:06 ID:Be3Qxp63
475 :
nobodyさん :03/09/28 21:30 ID:qHWNg5sh
476 :
432 :03/09/28 21:33 ID:a1I0tWLx
できました。ありがとうございます。 ところでリンク先のページでアドレスバーに表示されるURLをindex.cgi?t1からxxx.htmにするのはどうすればいいのでしょうか?
>>476 結局、Locationヘッダでやってるの?
http:// から始めないとアドレスバーの内容はかわらないね、IEは
478 :
432 :03/09/28 22:21 ID:a1I0tWLx
>>477 できました。みなさんありがとうございました!
掲示板で行頭に##を付けるとその一行が炙り出しになる機能を付けたかったので、 ○○.plに$val =~ s/^##(.*)/\##<font color\=\"#eeeeee\"\>$1\ <\/font\>/g; を追加しました。 そしたら一行だけではなく、その書き込み全てが炙り出しになりやがりました。 これだけでは説明不足かもしれませんが修正方法お願いしますです。
>479 \nか<br>か都合のいい方をマッチさせれ。
482 :
447 :03/09/28 23:28 ID:???
>>486 の件は、アドレスの最後に/を付けずディレクトリにアクセスしたため。
内部リダイレクト後、301で実際のディレクトリへ移動していただけでした。
>>470 ども、、もう消えます。
>>479 エスケープしなくてもいい文字までエスケープしてる気がするが、気のせいだろうか。。。
そういうのが好きなやつもいるのだろうよ
>>483 「メタ文字が何だか分からない場合、とりあえず記号は全部エスケープしとけ」というのが
ラリー先生の御達しだたはず。
486 :
nobodyさん :03/09/29 11:25 ID:2gOy4VWM
ファイル名 aa.txt 内容はカンマ区切り NO 名前 住所 電話 携帯 mail -------------------------------------------------- 112,山田華子,住所AA,電話番号11,携帯電話22,E-mail, 222,加藤士郎,住所BB,電話番号22,携帯電話22,E-mail, 332,青木太郎,住所CC,電話番号33,携帯電話22,E-mail, この内容ですが下記のようにすべて配列に入れました。 それをaF112〜332と名前:山田華子〜青木太郎の配列をつくりたいのですが splitで上手くいきません? 良い方法あれば教えて下さい。 用途として、下記のように個別のSELECTBOXを作成します。 112 222 332 下記のとおりにすると全てが配列に含まれてしまいます。 そのままINDEXで個別指定できればいいのですが。。。。 open IN,"aa.txt"; while(<IN>){ $data = $_; chop $data; ($no,$name,$address,$tel,$keitai,$mail) = split(/\,/,$data); push @all,$data; }
すみません、GDやImagemagickを使わないで、 とあるJPEG画像Aをもとに縮小してJPEG画像Bを作成することはできるでしょうか? できるとすれば、どうやればいいのでしょうか?
489 :
nobodyさん :03/09/29 12:49 ID:2gOy4VWM
>>486 spritとインデックスの組み合わせで出来ました。!(^^)!
##sage
>>488 GDやImageMagickと同等のものを自分で作る。
そのためには、JPEGの仕様をどっかからみつけてきて、
自分でそれを取り扱うコーディングをすることだ。
多分、払う労力と成果物の完成度から考えると、
素直にGDとかを使った方が絶対に楽だが。
491 :
404 :03/09/29 17:24 ID:???
>>406 あ、かんじんなこと忘れてました。
SSH接続できない環境で、動くようにしなければならないもので・・・
(で、GDもImageMagickも入ってない)
うーん、実はGIFのサイズも変更しなけれななくなりそう・・・
どうしよう。。。
同じCPU,OSのサーバ用意してコンパイルしてバイナリをftpしたら?
以下のスクリプトで、 if ($entry =~ m/^tmp/i){ の行で、 Illegal division by zero at index.cgi line 831. とエラーがでてしまいます。 どうして、割り算をしてないのにこんなエラーがでてしまうのでしょう? なお、 (KCatch.pm使ってますが) 831行目の直前に、 print $entryしてみたところ、「.」「..」「tmp200309291817-3647-1.jpg」と表示され、 このエラーがでたので、 どうも、正規表現にひっかかったときに、このエラーが発生するようなのですが・・・ $PATHImage_info= "../../cgi-bin/image/info/"; $path = $PATHImage_info; chop($path); opendir(DIR, $path) or die("cannot open dir $path:$!"); while ($entry = readdir DIR){ if ($entry =~ m/^tmp/i){ unlink ($path/$entry); } } closedir(DIR);
unlink ($path/$entry); おもいっきりわりざんしてるやん。
>>493 $path/$entry → "$path/$entry"
496 :
406 :03/09/29 18:44 ID:???
>>407-408 レス遅くなりました、ありがとうございます。
処理している内容はよく分かりませんが動きましたです。
今度は何でもかんでも "" で囲うようになって、リストまで囲んでハマりそうな悪寒。
(UNIXの)Cシェルのように、変数名を囲むような方法がperlにありますか?
具体的には
$url1='
http://pc2.2ch.net/test/read.cgi/php/ ';
print<<_code_;
<a href="$url11063562491/l50">このスレ</a>
<a href="$url11063562492/l50">あのスレ</a>
<a href="$url11063562493/l50">そのスレ</a>
_code_
みたいにやりたいんですが、Cシェルなら${url1}1063562493ってやればいいんですが・・・
500 :
nobodyさん :03/09/29 21:00 ID:1z2RXRdN
sageだった・・・_| ̄|○
>>499 ではCシェルのように書いて試してみれば? :o)
505 :
499 :03/09/29 21:27 ID:???
>>502 普通に使えるし…もうアフォかと
吊ってきます
ご面倒おかけしますた ∧||∧
>>503 print $url . "1063562493/l50";
じゃダメ?確かめてないけど...
解決したようですが・・・ perlでも${url1}1063562493/l50とすることによってurl1が変数名であると認識してもらえます。
↑でした。
>>507 誰でも知ってる常識レベルだと思ってたが
初心者スレなんで勘弁してやって
511 :
493 :03/09/30 00:45 ID:???
>>494-495 うお、はずかしー。
行番号1行読み間違えてたし、
文字を数列にぶっこむとゼロになることも知らなかった。。。
ひとつお勉強になりました。
数列じゃなかった、数式ね
>>511 my $str = '12 ANGRY MEN';
print $str * 12; # 144
>>513 ・∀・)つ〃∩ へぇ。へぇ。へぇ。へぇ。
つか、例文がしゃれとるな
ファイルアップローダ (まぁ正確には添付ファイル付きメールフォームなんですが) を作ってるんですが、 マックバイナリがついてるかどうかを判断して、あれば削除するってのは、 どうすればできるんでしょうか?
517 :
515 :03/09/30 02:27 ID:???
>>516 ありがとうございます。
うーん、でも難しい。。。ゼロって'0' のこと・・・でしょか・・・
$filebody に中身を格納したとして、
if ( substr($filebody,0,1) eq '0') && (substr($filebody,74,1) eq '0') ) でOK?・・・なわけなさそう。。。
あと、リソースフォークとコメントも取り除かなきゃならないのか・・・
0と'0'は違うでしょ。
519 :
ヘタレ :03/09/30 03:41 ID:???
あるmyで局所化した配列を引数に型グロブとしてサブルーチンに渡すと、 それをスコープすることが出来なかったようです。 こんなときはリファレンスを使えってことですかね? 他に良い解決法があれば教えてください。 以下にサンプルを示します。 my @array = ("hoge", "foo"); print &sub(*array, $val); sub sub { my (*ar) = @_; return (@ar); }
520 :
519 :03/09/30 03:42 ID:???
$val は余計でしたね…
urlエンコード文字列は大文字と小文字どちらのほうがいいですか? %E3%81%AA%E3%81%AA%E3%81%97みたいなの
522 :
◆G7gJP6maHs :03/09/30 07:06 ID:tlRt08RD
1:MAIN 2:name<>aa 3:name<>dd 1:MAIN 2:name<>55 3:name<>gi ・・・ のようなファイルがあったとして そこに追加書き込みモードでseek(FILE, 0, 0を使って 先頭にデータを書き込みたいのですが出来ませんでした。 それは出来ないのですか? 他に方法はありますか?
>>522 できないって、どうもならなかったの?
前のデータに上書きされたの?
どうもならなかったならオープンモードを確認
もしも挿入したいというのなら、構造上全部書き直さないと無理
>>519 リファレンスがすっきりしていいとおもうが・・・
>>522 追加書き込みモードではseekできないかも。
読み書き両用モードでどーよ。
でも、データの位置を求めたりしなきゃいけないから、dbm使うほうがいいと思われ。
>>517 substrじゃなくて、unpack を使う。テンプレートは"C*" でいいかな
526 :
525 :03/09/30 14:48 ID:???
C*だと全部読んじゃうか。切り出した後ならいいけど固定長なんだから"C128"でいいな
で、ちょっと
>>516 のページ読んでみたよ
$filedata に内容が入ってるとして、
@a = unpack("C2a63N2C2n3C2N4nCa4C2C8NnC2n2", $filedata);
とやって
$a[0] == 0 , $a[6] == 0 以外ならMacBinaryではない
$a[11] == 0 ならMacBinaryI の可能性あり
$a[1] > 0 && $a[1] < 64
$a[12] < 0x7fffff , $a[13] < 0x7fffff
$a[17..28] == all 0
以上を満たせばMacBinaryIかもしれない
その場合、$a[2] にファイル名が入っている
$a[24] >= 129
$a[25] == CRC($fileの先頭124バイト)
$a[18] == 'mBIN' の場合MacBinaryIIIの可能性あり
こんなとこかなあ、、、 I は判別苦しいな
送るファイルのフォーマットがわかっていれば
ヘッダを取った後の内容で判断できるけどねぇ
CRCの計算は調べればどっかにあると思うんで省略
527 :
525 :03/09/30 14:56 ID:???
< 0x7fffff は <= 0x7fffff だな・・・ まあ検証も何もしてないんで、そのまんま使わんようにね
528 :
◆Pgys2byAHg :03/09/30 16:15 ID:tlRt08RD
CGIでデータをファイルに書き込むときの区切りを $DATA = join(/全角文字/, @list) みたいに全角文字を使うのは問題ありますか? 半角文字だと保存ファイルの中で勝手に改行されていることがあって困っています。
529 :
◆Pgys2byAHg :03/09/30 16:36 ID:tlRt08RD
>>528 すいません
全角文字を区切りにしても改行されていました。
リストを保存するために
print FILE @list;
とすると保存ファイルの中で勝手に改行されてしまうことがあり
データを思い通りに取り出すことができません。
何が原因かわからないし、解決方法もわかりません。
改行してんのはデータに改行コードが入ってるからじゃねーの? “勝手に”改行するとは思えんが・・・
531 :
nobodyさん :03/09/30 16:40 ID:3FAGrror
Net::FTPを使って、いろいろな処理をしているのですが、 一つ分からないことがあったので質問します。 そのファイルがサーバにあるのかどうかを調べようとしているのですが、 適当な命令が分からなかったので以下のように処理しています。 $ftp = Net::FTP -> new ("$server"); $ftp -> login ("$usr", "$pwd"); $ftp -> cwd ("/test/directory"); push (@i, join ("\n", $ftp -> ls ())); $ftp -> quit; @i配列にディレクトリ内にあるファイルを放り込んでいくというものです。 ですがこれは失敗で、すべて改行コード付きで$i[0]に挿入されるだけなのでした。 つまり for (@i) { chomp; if ($_ eq $a) { print "発見\n"; } } などとしたところで、配列の第一区画にしか値が入っていないため、「発見」は出力されません。 こんな面倒なことをしなくても、そのファイルがサーバ上に存在するかどうか を調べるにはどうすれば良いか教えて頂けませんか?方法が分からないためにこんな面倒な ことをしてというていたらく。 よろしくお願いします。
>>531 join ? split じゃねーの?
>>532 そうすると、ARRAY...という文字列が表示されるだけなんですよ。
うーん。
>>531 Net::FTPのドキュメントを読みなされよ。
>>531 --- Net/FTP.pm より抜粋 ---
sub ls { shift->_list_cmd("NLST",@_); }
...
sub _list_cmd {
...
my $list = [ split(/\n/,$buf) ];
...
wantarray ? @{$list} : $list;
}
536 :
nobodyさん :03/09/30 17:10 ID:unsxHigP
>>531 Net::FTP 使った事ないけど見たところ、
$ftp -> ls () が配列を返すのなら、
@i = $ftp -> ls ();
なんじゃねえの?
push (@i, join ("\n", $ftp -> ls ()));
って$ftp -> ls ()が返す配列を\nでjoinして@iにpushしてるんだから、
$i[0]にまとめて入っちゃってるってのは当たり前のような気がするけど。
WindowsサーバでPerlを利用し、別に用意されているノーツ サーバ(メールサーバ)を利用してメールの配信をしてくれと 言われましたが、どうやるのかさっぱりわからず、聞き返し ても自分で調べてくれと一点張り。 調べても出てこないので聞いたのですが、もうどうしようもない 状況です。 そもそもノーツサーバを使ったSMTP送信というものはどういう イメージであるのか、本当にわからないことだらけです。 神様、どうかご教授ください。 人に頼るということは良くないことですが、情報がないため 質問させていただきました。ごめんなさい。
どきゅそ初心者ですが、暇な人いたら教えて下さい。 下の"1"から"5"までをシンプルにまとめる方法はないでしょうか? (($sec eq "1")or($sec eq "2")or($sec eq "3")or($sec eq "4")or($sec eq "5")) ちなみに($sec =~/[1-5]+/)とかやってみたけどだめでした。
539 :
nobodyさん :03/10/01 01:34 ID:6ojryLUM
だめじゃないぞ
($sec =~ /[1-5]/) でいいじゃん 他には ($sec >= 1 and $sec <= 5) とか
($sec =~ /^[1-5]$/)
543 :
nobodyさん :03/10/01 08:20 ID:QvvkWgZe
ただのリンクの文章に、変数に数値を代入する要素を 加えるにはどうしたらいいのでしょうか?たとえば、 $body .= qq(<A $href="***">りんく</a>); で、「りんく」をクリックすると$#resに1を入れたいんですが。 $body .= qq(<A $href="***" $#res=1>りんく</a>); じゃ無理なんでしょうか?やってみたけどできませんでした。
<A HREF="***?res=1"> とかの話じゃなくて?
545 :
543 :03/10/01 08:33 ID:QvvkWgZe
>>544 それはランキングとかでよく見られるやつですよね?
そういうのとはまた別で、リンク先と変数は特に関係ないものです。
>>545 ??
JavaScriptと勘違いしてる?
リンクをクリックしたってリンク元のURLのcgiは動かんぞ?
547 :
543 :03/10/01 08:59 ID:QvvkWgZe
いえ、Java Scriptの話ではないんですが・・・。
>>545 の話はパラメータのようなものではないと言いたかったのです。
perlのCGIじゃ無理。
549 :
543 :03/10/01 11:12 ID:QvvkWgZe
えー無理なんですか。
掲示板スクリプトで、特定のリンクをクリックすることで
変数に数値が代入され、その変数の値をif ($#res ==1)で判定して
また違う文章を表示するまたは表示しないという流れのものを
作りたかったんですが・・・。
>>543 のやり方や、
$body .= qq(<A $href="***&$#res=1">りんく</a>); とかやってみたところ、
どうやってもif文に当てはまってしまうようなんですよね。否定の結果にならなくて。
ってやっぱりperlでは無理なのかあ。残念。
ぜんぜんわけわからん
551 :
開店準備中 :03/10/01 11:33 ID:L9ZAlkPa
やりたい事がイマイチよくわかりませんな。 そのリンク先***は自分自身なのか、他のサイトなのか。。 掲示板にあるリンクを誰かがクリックしたら、 「このリンクは○人が訪問済みです」 みたいな文章を掲示板に表示したいとか? そもそも自分自身を呼び出す事はしちゃいけないのか??
552 :
助けて下さい :03/10/01 11:46 ID:LJr9q6s0
forkが使えない環境で、時間がかかる処理を実行し、ブラウザ上は 直ちに「起動しました」と表示させたい。 いろいろ調べて、 --------------------------- print "起動しました\n"; close(STDOUT); #ここに時間のかかる処理 --------------------------- というのを試したが、確かにすぐ表示はされるが、ブラウザの 進捗表示は動いていて結局処理が終わるまで開放されない。 何かいい方法はありませんか?ご教授頂ければ幸いです。
>>552 開放されるようにするとKILL飛んでくるが、いいのか?
>>543 なんだか言ってることが意味不明なんだが。
CGIってのはサーバーサイドで動くものだぞ。そのへんわかってるか?
それともGETでデータ受け取りたいってことなのか?
そもそも「$#resに1を入れたいんですが。」ってどういうことよ?
それをやると@resの要素の個数が変わるわけだが,ほんとにそれでいいのか?
アホは放置の方向で
556 :
543 :03/10/01 12:09 ID:QvvkWgZe
よそではなく、そのCGI内での処理です。 つまり、リンクはどれも掲示板からその掲示板内の別の場所へのリンクです。 というか$#resってやり方は間違ってるのかもしれません。 とりあえずif文で判定に使える変数が欲しかったので、 使い方もよく知らずに使用しているだけなので。
>>533 まぁfork and exit; という方法もあるが、サーバーによっちゃ
動かないかもな。
だめだこりゃ。。
とりあえず543は
>>1 をよく読んで整理して質問し直せ。
ここはお前の訳わからん日本語を解読するスレじゃない。
561 :
552 :03/10/01 12:39 ID:z2YpNiRf
>>553 さん
>>557 さん
activeperl5.8にして(forkが使えるらしい)、
---------------------------------------
$|=1;
if($pid=fork()){
print "起動しました\n";
close(STDOUT);
}else{
close(STDOUT);
#時間のかかる処理
}
---------------------------------------
としても現象が同じでした…。
>開放されるようにするとKILL飛んでくるが、いいのか?
>まぁfork and exit; という方法もあるが、
具体的に教えていただいてもよろしいでしょうか?
562 :
543 :03/10/01 12:42 ID:???
自分では全部説明したつもりなんですが 私に基礎知識さえないせいでうまく伝わらないみたいです。 失礼しました。消えます。
>私に基礎知識さえないせいで というか、勘違いしている部分があると思われる 間違った知識を暗黙の了解として省略されると、わけわからない文章になる
>>561 WinかYO!
HTTPdサーバは何?
565 :
561 :03/10/01 13:38 ID:jYAOy5k5
>>564 さん
はい、Winです…YO…。サーバはIISです。
どうかお知恵を…!
標準出力に出力を返すあるプロセスの出力を変数に格納したいんですが、 どのようにすればいいのでしょうか。 open PROCESS "|process|$output"; print PROCESS "inputstring\n"; print $output; のようにやってみたのですが、$outputには何も入っておらず、 processの出力は標準出力に出力されました…。
system "時間のかかる処理 &"; print "起動しました\n"; exit; 漏れの知識ではこの程度。鬱。
>>566 $return = `process`;
とか。
>>566 open PROCESS "|$command > $output";
print PROCESS "inputstring\n";
close PROCESS;
open LOG, "<$output";
print <LOG>;
でどうか?
>>569 sh: -c: line 1: syntax error near unexpected token `newline'
sh: -c: line 1: `process >'
このようなエラーが出ました…。
なんでそうなったか、考えて見た? こういう場合、popen は使わないのかな C出身だとまっさきにそれに飛びつくが…
一行目のopenの>の文法が間違ってるのかな、と。 syntax errorって書いてますし…。 らくだ本とかでも、プロセス>ファイルハンドルとかはあっても プロセス>変数ってのはなかったように思います。 ただ、 unexpected token `newline'てのはよくわかんないです。
popen の入出力版がopen PROCESS "|$command|"; か・・・
>>572 その > の先に $output があるが、$output に何も設定してないんだと思う
>らくだ本とかでも、プロセス>ファイルハンドルとかはあっても いまらくだ本でこの記述を探してるんですが見つからないです…。 夢を見たのかもしれません。
>>574 んと、どういう事でしょうか。$outputにはprocessが標準出力に出すはずの
文字列が入っていて欲しいのですが…。
>>576 違うよ、
>>569 の例は事前に$outputにファイル名を入れて
ファイルを介して読み書きするんだよ
>>576 出力だけ欲しいなら、けつに | (先頭にはつけん)
入出力で使うなら、 open2() を調べる
以上でどう?
>>578 おお!できました。
…が、ちょっと扱いにくいですね…。
というのは、
print PROCESS "inputstring\n";
hoge(@foo = splitなど($output));
print PROCESS "inputstring2\n";
hoge....
というふうに、processに入力を与えるたびに、その出力に
ある処理を加えたいのです。
569の方法だと、$outputには今までの全ての出力が入っていて、
それこそ出力ログですよね。
最近の出力のみを変数に格納したいんですが、いちいちopenとcloseを
挟み込んで開き直すしかないのでしょうか。
>>580 IPC::Open2を使えばいい。使い方は
perldoc IPC::Open2
で読むかぐぐるかしてくれ。
582 :
nobodyさん :03/10/01 16:48 ID:jHHqXc8O
Name "hoge" used only once: possible typo at ・・・ これはどういうエラーですか。
>>582 エラーじゃないよ
一回しか出てこないけど、タイプミスじゃないの?
つってる
>>528 その程度の英語なら辞書引けば分かるだろ。
ちなみに-wオプションの出力だったかと思うので、それで間違って
ないなら-wオプションを外せ。
585 :
561 :03/10/01 17:00 ID:LJr9q6s0
>>567 さん
バックグランドで処理が動いて、ブラウザは開放される ということを
期待しましたが、現象は同じでした。
もしかして、もうだめポ…。
>>585 IIS特有の現象かと思われる
おれにはもうわからん、、、
>>581 IPC::Open2使ってみました。これ自体は良い感じなんですが…。
open2(*OUT, *IN, $command, @args);
としたときに、OUTに最新の入力に対する出力のみを残す、
またはOUTから最新の入力に対する出力のみを取り出すのは
どうすればいいのでしょうか…。
$output = <OUT>;
とやっても出てくるのは最初の出力の一行目だけですし。
>>585 STDINとSTDERRも閉じてみるとか?
>>587 どの出力がどの入力に対応したものかを判別するのは、
標準入出力の性質上不可能。
コマンドの入力や出力の内容から推測するしかない。
>>588 それ、コマンドが標準出力を閉じるまでデッドロックすると思うが。
>>589 うーん、一対一対応が取れる必要はないんで、
最新の出力だけわかればいいんですが…。
なんか良い方法はないですかね…。
592 :
561 :03/10/01 17:42 ID:CRn5ruC5
>>589 さん
あ…あなたは神ですか…。
いや、冗談ぬきに、できましたよ!!
STDOUT,STDIN,STDERR 3つとも閉じたらできました!!
本当にありがとうございました!
(書き込んでよかった〜;;)
>>591 出力の行数とかは毎回違うの?
「どれが最新か」という判断も標準入出力では不可能なんですよ。
コマンドが終了してしまえばEOFが返るからそれで判断できるけど。
>>592 おお、良かったじゃん。犯人はSTDERRのような気がするんだけど、
OUT、INの2つを閉じるパターンと、OUT、ERRの2つを閉じるパターンで
どうなるかやってみてもらえないかな?
>>593 対話式のプロセスなので、コマンド入力ごとにプロンプトが帰ってきます
つまりOUTの中は
process> process>
process> 出力1
process> 出力2a
出力2b
などのようになっているので、OUTの最後から最初のprocess>を
探すことができれば、そこからOUTの最後までが最新の出力
ということになるのですが…。
IISはSTDERRはエラーログに行かないのか?
>>594 その「OUTの最後まで」を取得するのが不可能なんですよね。
プロセスにとっては、どの時点が出力の最後なのか判断する基準が
ないので。
一応alarmを使って一定期間ブロックした時点でコマンドの終わりと見なす方法は
あるけど、コマンドの実行が単に遅れているだけの場合に誤判別が起きますし、
標準入力がブロックするのを待つわけですから実行時間を無駄に食います。
>その「OUTの最後まで」を取得するのが不可能なんですよね。 while(<OUT>) としたときに無限ループするのもそれが原因ですかね? これもなんとかなりませんかね…。
ラッパー作ってそいつと通信したほうがよさげ
select(2) はこういうとき使えるのかな?
600 :
592 :03/10/01 19:22 ID:speTtA5w
>>593 さん
まさにその通りでしたよ!
OUT、INを閉じる:NG
OUT、ERRを閉じる:OK
という結果になりました!
>>597 そうです。その状態をブロックと呼びます。
情報が来ないからずっと待ってる状態ですね。
>>599 多分使えると思うけど、sysreadをしてやる必要が出てきたり面倒なので、
あえて触れないでおいた。
まぁselectでファイルハンドル覗いたとしても、コマンドが遅延してる場合に
誤動作するのは避けられないので。
>>600 おお、そうですか。わざわざありがとう。IISだとSTDERRまで面倒みてやらんといけないんだな。
WindowsやIISの実装はよく知らないんだが、STDOUTとSTDERRを同列に扱ってるのかな?
602 :
531 :03/10/01 22:52 ID:???
できた!できました!
>>535 $ftp -> dir ();
これで試したことはあるのですが、うまくいかず
$ftp -> ls();
も試したような試さなかったような。
試していても多分どこかの記述で間違っていたのでしょう。
>>536 恥ずかしながら、全く思いつきませんでした。
それでうまくいきました。
おそくなりましたが、ありがとうございました。
603 :
nobodyさん :03/10/02 15:40 ID:CofMmnLn
複数のファイルを一度にダウンロードさせたいのですが、IEでは Content-Type: multipart/mixed または Content-Type: multipart/x-mixed-replace はいまだに実装されていないのでしょうか? multipart/mixedは、outlookから なら使えるようなのですが……。 上記(複数のファイルを一度にダウンロードさせる)の別の実装をしたことのある方が いらっしゃいましたら、それでも結構ですのでアドバイスをお願いします。
604 :
◆Pgys2byAHg :03/10/02 15:44 ID:sWr7wCtd
リンク集などでどのリンクが何回クリックされたかわかるリンクカウンタCGIについて どのようなスクリプトなのかわからないのですが説明していただけませんか? ページカウンタはページが呼び出された時にCGIも呼び出しているのはわかりますが リンクカウンタは別ページへ飛ばせているのにカウントしているのがどうやっているのかわかりません。
>>603 IEではできません
>>604 ソースを読んでみましょう
ところでどっちもスレ違いじゃない?
606 :
603 :03/10/02 16:26 ID:CofMmnLn
>>605 すっぱりきっぱりのお返事ありがとうございます(T_T) では
>上記(複数のファイルを一度にダウンロードさせる)の別の実装をしたことのある方が
>いらっしゃいましたら、それでも結構ですのでアドバイスをお願いします。
の部分、多少汚い方法でもかまいませんので、何か実装方法は無いものでしょうか?
ぱっと思いつく限りでは「個別のファイル送信へのリンクを張ったHTMLを出力してJavaScriptで
submitしまくる」くらいしか思いつかないのですが、これだと同時に三個までしかダウンロード
できないし……。
たびたびで申し訳ありませんが、よろしくお願いいたします。
>>606 PerlにContent-Typeなんてないよ。
ダウンロードって何?Perlにそんな機能ないよ。
>>606 無茶な案だが。
Location: ヘッダ使ってFramesetなページにとばす。
FramesetなページのSRCにはダウンロード先を書く。
とうぜんダウンロードしたいファイルの数だけFrame分割な。
>>607 Webprog板なんだし,それくらいは許容範囲にしてやれ
>>608 あ、ごめん。ム板と間違えた。これで2回目だ。氏んでキマス。。。
>>606 氏ぬ前に一言。
ブラウザの方で同時接続数の制限してるよ。設定で変えられるだろうけど。
611 :
603 :03/10/02 18:05 ID:CofMmnLn
>>610 ……レジストリいじらないとダメみたいっしゅ……(T_T)
613 :
603 :03/10/02 18:30 ID:???
>>612 いえ、ツールがあるのは知っていますが、見る人間全員にいちいち設定してもらうわけにも
行かないので(^^;
ならOperaを使わせろ。 デフォルトの設定で子鬼のような同時接続数に設定されている。
>>603 素直にtarとかで固めちゃうのが楽だけどな。
それもクライアントが対応できないか?
>>615 win相手ならzipとかlzhの方が普及してそうな悪寒。
>>603 何をDLさせるのか知らないけど、
DLするもののリストをJavaScriptの配列に入れて、
onLoadで一つ目のリストをDLさせる別窓を開く。
DL完了後、別窓を閉じる。と共に次のリストをDLさせる別窓を開く。
以後、リストが無くなるまで繰り返す。
>「個別のファイル送信へのリンクを張ったHTMLを出力してJavaScriptでsubmitしまくる」
この辺が理解できないからなんとも言えないけど。
>>615 が言うように、素直にtarにするのが良いんじゃない?
618 :
618 :03/10/02 19:48 ID:fdawIf8z
御教授お願い致します。 $aに100バイトの文字が入っているとします。 それを、50バイトずつ別の変数$b[i]に代入するには どのような処理・関数を使うと良いでしょうか?? 処理的には、 もし、$aが50バイトを超えたら 残りは$b[1]に。 そして、$b[1]が50バイトを超えたら 残りは$b[2]に。 ・ ・ ・ ・ といった具合です。 「超過分文字のみを次の変数へ代入させる」という処理方法について 悩んでいます。。。 while ($a){ $b[$i] = substr($a,0,50); $i++; } だと思い、やってみたのですが うまくいきませんでした。。。(;・∀・)
>>618 while ($a){
$b[$i] = substr($a,0,50);
$a = substr($a,51);
$i++;
}
でいいんじゃね?
あと、日本語使うなら途中で切れる可能性もあるけど。
620 :
603 :03/10/02 20:08 ID:???
>>617 えと、DL終了の監視ってどーやってするんでしょう?<厨な漏れ(T_T)
もしかしたらonUnloadとかで連鎖的に開いてくのかな。
DLさせるブツはCSVファイルです。もともと一つのファイルにまとめていたのですが、
ユーザーが「カット&ペーストするのタリぃ」とか言い出しやがりまして(T_T)
こーゆー風に出力するって、ちゃんと仕様書に書いてあったろうが!!
ちゃんと銭出してくれるんだろうな(涙)
>>603 すまん、勘違いしてたかも。>DL終了の監視
DLさせるってのがどういうことを指してるのかわからんので何とも言えんが・・・。
どっちにしろJavaScriptで実現するなら板違いな。
Perlでするなら分割してメールに添付すれば?
>>618 訂正。
> あと、日本語使うなら途中で切れる可能性もあるけど。
2バイト以上の文字は途中で着られる可能性もあるけど。
2バイトが1+1バイトになるっつーことな。
>>620 それはもうJavaScriptスレ逝きだな。
CGIならContent-Typeをmultipartで送出するって技なかったっけ?
ブラウザが対応してるかどうか知らんけど。
あと根本的な話だけど、複数に分割してダウンロードさせるより
ダウンロードしたやつを分割するスクリプト書いた方が圧倒的に早い気がする
訂正した上に誤字だし。。。鬱。
(´-`).。oO(618 は以前どこかで見たような。。。回答もしたような。。。)
ちょっと質問とは違うんだけどさ。 { no strict q[refs]; &{"$::form{'link'}"}; } ------------------ { no strict q[refs]; &{qq[$::form{'link'}]}; } ----------- 上がで、下がダメってなんかムシズが走らない? さっきエラーではまったよこんちくしょう。(三分くらいだけどね)
626 :
625 :03/10/02 21:51 ID:???
↑ >上がで、下がダメって 上がOKで、下だダメ。
627 :
603 :03/10/02 22:26 ID:???
>>622 んで、最初に戻って
>Content-Type: multipart/mixed
>または
>Content-Type: multipart/x-mixed-replace
はIEでまだ使えないんでしょーか、という話になるわけです(T_T)
確かに
>>620 はJavaScriptスレですね。
ExcelあたりのVBAでどっかに転がってないかなぁ(T_T)>ファイル分割スクリプト
628 :
nobodyさん :03/10/02 22:31 ID:K49KzhGg
my @b; my $i = 0; while($a =~ m/.{50}/gs ){ $b[ $i ] = $MATCH; $i++; }
>>625 デリミタに [] なんて使うからだ。qq// にしてみ。
>>376 RFC2617ですね。正直、初めて読みました。ありがとうございます。
BasicとDigestでrealmの意味合いが違ったりして面倒ですね。
関係ないけど、Digestの場合のrealmはホスト名を含むべきだそうで。
632 :
631 :03/10/02 23:30 ID:???
誤爆、すみません。
ディスク埋めるのRFCで規格化されてたのか・・・ 勉強になるなぁ
635 :
nobodyさん :03/10/03 00:51 ID:F2oHzxKQ
perlの勉強ついでにアクセス解析作っています
htmlに画像として埋め込むタイプで
SSIのDOCUMENT_URIにあたるものをとりたくて
$DOC_URI=$ENV{'HTTP_REFERER'};
$DOC_URI =~ s/$"
http:// " . ENV{'HTTP_HOST'}//g;
ってやったんですが動きません
"
http:// " . ここの部分がだめかなと思いこの部分を削除してみましたがやはり動きませんでした
よろしければご教授お願いいたしします
1: 自分はこう言う事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。 最低でも1と3が無いと誰も答えられないよ。
>$DOC_URI =~ s/$"
http:// " . ENV{'HTTP_HOST'}//g;
なんじゃこりゃ
638 :
635 :03/10/03 01:19 ID:???
自己解決しました とんでもない勘違いしてました・・・ウワァ
639 :
TESTさん :03/10/03 01:54 ID:Q+brxX1I
初心者です、、 @TEST=(1,4,3,2,5,6,9,19,11…以下略) と、の整数のみの配列の中から、特定の数字を抜き取りたいのですが、、、 やったこと…grep関数を使ったら10の位の奴までHitするので使わず、 for($i=0;$i<$#TEST;$i++){ if(@TEST[$i] eq $特定の数字){ $Ans=$i; splice(@TEST,$index,1); last; } } とかやってみてもだめでした… 助けてくださりますぇ〜
>>639 ・数値は == で判定
・$indexって何よ?
641 :
TESTさん :03/10/03 02:36 ID:Q+brxX1I
>>640 どうもですぅ。
あと、$indexっていうのは元のプログラムの変数っす…
スマソ…
while(<FILE>){} 上のようにwhileでファイルを読み込むと、 行末の余分な空白を勝手に削除してくれるのですが これはperlの仕様なのでしょうか?
んなこたぁない。
>>639 @result = grep(/^特定の数字$/, @TEST); とかは?
for ( $i=$#test; $i>=0; $i-- ) { splice(@test,$i,1) if ( $test[$i] == 特定の数字 ); } spliceすると配列の長さが変わるので尻からまわしていかないとダメみたい。
>>639 配列の使い方勉強して。@TEST[$i] はダメ。
あと、
for( $i=0 ; $i =< $#TEST ; $i++ ){
としないと配列の最後の要素が目的の値だった時に失敗する。
>>644 要件が違うと思われ。
やるのなら
@result = grep($_ != 特定の数字 , @TEST);
だろうが、無駄が多い。
>>645 それも無駄が多い。
ヒットするのは一回だけなのに全部ループさせる必要はない。
639はsplice直後にlastでループ抜けてるんだから長さ変わっても問題なし。
647 :
646 :03/10/03 05:27 ID:???
>>639 もしかして、配列の中に目的の要素が複数出てくる可能性もあるのか?
けど、わざわざ $Ans=$i; としているということは、やっぱり一個しかない前提?
>>646 > for( $i=0 ; $i =< $#TEST ; $i++ ){
こういう書き方もあんの?
for( $i=0 ; $i <= $#TEST ; $i++ ){
では?
649 :
TESTさん :03/10/03 10:37 ID:Q+brxX1I
>>647 一個しかない前提です、、、ごめんなさい…
650 :
TESTさん :03/10/03 10:50 ID:Q+brxX1I
あっ、、解決しました〜
皆さんどうもありがとうござります…
(
>>646 さん、
>>648 さんので解決)
>>649 for($i=0;$i<=$#TEST;$i++){
if(@TEST[$i] == 特定の数字){
$Ans=$i;
splice(@TEST,$index,1);
last;
}
}
652 :
651 :03/10/03 10:52 ID:???
ぼえー
>649 配列を2個使っていいなら、下のような書き方の方が簡便。 @test = (1,2,3,4,5); foreach (@test){($_ == 特定の数字)?$Ans = $_ : push @test1, $_} ;
654 :
651 :03/10/03 11:00 ID:???
>>649 近いのも漏れも思ったが、どうやら取得したいのは
$Ans = $_ ではなく $Ans = $i らしい(w
655 :
603 :03/10/03 14:21 ID:1Otnm3v+
何度も申し訳ありません(^^; とりあえず前回の質問は自分でももう少し調べてみるとして…… print "Content-Disposition: attachment; filename=" . $file_name . ".csv;\nContent-Type: text/plain; charset=Shift_JIS;\n\n"; と書いてCSVをダウンロードさせるCGIを書いているのですが、IEでダウンロードダイアログが一回表示される場合と 二回表示される場合があります。この違いはなんなのでしょうか?
657 :
603 :03/10/03 15:26 ID:1Otnm3v+
>>656 ユーザーからボツられますた……(T_T)
どうやら工数の関係で「ユーザーの方でボタン一つ一つ押して」ということになりそうでつ( ´∀`)
URLの方は……IE5.5では、「Content-Disposition: attachment; filename=……」だけでは×ということでしょうか?
一応、IE6では(現状のままで)ダイアログは表示されています。
動作環境は、Perlの5.6.1にIEの6.0です。
658 :
603 :03/10/03 15:30 ID:1Otnm3v+
>>657 IE5.5の件はすぐにググれました。IE5.5の中でも特定のバージョンのみ
>>656 のようなことが怒るようです。
「SPあてろやゴルァ」でOKみたいですね。
659 :
603 :03/10/03 15:37 ID:???
>>658 今確認したところ、どうやら一回開く/二回開くの違いが出るのは、「開く」を選択したときだけのようです。
「保存」の場合はどちらも一回で指定した場所にファイルを保存してくれました。
660 :
nobodyさん :03/10/03 17:50 ID:Arz4qkUq
require について質問があります。 まず、ファイル構成ですが /cgi-bin/check.pl /cgi-bin/utl.pl /cgi-bin/bbs/bbs.cgi このようになっています。 check.pl内 require "./utl.pl" をしています。 そしてbbs.cgi内で require "../check.pl" をしたのですが utl.plが見つからないとエラーがでます。 この症状からcheck.pl内でのrequireパスがずれるのが原因だと 思うんですが、解決方法はないんでしょうか? 汎用性の関係から絶対パスは避けたいのですが・・・。 (あとシンボリックリンクも) ご教授お願いします。
>>660 bbs.cgi からの
../utl.pl
662 :
vip1.lcv.ne.jp :03/10/03 18:13 ID:4aZcdzW7
663 :
618 :03/10/03 18:28 ID:Ux8En4yK
>>619 殿
while ($a){
$b[$i] = substr($a,0,50);
$a = substr($a,51);
$i++;
}
としてみましたが、うまく表示されませんでした。
試しに
print "$a";
while ($a){
$b[$i] = substr($a,0,50);
$a = substr($a,51);
$i++;
}
print "$b[1]";
ですと、$aは表示されますが、$b[1]は表示されず。。。
誤っている箇所のご教授をお願いいたします。
664 :
619 :03/10/03 18:35 ID:???
$iに何かが入ってる可能性ない? 試しに、↓コレでやってみ。 print "$a"; $i = 0; while ($a){ $b[$i] = substr($a,0,50); $a = substr($a,51); $i++; } print "$b[1]";
665 :
619 :03/10/03 18:37 ID:???
>>660 check.pl内で require "../utl.pl" にする。
bbs.cgiから見た相対位置にする必要がある。
use strict; my $ref_2; #略 %{ $::ref_1 ->{"$ref_2 ->{'名前'}"} }; 上記が不可能なのはなぜでしょうか? しかし下記なら期待どうりに動作します。 use strict; my $ref_2; #略 my $test = $ref_2 ->{'名前'}; %{ $::ref_1 ->{"$test"} } 上のも下のも「略」の部分は全く同じですが、 上のはハッシュが取得できません。 また、以下のように書いてもリファレンスすら取得できていません。 $::ref_1 ->{"$ref_2 ->{'名前'}"}; 疑問です。
667 :
nobodyさん :03/10/03 18:54 ID:Arz4qkUq
>>661 utl.plはcheck.plが使用するものなので無理みたいです(一応試しました)
たとえできたとしても、check.pl内にutl.plへのrequireがあるので
apacheのエラーに出てしまうのではないでしょうか。(見つからないというエラー)
今は気持ち悪いながらも/cgi-bin/bbs/内にutl.plへのリンクを張って
御茶を濁してます。うぅ。
>>619 utl.plとcheck.plはライブラリなので改変しないことが前提です。
他のプログラムも参照してるのでbbsのためだけに改変することはできません。
あ、もしかかして、「おめーの言ってることは無理なので諦めろ」ってことですか?
もし、そうでしたらシンボリックリンクでしのぐことにします。
668 :
619 :03/10/03 18:58 ID:???
>>667 要はutl.plはbbs.cgiから見てることになるから、改変しないんなら
/cgi-bin/bbs/check.pl
/cgi-bin/bbs/utl.pl
/cgi-bin/bbs/bbs.cgi
にして、bbs.cgi内で require "./check.pl" にするしかない。
あとはどこまで妥協できるか次第じゃねぇ?
>667 んじゃcheck.pl内のパスも書き換えれば良いんじゃないの。
>>666 print "$ref2 ->{'名前'}\n";
print "$ref2->{'名前'}\n";
print "${\$ref2 ->{'名前'}}\n";
673 :
618 :03/10/03 19:39 ID:???
>>664 殿
$iに入ってました(;・∀・)
初期化 $i=0 で解決しました。
いろいろお世話になりました。
感謝いたしますm(__)m
674 :
nobodyさん :03/10/03 19:41 ID:Arz4qkUq
>>668 >あとはどこまで妥協できるか次第じゃねぇ?
了解しました。
C言語だとヘッダからのヘッダインクルードのネストが発生することは
よくありますが、Perlだと皆妥協しているということなんですかね。
>>669 どういう効果があるのでしょうか?
あと、どのソースにその記述をすれば良いのでしょうか?
検索してみたのですが、うまく引っかからなくって・・。
675 :
619 :03/10/03 19:45 ID:???
>>674 こうなることを予想して設計すれば良かったんだけどな。
てか、漏れの場合、普通requireする*.plは*.cgiと同階層に置くけどな。
676 :
nobodyさん :03/10/03 19:50 ID:KVT8E5nB
>>675 おれは.pmでも.plでも/home/usr/hoge/perl-libに突っ込んで
use lib '/home/usr/hoge/perl-lib';
だな。
ライブラリにするってのは共用するつもりなんだろうし、
じゃなくて、そのスクリプト専用ライブラリなら
メインスクリプトとおんなじとこでいいじゃん。
>>674 cgiファイルに、
use lib '../';
require 'check.pl';
けど676の言うようにライブラリはまとめて置いたほうがよい。
とりあえず、マニュアル読みなよ。
678 :
660 :03/10/03 20:13 ID:???
>>レスしてくれた皆様 どうもありがとうございました。 677氏の言うとおり、マニュアルをよく調べてみることにします。
679 :
nobodyさん :03/10/04 01:02 ID:jVHk2ww4
>>618 my @piyos = ( );
my $offset = 0;
my $piyo = "12345678901234567890123"; # ←ターゲット
my $len = length($piyo);
while ($len != $offset) {
$offset += length(($str = substr($piyo, $offset, 5))); # ←50じゃなくて5文字ずつ
push(@piyos, $str);
}
foreach (@piyos) {
print $_."\n";
}
680 :
679 :03/10/04 01:12 ID:jVHk2ww4
あ、解決済みか..
681 :
force264 :03/10/04 13:43 ID:9sNFAMdz
ttp://www.tagindex.com/tool/url.html ↑これのデコードのモノだけが欲しい、又は作りたいのですが、どなたかご教授願えませんでしょうか・・。
サーバがCGIしか使えないので、Perlで何かサンプルソースを教えてもらえませんか?
例えば「%A4%A2%A4%A4%A4%A6%A4%A8%A4%AA」という文字列をフォームに入力すると「あいうえお」とデコードされて表示されるものです。
ちなみに私はPerlど初心者です。サンプルルーチンを引っ張ってきて適当に組み合わせたのですが、もちろん動きません。;;
682 :
force264 :03/10/04 13:44 ID:9sNFAMdz
■decode.html <html><head><title>decode</title></head> <body> <form action="decode.cgi" method="POST"> <input type="text" name="arg"> <input type="submit" value="変換"> </form> </body></html> ■decode.cgi #!/usr/local/bin/perl require './jcode.pl'; $arg = $ARGV[0]; printf("arg=%s\n", $arg); $arg =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/ego; printf("arg=%s\n", $arg); print "Content-type: text/html\n\n"; print <<"_HTML_"; <html><head></head><body>$arg</body></html> _HTML_ exit; お怒りを買うのを覚悟です。 どうかお願いできませんか・・・。
>>682 @ARGVにデータが入っているのではなく、
MethodがPOSTの時は標準入力
GETのときは$ENV{QUERY_STRING}に入ってる
684 :
nobodyさん :03/10/04 14:13 ID:9sNFAMdz
標準入力というのは、上のソースじゃ余計なものがありすぎるという事なのでしょうか・・・ #!/usr/local/bin/perl require './jcode.pl'; $arg =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/ego; print "Content-type: text/html\n\n"; print <<"_HTML_"; <html><head></head><body>$arg</body></html> _HTML_ exit; としてみましたが、500エラーは出ないようになりましたが、フォームHTMLにエンコード文字列を入れてボタンを押しても、真っ白けで何も表示されません。 何が何だかわからないっす・・;;
>>682 とりあえず、
decode.cgi?%a5%a8%a5%b9%a5%b1%a1%bc%a5%d7
にアクセスしてみろ。
で、表示されたら、問題はデコードの部分じゃないってこと。
_ ( .,‐ '´ ヽ-、_ /⌒)i レノノ))) \ヾヽ / ̄ ̄ ̄ ̄ /ヽ './人il.゚ - ゚ノイ|/.ヾヾヽ< みる、みる、みるまらーーー! ゞ ("....( (ヽ ⊂)Yiつヽ) |'ノ | わむてさん、地球! (" "ヽ\.' く _ :|〉ヽ.ヽ| | ノ | '( " ヽ\し'ノ ヽ| |ノ ノ \____ (\ '("ヽ\ |ノ \) '((. " し″
687 :
force264 :03/10/04 15:08 ID:9sNFAMdz
>>685 さん
真っ白ですが、エラーなく表示されました。
という事はデコード部分でないという事なのですか・・。
右も左もわからなかったので、大変ありがたいです。
nameの値を変えたり、もっと色々やってみます。
>>687 あう。すまねぇ。>真っ白。
>>684 のスクリプトを↓に買えてみれ。
#!/usr/local/bin/perl
require './jcode.pl';
$arg = $ARGV[0];#←これを加えれ。
$arg =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/ego;
print "Content-type: text/html\n\n";
print "<html><head></head><body>$arg</body></html>";
exit;
んで
>>685 をもう一度試す。
>>687 追記。
つまり、$arg = $ARGV[0];ではフォームに入力された値を受け取れてないってことだ。
フォームに入力された値を受け取る方法を勉強する必要がある。
690 :
force264 :03/10/04 15:54 ID:9sNFAMdz
>>688 さん
で、で、で、出たっす〜〜〜〜〜〜〜〜〜〜!!!!!
感激です。僕にとって神です。
これをフォームに入力してボタンクリックで表示させるには・・
と言いたい、もっと自分で探して
691 :
force264 :03/10/04 15:56 ID:9sNFAMdz
誤字すまそ 最下行は、 と聞きたい所ですが、もっと自分で探して勉強します。 でした。 感謝の気持ちが絶えません。 ありがとうございました。
>>690 漏れを神などと言ったら、他のもっとすごい人々はどうなるんだ(w
ま、ガンガレ!HTMLフォームからの受け取りは、そこら辺に落ちてる
掲示板系スクリプトにはたいてい書いてあるよ。
関係ないけどエンコード文字列だけのスレとか面白いかも(www
694 :
force264 :03/10/04 16:43 ID:9sNFAMdz
ありがとうございます。^^ 色んな掲示板スクリプトを早速眺めてみてます。 どこからどこを使えばいいのか、よくまだわかりませんが^^; エンコード文字列だけのスレ、スペースが入ったらまだ変換できないので、付いてけるかな・・w
>>694 %82%BE%82%C1%82%BD%82%E7%82%E0%82%C1%82%C6%95%D7%8B%AD%82%B5%82%EB
696 :
force264 :03/10/04 17:08 ID:9sNFAMdz
>>695 %82%cd%81%60%82%a2%82%97
>>694 %82%BE%82%A2%82%BD%82%A2%83X%83N%83%8A%83v%83g%82%CC%8D%C5%8F%89%82%CC%95%FB%82%C9%8F%91%82%A2%82%C4%82%A0%82%E9%82%A9%81A%8A%D6%90%94%82%C5%8C%C4%82%D1%8Fo%82%B5%82%C4%82%E9YO
698 :
697 :03/10/04 17:15 ID:???
%83X%83%7D%83%5C%81B%89%FC%8Ds%82%B5%82%C4%82%C8%82%A9%82%C1%82%BD%81E%81E%81E
699 :
force264 :03/10/04 17:22 ID:9sNFAMdz
%82%a8%82%8b%81I%0d%0a%82%bb%82%cc%83A%83h%83o %83C%83X%82%df%82%bf%82%e1%8f%95%82%a9%82%e8%8 2%dc%82%b7%81B%0d%0a%83p%83b%82%c6%8c%a9%81A%9 7%92%82%c5%82%b7%82%c8%81B%82%97
%82%C6%82%B1%82%EB%82%C5%83X%83%8C%82%CD%82%DC%82%BE%97%A7%82%BD%82%C8%82%A2%82%CC%82%A9%81H %82%B1%82%A4%82%C8%82%C1%82%BD%82%CC%82%E0force%32%36%34%82%CC%90%D3%94C%82%BE%82%A9%82%E7%82%A8%91O%82%AA%97%A7%82%C4%82%C4%97%88%82%A2
%3E700%93%C3%93%B0
plalaホスト規制されてますた(あうっ ごめん
このスレのせいで、画面がめちゃ横に長いっす。 僕のせい・・。 %82%a0%82%a2%82%de%82%bb%81%5b%82%e8%81%5b
%3E%3E700-701%82%E6%82%EB%81%60
%97%A7%82%C4%82%DC%82%B5%82%BD http%3A%2F%2Fpc2.2ch.net%2Ftest%2Fread.cgi%2Fphp%2F1065258181%2F
>>705 %83%7D%83W%82%C5%97%A7%82%C4%82%BD%82%CC%82%A9YO%81I
こっちは通常に戻りますた。
>>force264 POSTでフォームの受け取りが一つならこんな感じかな read(STDIN,$query,$ENV{'CONTENT_LENGTH'}); ($key,$value) = split(/=/,$query); #デコード $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value = jcode::sjis($value); $argって特殊変数の$ARGじゃないよね? まぎらわしい
それを言うならARGV
まあ確かに$ARGって書くより$_って書くが。。。
711 :
nobodyさん :03/10/05 08:12 ID:qygpxvaZ
#!/usr/local/bin/perl int "よし";
あうあ。。ネタに失敗するとどうにもならんな・・・
714 :
nobodyさん :03/10/05 08:37 ID:qygpxvaZ
ありがとうございます。 でも\Q \Eとはどういったものなのでしょうか? 検索しようにも\Q \Eでは出来ないので 何という言葉で検索すれば良いか教えて下さい。 よろしくお願いします。
716 :
nobodyさん :03/10/05 09:21 ID:ASv2Zjr7
質問 CGIで、UTF-8を呼び出す仕組み作ったけど、 HTMLにフォームを置いて、送信すると、 データが文字化けしてしまいます。 HTML自体はSHIFT_JISになっているが、 1これをUTF-8に保存するか 2データ送信の際にUTF-8に変換させるか という仕組みにしようと思います。 1は問題点として、ブライザ上文字化けしてしまいます。 そいんで、ブラウザが自動的にUTF-8に変えるタグが必要です。 2の問題点はどんなタグを入れるか… どっちみちにしてもタグがわかりません。 ご教示ください!
重ね重ねありがとうございました。 なんかよくわからないが1 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
>>716 何がしたいのか他人にもわかるように、もっと日本語の勉強をしなさい。
>>717 HTMLがutf-8扱いになるけどそれでよさそうだね。
>>716 は、「HTMLは絶対にShift-JISでないと駄目」とか言ってないから。
a.plを実行後、自動的にb.plを実行させるようにしたいのですが、 どのようにすれば良いのでしょうか??よろしかったらご指導願います (o_ _)o))
ab.bat ------ perl a.pl perl b.pl
>>708 さん
#!/usr/local/bin/perl
require "./jcode.pl";
read(STDIN,$query,$ENV{'CONTENT_LENGTH'});
($key,$value) = split(/=/,$query);
#デコード
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
$value = jcode::sjis($value);
print "Content-type:text/html";
print "$value";
exit;
でhtmlのform methodはPOSTで、form内テキストフォームのnameはkeyにして実行してみました。
エンコードされた文字列を入れて実行しましたが、デコードされずにそのままエンコード文字列が表示されてしまいます・・。
どこがおかしいんですかね・・。
そもそもDOS窓から > perl a.pl とやっても実行されないのですが、、、 もちろんカレントdirはa.plの場所です。
>>722 「実行されない」では情報不足。エラーメッセージが出るならそれを、
何も反応がなくプロンプトが戻るのならそう書くべき。
「コマンドまたはファイル名が違います」との表示。 とりあえずperlを絶対パスにしたらできました。 面倒ですが。 「perl」で実行できるようにするにはどこかでシンボリックリンクみたいな設定する必要あるのでしょうか??
PATHの設定しろよ
>>force264 ごめんごめん この場合デコード二回かけないとだめだった #デコード $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value = jcode::sjis($value); これでいけるはず。マイマシンで確認済み ちなみにGETメソッドの場合はread(STDIN,の行を $query = $ENV{'QUERY_STRING'};にすること この場合ブラウザのアドレス欄にデコード文字がURLに続いて出る
てか、質問者は一連の流れの中で名前をデフォルトにするな。 てめーが誰なのかこっちはいちいち探さんぞ。
>>726 さん
完全に希望通りのものが出来ました・・・(大感激)
恥ずかしながら、本当に勉強にもなり、みなさんの親切心に感動しました。
685、688、689、692、708、709、710、726、727の発言を頂いた方々へ
感謝の気持ちが絶えません。
これから頑張って精進します。
本当に本当に、ありがとうございました!!
for($i=0;$i<$#TEST;$i++) とか久々に見たよw
730 :
nobodyさん :03/10/05 17:11 ID:40Lo3m+b
質問させてください。 iswebにて、CGIが自動作成したディレクトリを削除できなくなりました。 iswebのヘルプでは、CGIを使って削除するようにアナウンスしてますが、 私は知識が無いためスクリプトを組めません。 問題を解決するのに参考になるサイトや、サンプルCGIを教えてください。
>>730 #!/usr/local/bin/perl
`rm -rf`;
exit;
733 :
nobodyさん :03/10/05 17:47 ID:qv4JbRfE
ActivePaqlをダウンロードの際に登録すると金取られるんでしょうか?
734 :
730 :03/10/05 17:52 ID:40Lo3m+b
>>733 ActivePerl は無料ですが
ActivePaql は知りません。
消し方も分からん奴がiswebなんか借りるなよ… iswebもいいかげんユーザー権限にしろよ
743 :
730 :03/10/05 20:40 ID:40Lo3m+b
>>736 消さなくても困りませんが、なんとなく気持ち悪いです。
>>737 ありがとうございます。
探し方が悪いのか、せっかくですが有益な情報が得られませんでした。
もっと具体的な情報をくれると助かります。
>>738 すいません。怖くて試せません。
>>739 ごもっともな意見です。
これからはもっと勉強して、慎重にCGIを設置したいと思います。
とりあえず今の問題を解決したいです。
>>742 たくさんの情報をありがとうございます。
でも、どうやって実装すればいいのか分かりません。
スクリプトの設定をいじるくらいしか、やったことがないもので・・・。
サンプルコードなど添えていただくとありがたいです。
744 :
737 :03/10/05 20:59 ID:???
745 :
nobodyさん :03/10/05 21:21 ID:fso1MIIj
exitが呼び出される前にしておきたい処理を書く方法ってどうやればいいのでしょうか たとえば startExit { println 'うわあ'; } exit; 実行結果 うわあ みたいな感じです
>>745 perlを基礎から勉強し直してください。
747 :
nobodyさん :03/10/05 21:38 ID:fso1MIIj
>>748 どうもありがとうございます
以前に END {} 以外で似たような動作をするものを見たことがあって、それを探していたのですが
今のところはこれでオーケイです
use subs 'exit'; ... ... ... exit; sub exit{ die "うわあ\n"; }
初心者の発想には付いていけないときがあるw 良い意味でも、悪い意味でも。
#!perl use strict; use CGI; my $q = new CGI; if ($q->param('dir')) { `rm -rf $q->param('dir')`; print "Content-Type: text/plain\n\n"; print "あぼーん", $q->param('dir'); exit; } my $f; { local $/ = undef; $f = <DATA>; } printf $f, `pwd`; exit; __END__ Content-Type: text/html <html><form> <input type=text name=dir value='/'><input type=submit> 絶対パス or %s からの相対パスで。 </form></html>
753 :
730 :03/10/06 11:10 ID:???
>>752 キャーありがd。
でも500エラーがでて使えなかった(´・ω・`)ショボーン
参考になるかわかりませんが、該当ディレクトリの
パーミッションは今、411になってまつ。
>>753 まずパーミッションをかえなさい
そもそも偶数はおかしい。ディレクトリの偶数は0と一緒
ファイルを消す(作成も)ためにはwがいる
とりあえず 707にしとけ
755 :
730 :03/10/06 12:05 ID:???
自己解決しました。 自作CGIの中でchmodってパーミッションを変更したら FTPソフトで削除できるようになりました。 自分みたいなアフォのために助言してくれた方々、 ありがとうございました。
こんなバカがCGIとか置いてるのかよ
ヤバイな
411だったってよ。 パーミッションもわからないやつだったとは。 最初からWeb製作板へ追い払うべきだったな。 あっちのほうが叩いてくれるやつ多いし今度からそうするべ。
初めてperl書いてます いろいろやってみたんですが もうだめです マルチスレッドを使わなければ出来るのですが。。。 1.検索条件入力 2.検索 ソケット通信でgoogleとinfoseekにマルチスレッド同時にアクセスし 結果を変数(google_buf,infoseek_buf)へ格納 3.検索結果を表示 検索結果を編集(google_bufとinfoseek_bufより不要タグ削除等を行い結合)して 1枚のhtmlとして表示 −−−検索結果表示イメージ−−− googleの検索結果一覧 : : infoseekの検索結果一覧 : : #googleとinfoseekってのは仮です
>>759 何が出来ないんだ?
ソケット通信か?結果の表示か?
761 :
759 :03/10/06 16:21 ID:???
マルチスレッドで呼び出した SUB内で変数google_bufとinfoseek_bufに格納したものを SUB外で参照ができません ひょっとしてファイル経由しないと出来ないのでしょうか よろしくお願いします
ただのスコープの問題じゃないのか? 本当にマルチスレッドじゃなければできたのか? 該当部分のソース晒せよ
763 :
759 :03/10/06 16:32 ID:???
すみません説明不足でした 以下の様なことを行うと 変数Aには9がセットされているのですが 変数B、変数Cは未セットのままです threadsで呼び出された関数はローカル変数しか扱えないのでしょうか 変数A宣言 変数B宣言 変数C宣言 &test1; $thread1 = threads->new(\&test2); $thread2 = threads->new(\&test3); $thread1->join; $thread2->join; print 変数A; print 変数B; print 変数C; sub test1 { 変数A = 9; } sub test2 { 変数B = 9; } sub test3 { 変数C = 9; }
764 :
759 :03/10/06 16:54 ID:???
>>765 The threads API is loosely based on the old Thread.pm API. It is very important to note that variables are not shared between threads, all variables are per default thread local. To use shared variables one must use threads::shared.
767 :
759 :03/10/06 17:12 ID:???
>>766 ありがとうございます
threads::shared
試してみます
768 :
759 :03/10/06 17:22 ID:???
できました!!!!!!!!!!!!!!!! みなさんありがとうございました use threads::shared; share(変数); により threadsで呼び出された関数より 関数外の変数を参照することができるようになりました 感謝です
769 :
nobodyさん :03/10/06 21:44 ID:FLULdwfZ
XML::Generatorの様にモジュール内で定義されていないmethodを使える様に するにはどうしたらいいのですか?
770 :
nobodyさん :03/10/06 22:25 ID:5TYdQtsW
UTF-8で検索サイト作ったが、検索フォーム画面をHTMLで作ったが、文字化け避けるためSHIFTJISにした。いざ検索を試すと、結果は文字化けかしてしまう。UTF-8で作ればいいが、初めてこのページ訪れると文字化けしてしまうわ。どしたらよいかな。
>>770 ちゃんと文字コード判別すれば化けないだろ?
773 :
nobodyさん :03/10/07 07:11 ID:TDLeH8SR
>>770 だす
いやいや、ユーティエフ8はパールで作ったのだ。ただブラウザは頭悪いから、最初はシフトジスになるからそれを強制的にユーティエフ8へ判別させるようにエイチティエムエルに入れたいのさ。
でもこの質問はウェブ板かも...
Content-Type: text/html; charset=UTF-8
>>770 =773
その前に、もうちょっと日本語を勉強した方がいいと思うぞ(w
>>773 > ただブラウザは頭悪いから、最初はシフトジスになるから
なんねーよ
通常のショッピングカードをダイエー優勝セール仕様に変更したいのですが、 ↓このようにしても動きませんでした。 #!perl use "ダイエー優勝セール"; ・ ・ ・ exit; どうすればダイエー優勝セール仕様にできますか?
open(ダイエー優勝セール,"price.csv"); @price = <ダイエー優勝セール>; close(ダイエー優勝セール); としてもダメでした・・・ これだと、closeしちゃってるから、ダイエー優勝セールは 終わったってことになるのかな・・・
@array = (\%one, \%two, \%three, \%four, …); $arrayref = \@array; return($something, $arrayref); のようなサブルーチンを作っているのですが、 %oneなどのような、ハッシュ名を動的に生成するうまいやり方はありませんか?
すんません、これが無名ハッシュという奴だったんですね。 見なかったことにしてください。
>ハッシュ名を動的に生成 「変数名」を動的に作るんならシンボリックリファレンス… 対して、無名のdataは変数名もクソもないよ。無名だから。こっちはハードリファレンス…
783 :
769 :03/10/07 21:12 ID:???
>>771 さん
sub AUTOLOADで可能だという事が分かりました。
ご指導ありがとうございました。
784 :
nobodyさん :03/10/08 13:33 ID:hWLNdI6q
use String::Approx qw(asubstitute) asubstitute("pattern", "replace") を使って曖昧マッチさせたとき、特殊変数($&, &`, $')の値ってちゃんと入ります? 誰かやったことある人いらっしゃいませんか? マッチはできてるのに、$'が取れずに困っています。
785 :
784 :03/10/08 13:34 ID:hWLNdI6q
まちがいた。 特殊変数($&, $`, $') でした。
786 :
nobodyさん :03/10/08 16:54 ID:nWLPhqss
今日から○ヶ月後の日付を正確に出すことは可能ですか?
あたりまえ
逆に正確じゃない時間を出すほうがソースが長くなるだろうな。
789 :
nobodyさん :03/10/08 17:10 ID:nWLPhqss
どうやってやるんでしょうか。
>>786 #!/usr/local/bin/perl
use strict;
use Date::Calc qw( Today Add_Delta_YMD );
my $add_month = 65536;
my $result = sprintf( "西暦%d年%2d月", Add_Delta_YMD( Today, 0, $add_month, 0));
print qq{おまいら、$add_monthか月後は $result ですよ!\n};
exit;
>>790 日付も欲しかったら,"西暦%d年%2d月%2d日" な。
>>790 ありがとうございます。
これはもしかたら何かを入れないとできないのでしょうか。
実行したんですが、
「Can't locate Date/Calc.pm in @INC・・・」
とかいうエラーログが出てしまいました。
年⇒$year(4桁の整数という前提)
月⇒$mon(1から12の整数という前提)
日⇒$day(1から31の整数という前提)
の3つの変数があるとして、
この年月日の組み合わせが正当か否かを判断したいのですが、以下で正しいでしょうか?
(車輪の再発明のような気もするのですが、どうも見つからないので)
間違い(というか勘違いかな)がないかどうか、教えていただければ幸いです。
なお、閏年のルールは以下の通りだそうです:
「4で割れる年をうるう年とする,ただし,100で割れる年は平年にする.ただし,400で割れる年はうるう年とする」
(参考:
http://www.town.bisei.okayama.jp/stardb/cal/data/cal0043.html )
#-------------------------------------------------------------
$BOOL1 = ($year % 4 == 0 ) ? TRUE :FALSE;
$BOOL2 = ($year % 100 == 0 ) ? TRUE :FALSE;
$BOOL3 = ($year % 400 == 0 ) ? TRUE :FALSE;
if ($BOOL3) }{$BOOLLeapYear = TRUE;}
elsif ($BOOL2){$BOOLLeapYear = FALSE;}
elsif ($BOOL1){$BOOLLeapYear = TRUE;}
else{$BOOLLeapYear = FALSE;}
@mon_array = ($BOOLLeapYear) ? (31,29,31,30,31,30,31,31,30,31,30,31) : (31,28,31,30,31,30,31,31,30,31,30,31);
if ($day > $mon_array[($mon - 1)]){print "不正な日付です。";}
else{print "正当な日付です。";}
>>794 #!/usr/local/bin/perl
use strict;
use Date::Calc qw( check_date );
my $year = 2000;
my $month = 2;
my $day = 29;
if( check_date($year, $month, $day) ){ print 'valid'; }else{ print 'invalid!'; }
exit;
796 :
794 :03/10/08 18:30 ID:???
>>795 すいません、そのモジュール入れてないみたいです。
(で、SSHの権限もないもんで)
797 :
795 :03/10/08 18:38 ID:???
798 :
nobodyさん :03/10/08 19:17 ID:Uxrp5g7j
800 :
794 :03/10/08 19:39 ID:???
>>797 あ、ほんとだ。ありがとうございます。
正確期するためにも、そっちを使ってみます。
でも、後学のため、もしお時間あるかたがいたら、
>>794 で勘違いしてないか、教えていただければ幸いです。
>>800 いいんじゃない?
うるう年なら$leap=1、それ以外は$leap=0にして
2月は 28 + $leap とする手もあるけど
>>800 概念的には問題なさげ。
もっとスマートな書き方もあるけどな。
閏年かどうか調べるのはこれ1文のほうが綺麗ジャマイカ? if( ($year % 100 != 0 && $year %4 == 0) || $year % 400 == 0){ $leap =1;}
>>794 $leap = 0;
@array = (29,31,28,31,30,31,30,31,31,30,31,30,31);
if( ($year % 100 != 0 && $year %4 == 0) || $year % 400 == 0){ $leap =1;}
if( $mon == 2 && $leap == 1){ $mon = 0;}
if ($day > $array[$mon]){print "不正な日付です。";}
else{print "正当な日付です。";}
これとかどう?
↓俺がいつも使っているもの。 sub isValidDate{ my($year, $mon, $day) =@_; # $year 4桁の西暦 # $mon 月を表す1〜12の整数 # $day 日付 # 簡単なチェック return 0 if $year < 1701 # 英では1700年は閏年。 || $year > 9999 # まあここは適当に。 || $day < 1 || $day > 31 || $mon < 1; # $mon > 12はlastdayが0になるのでチェック不要 # その月の末日を計算(2行目は閏年の計算) my($lastday) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[$mon - 1] + ($mon == 2 && ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0)); # $day が $lastday 以下ならOK。 ($day <= $lastday) ? 1 : 0; }
>>806 if文3つも使ってるのを「すっきりしてる」と言うのか?
>>805 にあるチェックも省略されてるし。
if文が少なければ「すっきり」か。( ´,_ゝ`) 相当初心者だな
>>805 1700年のうるう年を気にするなら
1582年の10月か1752年の9月もチェックするべきだと思う
>>809 それ多分俺じゃない。
>>811 確かにそうかも。1792/03/03〜13は存在しないからエラー返す必要があるね。
イギリス以外ではロシアは1917年までユリウス暦を引きずってたらしいから、
西暦が1918未満なら全部蹴るのもアリかも。
ついでに2800年にはロシア暦とグレゴリオ暦と差異が生じるから、
それに対応すると
return 0 if $year < 1918 # ロシアでは1917年までユリウス暦
|| $year > 2799 # ロシア暦で2800年は平年
こんな感じか。
>>812 1792/03→1752/09 スレ汚し失礼。
815 :
794 :03/10/09 02:07 ID:???
正直、みなさん知識豊富ですね・・・
レス読んで、頭のアルゴリズム体操になりますた。
あと、
>>804 さんのもの、いいとかわるいとかでなく、
ギミックっぽくて、純粋におもろいなーと思いました。
>>805 西暦何年か以降、この数式使えないんだよな、確か。
記憶は定かじゃないけど、2800年より以前だったかと。
817 :
nobodyさん :03/10/09 08:48 ID:v4lICR5J
CGIのパラメータを渡すときに
http://www..../cgi-bin/a.cgi/a/b/c のように、/で区切ってパラメータをわたしたとき
出力するhtmlのカレントディレクトリはどこと考えればいいのでしょうか?
パラメータなしでは、/cgi-bin がカレントなのですが
パラメータをつけると、/cgi-bin ではなく /cgi-bin/a/b/c がカレントに
なっているような気がするのですが… これだと、相対パスではやりにくいです。
>>817 use Cwd; print 'CWD:', cwd(), "\n";
とでもprintして確認してみてはどうですか?
手元の環境ではそんなことにはならないようですが,こればっかりは
おそらくhttpd依存だと思いますから。
819 :
nobodyさん :03/10/09 09:10 ID:v4lICR5J
>>818 わかりました。
どうもありがとうございました。
820 :
816 :03/10/09 10:43 ID:???
>>816 自己レス。スマソ、勘違いしてました。
これは春分の日、秋分の日を求める計算式の話でした。
821 :
nobodyさん :03/10/09 15:29 ID:oORQJ7Be
オブジェクト指向プログラミングの場合、サブルーチンのプロトタイプはどうなるんでしょうか? 常に第1引数はクラス名?
>>823 エッ?(゚∀゚)もしかして知らないとか・・・
>>825 しーっ!
そっとしておいてあげて・・・
>>823 > 天文学上の祝日であるべき日と、実際の祝日が将来に渡って必ず一致するとは保証できません。(これまでの所は全て一致していますが...)
“バッファリングしない”とはどういうことですか?
830 :
nobodyさん :03/10/10 14:52 ID:h1c3Pi1I
配列と連想配列の多次元配列($hoge{foo}[0]みたいな)の全体を表現する(@hoge,%hogeみたいに) のってどうやればいいんですか?
@@hoge,%%hoge
>>825-827 823ではないが、秋分・春分に限らず、祝日が前年になるまで分からないのは
常識だと思うがな・・・。だからカレンダー業者が毎年右往左往するわけで。
今の流れから言って、天文学上火曜日になるはずのものを月曜日に
シフトする可能性や、ある年から固定日にシフトする可能性も全く否定
できないわけだが。
ろくに論拠も示さずにただ煽るのは感心しないな。
そりゃ現在の国民の祝日が未来永劫まであるという確証はないからな・・・
5月4日が祝日になるのは来年から? 2009年9月22日ははたして国民の休日になるのか? プログラムで万年カレンダー作ってるとこんなことも 気になってしょうがないw
Perl コーディング初心者質問コーナー Part28 1 名前:nobodyさん 03/09/15 03:01 ID:hl+VfJ8P いらっしゃーい、Perlのコーディングで困ってる人のスレです。
838 :
828 :03/10/10 17:26 ID:???
>>829 すいません、“フラッシュする”とはどういったことなんでしょうか?(汗)
839 :
nobodyさん :03/10/10 17:31 ID:u+RPzhqi
こんにちは、教えてクソです。 HTML::Template 使って XML なテンプレートを書いてます。 出力文字コードは UTF-8 にしたいので、テンプレートに埋め込む日本語は UTF-8 で書いてます。(Emacs + Mule-UCS で utf-8-unix) で、HTML::Template に渡すデータ構造も Jcode.pm あるいは Encodings モジュールを使って UTF-8 に変換して渡してます。 が、強烈に文字化けするとき多数。 HTML::Template に渡す前のデータ構造を Data::Dumper で dump してみても その時点では化けてなくって、どうやら HTML::Template->output したときに 化けるみたい。 なんか原因くさいの知ってる人いたら教えてくさいませ。
>>838 バッファに貯めたものを書き出すこと。
フラッシュ = flush = 洗い流す
$|=0; # 0かそれ以外かで下の挙動が変わるだろう。
print "Hello";
sleep 5;
841 :
839 :03/10/10 17:39 ID:???
あーすんませんもう一個しつもん モジュールのコードを読むときに pod 部分が邪魔なんですが、これを除去する フィルタとかって Perl に標準で付いてくるんですかね。
842 :
828 :03/10/10 18:00 ID:???
>>840 よく分かりました!
ありがとうございましたm(_ _)m
843 :
初心者 ◆eV4qRmoLQw :03/10/10 19:25 ID:fE08RGJE
下記のようなコードを書いているのですが、
どこか間違ってますか?
ブラウザのアドレス欄には、
http:// ×××/kankyou.cgi?id=&id2=&sousin=%83N%83G%83%8A%91%97%90M
id=のところに何も入らないのですが、どなたか分かる方
居ましたら、教えて下さい。
#!/usr/bin/perl
$aa = 'hogehoge' ;
$bb = 'hahahaha' ;
print <<"end" ;
Content-type: text/html
<html>
<title>
TEST
</title>
<body>
#<form action = "./kankyou.cgi" method = "post" >
<form action = "./kankyou.cgi?id=$aa&id2="$bb" method = "get" >
<input type = "text" size = 50 name = "id" ><br>
<input type = "text" size = 50 name = "id2" ><br>
<input type = "submit" name = "sousin" ><br>
<form action = "./kankyou.cgi?id=$aa&id2="$bb" method = "get" > ↑↑↑↑↑↑↑↑ 何これ?
""の組み合わせがおかしいなw 別にaction= に パラメタを入れるのはできるけど input type="hidden" を使えない理由でもあるのかな?
sousin=%83N%83G%83%8A%91%97%90M ま、これも笑えるんだが。
847 :
初心者 ◆eV4qRmoLQw :03/10/10 20:35 ID:fE08RGJE
すいません。hiddenの使い方が分かりませんでした。 教えて君ですいません。
>>847 > 分かりませんでした。
過去形なわけだね。
つまりはもうわかったという事だね。
おめでとう。
850 :
初心者 ◆eV4qRmoLQw :03/10/10 21:51 ID:fE08RGJE
いいえ、分かっていません。 どこかに詳しく書いてる所とか有ったら教えてほしいのですが・・・。 お願いします。
>>850 何をしたいの?
フォームの値を渡したいの?
ブラウザのURLに表示されるのを楽しみたいの?
<input type="text" name=number">(←正の整数を入れてもらう) に入力された値を、 $in{'number'} に入れ、仮に全角を入れられたら、半角にしたいと思ってます。 で、普通は &jcode::tr(\$in{'number'}, '0-9', '0-9'); でできるかと思います。 ------------------------------------------------------------- ただ、今、他人(すでに会社やめた人)が、作ったコードを改修しており、 それが、スクリプト自体の文字コードがSJISで、 $in{'number'}もSJISになっている状態です。 この状況で、全角数字を半角数字に置換するにはどうすればいいのでしょうか? どうも、そのまま &jcode::tr(\$in{'number'}, '0-9', '0-9'); とやっても置換されないようでして・・・ 教えていただければ幸いです。
>>850 ↓これでいいの?
>>850 #!/usr/bin/perl
$aa = 'hogehoge' ;
$bb = 'hahahaha' ;
print <<"end" ;
Content-type: text/html
<html>
<title>
TEST
</title>
<body>
<form action = "./kankyou.cgi" method = "get">
<input type = "text" size = 50 name = "id" value="$aa"><br>
<input type = "text" size = 50 name = "id2" value="%bb"><br>
<input type = "submit" name = "sousin" value="クリエ送信"><br>
つか、HTMLから勉強し直せ
855 :
854 :03/10/10 22:06 ID:???
スマソ 誤 <input type = "text" size = 50 name = "id2" value="%bb"><br> 正 <input type = "text" size = 50 name = "id2" value="$bb"><br>
>>853 $in{'number'} =~ s/0/0/g;
$in{'number'} =~ s/1/1/g;
$in{'number'} =~ s/2/2/g;
:
:
これじゃいかんの?
>>854 \ │ /
/ ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
─( ゚ ∀ ゚ )< クリエクリエ!
\_/ \_________
/ │ \
∩ ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< クリエクリエクリエ!
クリエ〜〜〜〜! >( ゚∀゚ )/ | / \__________
________/ | 〈 | |
/ /\_」 / /\」
 ̄ / /
 ̄
>>853 jcode が入っているようだから、Shift-JISで統一して操作してみればよろしいかと。
あと、jcode.pl(.pm)のドキュメントも読んでみると。
>>853 print sjis_num_z2h('私は7743です');
BEGIN {
require 'jcode.pl';
my $euc_num = '0123456789';
&jcode::sjis2euc(\$euc_num);
sub sjis_num_z2h
{
my $str = shift;
&jcode::sjis2euc(\$str);
&jcode::tr(\$str, $euc_num, '0123456789');
&jcode::euc2sjis(\$str);
return $str;
}
}
#string::multibyte,Jcodeモジュールの方がまだ楽。
862 :
853 :03/10/11 01:02 ID:???
>>856 ありがとうございます。たしかにそれでいけますね。
そのままだとちと気持ち悪いので、
sub sjis_num_z2h{
my $str = shift;
$str =~ s/0/0/g;
$str =~ s/1/1/g;
$str =~ s/2/2/g;
$str =~ s/3/3/g;
$str =~ s/4/4/g;
$str =~ s/5/5/g;
$str =~ s/6/6/g;
$str =~ s/7/7/g;
$str =~ s/8/8/g;
$str =~ s/9/9/g;
}
みたいな感じでやるかも。(あんま変わらないか。。。)
>>860 ドキュメント見直してみます。
>>861 なるほど、EUCに一端待避させてやればいいわけですね。
どの方法でやるかまだ決めてませんが、ともかくありがとうございます。
>>862 スクリプト自体の文字コードに依存しない方法。
sub sjis_num_z2h {
my $str = pop;
$str =~ s/\x82([\x4F-\x58])/chr(unpack('C', $1) - 31)/eg;
return $str;
}
865 :
854 :03/10/11 12:02 ID:???
>>859 正直すまんかった。
自分でワロてもた(w>クリエユーザなわけだが...
本当に初心者ですが、ここでいいですよね? DB上の一部の数値をクリアしたくて、下のように書きました。 tie(%dat,SDBM_File,"dbm", O_RDWR|O_CREAT, 0644); while (my($key,$olddat) = each (%dat)){ @psdat = split (/:/,$olddat); $psdat[7]=0; $newdat = join (":",@psdat); $dat{$key}=$newdat; } untie %dat; これを実行すると半分ぐらいは0になり残りは元の数値のままです。 もう一度実行すると4分の1が残り、次は8分の1…と 半分づつしか処理してくれません。 どこがおかしいのか分かる方、どうかアドバイスをお願いします。
eachで一つずつ読み出してる間にハッシュを書き換えてるから起きる予感。
>>866 each使わないでkeysで全てのキーを取得してから、それ使ってやってみなよ。
メモリ効率悪いのはわかるけどさ。
tie(%dat,SDBM_File,"dbm", O_RDWR|O_CREAT, 0644);
@keys = keys $dat;
foreach $key ( @keys ) {
@psdat = split (/:/,$dat{$key});
$psdat[7]=0;
$dat{$key} = join (":",@psdat);
}
untie %dat;
わり、こうだな。 @keys = keys %dat;
870 :
866 :03/10/12 00:22 ID:???
>>867 さん
>>868 さん
ありがとうございました。本当に。
あれだけ悩んだのが一発で解決です。
keyだけならそんなにメモリも食わないんで、これでバッチリです。
local($min,$hour,$t_day,$mon,$year,$wday) = (localtime(time))[1..6]; open(DAY, "+> day.dat"); $d_day = <DAY>; print DAY $t_day; close(DAY); if($t_day eq $d_day){ open(CNT, "+> count.dat"); $cnt = <CNT>; $cnt = $cnt++; print CNT $cnt; close(CNT); }else{ open(CNT, "> count.dat"); $cnt = 0; print CNT $cnt; close(CNT); } 日付が変わればcount.datがリセットされ、 変わらなければcount.datの数字に1足されるアクセス制限スクリプトを考えているのですが、 上記スクリプトでは延々とcount.datが加算されません…。(0のまま) どこが間違っているのでしょうか。手解きの程お願い致します…。
873 :
nobodyさん :03/10/12 01:53 ID:ED62rmbw
画像を拡大縮小して保存したいんだけど どうすればいいのか、まったく見当もつきません。 そのようなモジュールなどあるのでしょうか? おしえてください。
>$cnt = $cnt++; これはいつまでたってもかわらんなw
876 :
871 :03/10/12 02:21 ID:???
>>872 >>874 ありがとうございます。再度試してみます。
これ、open関数間違ってますか…?
だとしたら、どこが間違っているのか解らないんですが…
ずっと考えてたんですが。ヘボでスマソ…
>>876 >$cnt = $cnt++;
$cnt が、0とすると、$cnt++で$cntは1になるが、後置なので式では0
結局、いつまでたっても$cnt = 0; という式になる
878 :
871 :03/10/12 02:29 ID:???
>>877 あ、++の方は解りました。すんません。
>>872 の2番目のリンクがopen関数を指してたんですが、
open関数の間違いが解らなくて…
>>878 よくわかって無いなら、読み書きを一回のopenでやるのはよしとけ
881 :
871 :03/10/12 02:57 ID:???
>>880 了解しました。ありがとうございます。
openについて勉強し直します。
>>882 perlではファイル名などでは終端になるけど文字列では連結になる。
だからその説明文は誤り。
うそはうそであると見抜ける人でないと (インターネッツを使うのは)難しい
>>883 ああなるほど。
open(FILE,"/etc/passwd\x00.html");とすると/etc/passwdが開かれるということですか。
Perlの仕様じゃなくてopenシステムコールが/etc/passwdまでしか読まないことが原因なのかな。
先生…Perl詩とか…無理過ぎました…。
二次元の配列を特定の列で昇順・降順を指定してソートかけるにはどうすればよいのでしょうか? 手持ちのリファレンスにやり方が書いてなく 本屋で3冊くらい配列の章を立ち読みしましたが実例コードや具体的な方法が書いてありませんでした。 自分は @Array =( [1,2,5,3,5] [3,5,6,3,4] [9,4,5,4,2] ); このような配列を2列目や3列目の値でソートしたいのですが
>>886 study;
http://groups.google.co.jp/groups?q=poem&btnG=Google+%8C%9F%8D%F5&meta=group%3Dcomp.lang.perl.* >>887 @Array = (
[1,2,5,3,5],
[3,5,6,3,4],
[9,4,5,4,2],
);
my $i = 1; # 列の添え字
my @sorted_array = sort { $a->[$i] <=> $b->[$i] } @Array;
>>887 for(@Array){
my @a=sort @$_;
$_=\@a;
}
やりたいことがよくわからないが、こういうことかな。
もっと短くなりそう。
890 :
889 :03/10/12 16:48 ID:???
行ごとにソートしちまった。 逝ってきます。
891 :
nobodyさん :03/10/12 17:01 ID:pLoTHScF
$word = '\w+'; $num = '\d+'; $back = '\\+'; $_ = 'Test\1\2\3'; @a = /($word|$num|$back)/go; print join(":", @a), "\n"; # Test:1:2:3 Test:\:1:\:2:\:3と表示させるには、$back='\\\+'としなければなりません。 バックスラッシュそのものにマッチさせるには、なぜ、2つ(\\)ではなく、 3つ(\\\)も必要なのでしょうか?
893 :
891 :03/10/12 17:55 ID:???
>>892 さん、どうもありがとう。
print '\\+'; # \+ <- これでわかりました。
/(\w+|\d+|\\+)/go; <- こう書く場合と混同してました。
894 :
887 :03/10/12 18:25 ID:???
>>888 さん、
>>889 さんありがとうございました
>>888 さんのスクリプトで動きました
いままでmap関数など使って失敗してたのがシンプルで見やすいスクリプトで書けたので楽になります
ありがとうございました
895 :
nobodyさん :03/10/13 00:28 ID:lpcebX3k
超初心者 PHP内でlineの色を変更するにはどう記述すればいいのですか?
lineって何よ?
PerlとPHPを組み合わせる方法を教えてよ☆
Perlスクリプト起動 → PHPスクリプトを生成 → Locationか何かでそれにアクセス → 何か適当にやる → Perlスクリプトの方に戻る → PHPスクリプト消去 → 終了 駄目だ弱過ぎる。
900ずさー
>>898 cat /usr/bin/perl /usr/local/bin/php > hoge
よろしくお願いします。 フォーム内に入力した言葉を、ボタンをクリック後、指定した文字に置き換えるというのは、どうすればできるのでしょうか・・。 ご教授頂けると大変ありがたいのですが、参考サイトだけでも、どうかお教え頂けませんでしょうか。 例)abcをラーメンに、defを餃子に置き換えるルールを作る。 フォームにabcdefghiと入力してボタンをクリックすると、「ラーメン餃子ghi」という結果が出る。 すみません、よろしくお願いします・・・。
904 :
903 :03/10/13 11:32 ID:???
1つだけの置き換えなら、 $from = 'abc'; $to = 'ラーメン'; &jcode'tr(*value,$from,$to); とすればできたのですが、2つ以上の設定となるとわからないんです・・。
フォームから受け取った内容が $hoge に入っているとして、 $hoge =~ s/abc/らーめん/g; $hoge =~ s/def/ぎょうざ/g; でいいんじゃ? つーか、「2つ以上の設定」の簡単なやり方は 同じことを繰り返すこと。
906 :
903 :03/10/13 12:07 ID:???
>>905 さん
それ通りに書くと、できましたわ・・・。
ご教授ありがとうございました!!
しかし私は勉強不足で大変おはずかしいです。
本当にありがとうございました。
学校の宿題でperlで三角形の面積を出すプログラムを書くように言われたのですが、 掛け算割り算の書き方から解説されているサイトってありませんか?
すみません。文字コードがUnicodeのファイルを扱わなきゃならないんです が、うまくできません。どなたか助けてください。 use Encode; use utf8; $orig = '018_package.html.ttx'; $out = 'out.txt'; open(IN,'<:encoding(UTF-16LE)',$orig) or die "Can't open $in: $!\n"; open(OUT,'>:encoding(UTF-16LE)',$out) or die "Can't open $out: $!\n"; while (<IN>) { # ここで置換処理など print OUT; } close IN; close OUT; こんなコードを書いてみたのですが、 UTF-16LE:Partial character at xxx.pl line xx, <IN> line xx. ってエラーが出てしまいます。わかんないよ〜〜〜。
ごめ。上げます〜。
>>907 三島さんところかとほほさんの所がいいんじゃないかな?
検索すればすぐ見つかるよ
つーか三角形の面積だったら中学レベルの2次元平面座標3点から面積を求める公式にはめこむだけだと思うが
>>907 !#perl
die "Usage: menseki.pl teihen takasa\n" unless
( defined $ARGV[0] && defined $ARGV[1] );
print $ARGV[0]*$ARGV[1] . "\n";
exit;
>911 やり方教えてくれって言ってるならともかく、解説サイト教えてくれって言ってるんだからいいじゃないか。 自分でやろうという意思はあるようだ。
あ、2で割るの忘れた。。。(鬱死
>>913 本気で自分でやろうとするなら、解説サイトぐらいぐぐるぜ。
参考書を親に買いに行かせるような行為だな。
ほんでもって参考書が理解できなかったら買ってきた親を怒るんだろうな。
>>912 、914
そんな簡単な宿題じゃないと思う。
きっと3辺の長さから面積を求めるんじゃないの?
917 :
907 :03/10/13 19:53 ID:???
>910 なんとかできました。ありがとうございます。 >912>914 や、スクリプトまで書いていただいちゃってすいません。 理解できるようにがんばります。 >915 教科書を買い損ねてしまったもので、検索もしてみたんですが どのサイトを読めばいいのかちょっとわかりませんでした。 まだ演算子の使い方を習っている段階なので、ヘロンの法則 じゃなくて底辺×高さ÷2でいいそうです。
多角形の面積: 外積の和の1/2
時代もかわったもんだなあ
漏れが学生の頃は教育用の言語といえばフォートランかCが主流だった
いまだにCはそれ自身だけじゃなく子孫が繁栄しているおかげで無駄にはなってないよ
>>907 変数と型・有効範囲
演算子
制御構文
サブルーチン
あと配列
このへんだけしっかり身に着けておけば
他の言語もすぐに覚えられるよ
学校ならそのうちサブルーチンに値を渡して面積を返すようなものも作らされると思う
苦労は無駄にはならないから頑張れ
初心者にまずperlから教えるというのは随分DQNな教官だな。 専門学校?
東光特等少年院
923 :
908 :03/10/13 23:24 ID:???
すみません。PerlのUnicodeサポート関係、詳しい方いらっしゃいましたら
>>908 についても情報ください〜〜。
参考になるHPのポインタでも結構です。
perldocで調べろ!とかはお許しください。読んでもチンプンカンプンで
わかんないので質問しました。
よろしくお願いします。
>>923 さっさと5.8.1にバージョン上げる。
( ゚Д゚)・・・ アホか
>それでええやん 関西弁は本7
>>927 ソケットをまだ身に付けてなかった初心者時代、正直やったw
933 :
928 :03/10/14 17:55 ID:???
>>931 違うが・・・
たしかにポンシチは関西だが、関西弁全部を本7と決め付けるには(ry
でも、それでいいと言い切るのはphp使いだしなあw
>>927 は、モジュールとか入れられる環境?
入れられるならLWP等を入れるのも手かも
つか、なんでモジュールインストールできるのか、って聞くのがいまだにわからないのだが・・・ インストールできないのなら、そのまま.pmをうpしてuse *.pm(コマンド間違えてるかもしれない) ってすればいいと思うのだが・・・
937 :
nobodyさん :03/10/14 20:30 ID:qwuohjrW
>>936 ピュアPerlじゃないのはそうもいかないっしょ。
938 :
936 :03/10/14 20:37 ID:???
>>937 スマヌ、ピュアPerlって意味がわからん・・
まだまだ俺も無知だ..
無知無知(;´Д`)ハァハァ…
941 :
936 :03/10/14 20:45 ID:???
942 :
936 :03/10/14 20:47 ID:???
最近Perl始めまして、できない事があるので質問させてください。 入力フォーム(Text)エリアに入力された文字列が数字かどうか判断したいのですが やり方が分かりません。みなさんはどうされていますか? 最終的にやりたい事は、to_server_param.cgiから渡された入力パラメータの内、 入力フィールド"name","path","expires","secure"の値を from_server_cookie.cgiに渡し、Set-Cookieでクッキーに保存する。 入力フィールド"length"に何か入力されていればその値を数字かどうか判断し、 数字であれば入力されたlength分だけSet-Cookieする。 数字でなければ、または入力されていなければ、全て保存する。 入力フィールド"name"に何か入力され、尚且つ入力フィールド"count"に何か 入力されていればその値を数字かどうか判断し、数字であればcount回数分 繰り返す。例えば10が入力されれば"name1"〜"name10"とクッキーの名前を変えて 繰り返す。何も入力が無ければ1度だけ。名前も変えない。 です。次に書きかけのソース乗せます。
944 :
943 :03/10/14 21:27 ID:???
#!/usr/bin/perl #this is "to_server_param.cgi" print "Content-type: text/html", "\n\n"; print "<HTML>"; print "<HEAD>"; print "</HEAD>"; print " <BODY>"; print " <form action='/cgi-bin/from_server_cookie.cgi' method='post'>"; print " NAME 'NAME=VALUE;'<BR>"; print " <INPUT TYPE=TEXT SIZE=20 NAME=name VALUE='NAMAE;'><BR></BR>"; print " path 'path=/cgi-bin/;'<BR>"; print " <INPUT TYPE=TEXT SIZE=20 NAME=path VALUE='/cgi-bin/from_server_cookie.cgi;'><BR></BR>"; print " expires 'Sun, 31-Dec-2003 23:59:59 GMT;'<BR>"; print " <INPUT TYPE=TEXT SIZE=40 NAME=expires VALUE='Fri, 31-Dec-1999 23:59:59 GMT;'><BR></BR>"; print " secure On Off<BR>"; print " <INPUT TYPE=RADIO NAME=on_off_radio VALUE='On'>On"; print " <INPUT TYPE=RADIO NAME=on_off_radio VALUE='Off' CHECKED>Off<BR></BR>"; print " length<BR>"; print " <INPUT TYPE=TEXT SIZE=5 NAME=length><BR></BR>"; print " count<BR>"; print " <INPUT TYPE=TEXT SIZE=5 NAME=count><BR></BR>"; print " <INPUT TYPE=SUBMIT>"; print " </form>"; print " </BODY>"; print "</HTML>";
if($hoge =~ /^\d+$/){ print '数字です'; }else{ print '文字列です'; }
946 :
943 :03/10/14 21:34 ID:???
#!/usr/bin/perl #this is "from_server_cookie.cgi" $data=$ENV{'QUERY_STRING'}; read( STDIN, $data, $ENV{ 'CONTENT_LENGTH' } ); $data1=$data; print "Content-type: text/html\n"; print "Set-Cookie: "; my @pairs1 = split(/&/,$data1); foreach $pair1 (@pairs1){ my($name1, $value1) = split(/=/, $pair1); unless($value1 eq ""){ if($name1 eq "length"){ unless($value1 eq ""){ #←ここで数字か判定したいです。 $length1 = $value1; } } elsif($name1 eq "count"){ unless($value1 eq ""){ #←ここで数字か判定したいです。 $counter1 = $value1 } } else{ ・ ・ ・
947 :
943 :03/10/14 21:36 ID:???
>>945 さん
ありがとうございます!!さっそくやってみます!
みなさん、長文ご迷惑をおかけしました。がんばります。
早わざだな・・・
おーい
すみません。初心者の質問で申し訳ないのですが、どうしてもわからなくて、挙げさせていただきました。 perlのLWPモジュールを使用して、ファイル(aaaというファイル)を読み込み、その内容をサーバにPOSTし、レスポンスを捕らえるということをしたいのですが、
下記のような(一部省略してあります)コードで動作させると、 aaaのサイズがある一定以上になると、止まってフリーズしてしまうのです。
ファイルサイズが大きすぎて、メモリに読み込めないのか?と思ったのですが、aaaのサイズは30k程度のテキストファイルなのです。
数k〜10k程度なら、下記コードで、ちゃんと動くのです。それ以上の大きさのファイルだと、動かなくなってしまい、とても困っています。 わたくし、初心者ですので、全くダメなコードを書いているかもしれません。
それとも、LWPのモジュールにはPOSTデータ量の制限とかあるのでしょうか? ソースは眺めてみたのですが、良くわかりませんでした。
理由・解決策等ご存知のかた、教えてくださいませんでしょうか。 よろしくお願いいたします。
------------------------
use LWP::UserAgent;
open(DAT, "aaa") or die("Can not open file : ($!)");
while( $buff = <DAT> ){
push(@datadata, $buff);
}
close(DAT);
my $url_num = ※※;
my $ua = LWP::UserAgent->new;
my $req =
HTTP::Request- >new(POST => $url_num);
$req->content_type('form-data');
$req->content(join('', @post_data));
if ( $res->is_success) {
$resfile = ※※※;
my $res = $ua->request($req);
open(OUT, "> $resfile");
print OUT $res->content;
close(OUT);}
else{
}
-------------------
↑すんません。コードのみ追加で挙げます。
------------------------
use LWP::UserAgent;
open(DAT, "aaa") or die("Can not open file : ($!)");
while( $buff = <DAT> ){
push(@datadata, $buff);
}
close(DAT);
my $url_num = ※※;
my $ua = LWP::UserAgent->new;
my $req =
HTTP::Request- >new(POST => $url_num);
$req->content_type('form-data');
$req->content(join('', @post_data));
if ( $res->is_success) {
$resfile = ※※※;
my $res = $ua->request($req);
open(OUT, "> $resfile");
print OUT $res->content;
close(OUT);}
else{
}
-------------------
>>951 とりあえず、use strict; をお勧めします。
>>944 <!DOCTYPE ~
<p></p>
入れようよー(泪)
全然関係ないツッコミだな
>>950 コードに問題はないし、モジュールに制限はない
何秒くらいかかる?タイムアウトの可能性はあるかな
あとはクオータとかtmpのサイズとかって、、、30kしか容量ないというのもあれだな・・・
open(DAT, "aaa") or die("Can not open file : ($!)"); #binmode(DAT); # Win ならば行頭のコメントを外す。 @datadata = <DAT>; close(DAT); ファイル終了コードを取り込んで while が無限ループしているような悪寒。(憶測)
>939 Cとか埋め込まれてたりするモジュールあるの?
>>957 普通にあるでしょ。lib/perl5の下の.soファイル探してみればわかる
>>957 標準モジュールとかはほとんどそうなんじゃないの?
.soぅなんですかぁ・・・
961 :
nobodyさん :03/10/15 21:26 ID:gKX0QkEj
スレ違いみたいかな?
スレ違いだと思ったので違うスレで質問させていただきました。 ご迷惑おかけしてすいませんでした
964 :
nobodyさん :03/10/15 21:35 ID:Ts29J0vM
>>957 Storableモジュールは有名だね。
高速化のために肝の部分をCで作ってるって。
966 :
nobodyさん :03/10/16 00:52 ID:h2L2XbQW
if ($base_url) { $ref = $ENV{'HTTP_REFERER'}; $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($ref !~ /$base_url/i) { &error("不正なアクセスです"); } } 質問です。 一部の方が投稿出来ないと言われ a-zA-Z0-9にした方が良いのですか?
>>966 ノートンバカが HTTP_REFERER を斬っているから。
&error("不正な日本語です");
969 :
nobodyさん :03/10/16 01:14 ID:Fo3ziY9D
C-Board掲示板(Ver354)のstyle\bse.txtに $page{'info'} という 部分があるのですが、これは関数(サブルーチン)ですか? Perlの紹介ページなんかではサブルーチンは「 ( ) 」らしいの ですが・・・
971 :
966 :03/10/16 01:19 ID:h2L2XbQW
972 :
969 :03/10/16 01:20 ID:???
>>970 なるほど、配列ですか。Perlでは定義以外にも{}使うんですね
>>952 ,955,956さん、ありがとうございました。
ご指摘を参考に、もう少し試してみます。
>>969 まずは、C-BoardをDeleteする事をお勧めする。
975 :
nobodyさん :03/10/16 07:07 ID:vV+88U+f
掲示板で、書き込み者のユーザエージェントを表示したいのですが、 my(@user) = split(/\//,$ENV{'HTTP_USER_AGENT'}); とか $user = $ENV{'HTTP_USER_AGENT'}; とか記述して、 別のサブルーチン内で$userを表示するために print<<"_EOM_"; $user _EOM_ としたんですが、何も表示されません。 どうすればちゃんと表示されるのでしょうか?
>>975 print "HUA:[$ENV{'HTTP_USER_AGENT'}]\n";
977 :
975 :03/10/16 08:42 ID:vV+88U+f
>>976 それだと書き込み者じゃなくてアクセス中の自分のUserAgentが
表示されるだけになりませんか?って私のやり方がおかしいのかな
>>975 ちゃんとログに$user書き込んでるかどうか確認しる。
藻前の書いてるのは
>>976 と同じことだぞ。
979 :
975 :03/10/16 09:46 ID:vV+88U+f
>>978 おおーできました。基本的なことに気付いていなかったようで。
>>976 さんと合わせて、ありがとうございました。
980 :
nobodyさん :03/10/16 12:40 ID:c+B+rkqG
$a = 'test'; 上記の変数aの中身の'test'を展開して、$testといったような変数を作りたいのですが、 可能でしょうか?
可能です
982 :
980 :03/10/16 13:05 ID:c+B+rkqG
983 :
nobodyさん :03/10/16 13:05 ID:sHNsaMy8
純粋にPerlの質問か微妙ですが…。
JavaScriptのdocument.reffererで取得したリンク元を、
CGIに送ってプレーンテキストとして表示したいのです。
↓htmlに貼り付けたJSはこちら
<SCRIPT Language="JavaScript">
<!--
document.write("<img src='
http://www 〜〜〜cgi?");
document.write(document.referrer+"' width=1 height=1>");
// -->
</SCRIPT>
↓CGIはこちらです。
#!/usr/bin/perl
#---データ受け取り
$buffer = $ENV{'QUERY_STRING'};
$buffer = ~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$buffer = ~ s/<([^>]|\n)*>//g;
#---出力
print "Content-type:text/plain\n\n";
print "$buffer\n";
実行すると8桁程度の数字のみが表示されるのですが…
どうしたらまともに表示できるのでしょう?
ご存知の方よろしくおねがいします;
>>983 print $ENV{'QUERY_STRING'};
配列の頭二つを取り除くのに shift @array; shift @array; と二回やってるんですが、これを一回で纏めてやる方法ってありますか?
986 :
983 :03/10/16 13:32 ID:sHNsaMy8
>>983 漏れも昔よくやったよ
$buffer =~ s/
989 :
983 :03/10/16 13:43 ID:sHNsaMy8
すみません、表示された4294967295という数字が… JSのエラーらしいです。調べてみます。 984さんありがとうございました(^^;
上手く質問できないんですが、 人間の目で読めない文字(コンピュータ文字?)を取り除く 正規表現とかって可能ですか? 例えば、バイナリファイルをそのままテキストで書き出したとき、 とかに化けて表示される部分だけを取り除きたいんですが・・・。
991 :
nobodyさん :03/10/16 14:50 ID:mXGYJHOc
>>990 化けて表示される文字だって人間が読める文字だろうが
>987 デキターと言う事でどもでした。
>>992 ( ・∀・)つ〃∩ ヘェ~ヘェ~ヘェ~ヘェ~ヘェ~
HTML::Templateをインストールしようと思い perl -MCPAN -e "install HTML::Template" とやったのですがC:\.cpan\build\HTML-Template-2.6\に展開されるだけで インストール出来ませんでした。 その後perl\site\libに展開されたファイルを置いてもuse出来ず、 仕方ないので以前聞いたようにHTML::Templateを 使いたいPerlスクリプトと同じディレクトリに置いてみたのですがやっぱり使えずと困っています。 どうすればインストールできるのでしょうか…。 Win2K; Apache1.3.27; ActivePerl5.6.1
998 :
980 :03/10/16 16:13 ID:c+B+rkqG
2
999 :
980 :03/10/16 16:16 ID:c+B+rkqG
銀河鉄道
1000 :
980 :03/10/16 16:17 ID:c+B+rkqG
1000だ場かども
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。