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

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

■ このスレッドは過去ログ倉庫に格納されています
0001前スレの連投で気分崩したので後よろ04/04/05 16:01ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

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

過去ログやお勧めサイトは >>2-10
0032nobodyさん04/04/07 02:46ID:???
いま、UPされたファイルをCGI.pmを使ったりして一度保存し、
それをImageMagickでまた読み込んで編集して保存してるんですが、
これをわざわざ一度保存せず、編集して書き出すことって出来ないでしょうか?
いろいろ調べたのですが、どうもwin環境だからか、何度試しても動いてくれません。

CGI.pmを利用し、アップしたファイルのファイルハンドルが$fileに入ってます。
$img = Image::Magick->new;
$img->Read(file=>\$file);

↑こんな感じで動くと書いてあるサイトがあったりするのですが、
読み込んでくれません。
どのようにすれば可能なのか、また例えばwin環境では無理なのか等、
教えていただけませんでしょうか。
0033nobodyさん04/04/07 03:12ID:???
>>32
>>1
http://www.imagemagick.org/www/perl.html#exam
0034nobodyさん04/04/07 05:02ID:???
>>33
えっと、そのページは翻訳しもって一通り読んでます。
で、そのスクリプト例の項目がどう関係あるのかわからないのですが。。
つまり、そんなこと出来ないということでしょうか?
0035nobodyさん04/04/07 06:45ID:???
>>34
私のところでは、問題発生しました…で強制終了。
ファイルハンドルではなぜか使えない。
0036nobodyさん04/04/07 07:20ID:???
>>35
ああやっぱりそうですか・・・うちもperlが強制終了しちゃいます。
UNIX系の環境ではどうやら動くようなのですが、
レンタルしてる鯖につっこんで実験ってのはこわくてできないし(強制終了ですからねぇ)
そもそもローカルテスト環境と本番の環境で違うファイルにしなければならないというのは
少々困りものですし・・・。

出来ないなら諦めて今までどおり一旦保存して再読み込みでいくしかないですね。
しかし検索してもこのような問題が出てこないんで、やはり書き方に問題があるような気も。
もうちょっとだけ調べてみます。
00371504/04/07 09:13ID:???
>>16-31
なんとか解決できました。
ありがとうございました。
0038nobodyさん04/04/07 16:02ID:9kyfgT/3
*hoge = 10;
とは、どういう事なのでしょうか?
よく分りません。
よろしくお願いします。
0039nobodyさん04/04/07 16:04ID:???
>>38
型グロブ
0040nobodyさん04/04/07 16:08ID:9kyfgT/3
>>39
レスありがとうございます。
型グロブということは存じておりますが、
10を代入した結果、どうなるのか?、なぜそうなるのか?が分らないのです。
0041nobodyさん04/04/07 17:36ID:???
普通 *hoge = 10 なんてしない。誰だよそんなコード書いてる香具師は。
*hoge = \10ならまだ分かるが。
0042nobodyさん04/04/07 18:04ID:s+a2EP68
>>41
スミマセン、自分でどうなるかな・・・と。
*hoge = \10
なら型グロブに10へのリファレンスを生成するという事ですか?
型グロブにリファレンスって変な事ないですか?
0043nobodyさん04/04/07 18:55ID:???
>>42
型グロブはSCALAR, ARRAY, HASHなどのフィールドを持ったデータ。
(スカラー、配列、ハッシュにそれぞれ同じ名前で別の変数を定義できるのもこのため)
*hoge = \10 や *hoge = \%hash は型グロブのそれぞれのデータフィールドへの代入となる。
つまり、上記の代入を行った後は $foo は定数10の別名となり、print $fooは10を表示する。
定数の別名である為、$foo = 1等は10 = 1と等価となり、実行時エラーになる。
もちろん、%hogeは%hashの別名になる。
このフィールドは、直接 *hoge{SCALAR}, *hoge{HASH} として直接参照することも出来る以下略
0044nobodyさん04/04/07 21:03ID:???
csvのデータをよみこんで、ただ表示するcgiを作ろうと思っているのですが、
表示はされるものの文字コードの処理の仕方がわかりませぬ(´Д`)

よくみかける
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
&jcode'convert(*value,'sjis');

$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/\n//g;
$value =~ s/\r//g;
$value =~ s/\t//g;
$value =~ s/\,//g;

を使うんだとは思うんですが、教えてください。。
ちなみに今は
if (!open(IN,"$file")) { &error('データベース読取エラー','復旧をお待ちください.'); }
while(<IN>){
($d,$DATE,$NAME,$SEX,$KATEGORI,$TEIKA1,$TEIKA2,$HANBAI1,$HANBAI2,$IMAGE,$KANRI) = split(/,/);
print qq( ・・・・
とかいております。。
よろしくお願いいたします。
0045nobodyさん04/04/07 21:18ID:???
おkおk。
キミはGETでパラメータを渡したとき、hoge.cgi?a=001+1&b=002&...というのは見たことはあるな?後ろにくっつくウザい文字列だ。
日本語を渡すとわかるが、ワケわからん状態になっているはずだ。
あれを正常な状態に戻す処理だ。

1.$value =~ tr/+/ /;
I am hoge.という文字列をQUERY STRINGに渡すと、I+am+hogeとなる。空白の部分が+になるわけだ。
これじゃ元のデータと違ってしまうから、+を半角スペースに置き換える処理。

2.$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis');
%8B%B3%82%A6%82%C4%8C%4E%82%CD%8B%41%82%EAなどの文字列を普通の文字列に直す処理。
後半はjcode.plやらの文字コード変換ツールでsjisに変換している。

3.$value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/\n//g; $value =~ s/\r//g; $value =~ s/\t//g; $value =~ s/\,//g;
キミが書いたときには、同じ記号が並ばずに&lt;とか&gt;ってなってたよな?
HTMLとかで読ませると、キミの書き込みのように記号扱いされてしまうが。
これを実態参照(だっけ?違ったら修正よろ)という。
ようするに、BBSなどで本文にタグとかを書かれると困るから、<や>記号を&lt;とか&gt;に置き換えようってことだ。

クソ適当なんで誰か追記叩き修正フォロー暴言罵倒誹謗中傷お願いします。
00464404/04/07 22:08ID:???
>>45
そこんとこの意味はなんとなくわかるんですが
if (!open(IN,"$file")) { &error('データベース読取エラー','復旧をお待ちください.'); }
while(<IN>){
($d,$DATE,$NAME,$SEX,$KATEGORI,$TEIKA1,$TEIKA2,$HANBAI1,$HANBAI2,$IMAGE,$KANRI) = split(/,/);
print qq( ・・・・
のどこにどんな風に記述すればいいですかのう・・(´Д`)
0047nobodyさん04/04/07 23:47ID:???
>>44
cgiで$fileを読み込んで表示したいだけではないの?
なぜデコードや文字コードの処理がでてくるのやら。
0048nobodyさん04/04/07 23:56ID:???
>>46
それだけのコードが自分で書けるのに、なぜ分からんのか不思議。
0049nobodyさん04/04/08 00:28ID:???
>>46
つか具体的にどういう不具合があるのさ
0050nobodyさん04/04/08 01:00ID:???
出力はSJIS。CSVファイルはEUC。そして文字化け。ってことかの?
それならjcodeの引数をもうひとつ追加すれば解決。
どっちにしろURIエンコードは関係なさそうだね。
00514404/04/08 04:13ID:???
>>47-50

いや、うまくいくと思ってたらうまくいかなかったので
なんでかなーと・・。
でももうひとつ引数追加すればいいわけですか。。
やってみるわ〜。
あんがと〜
0052nobodyさん04/04/08 10:14ID:???
情報を小出しにするとみんなが混乱する凡例でした。

では次の質問ドゾー
0053nobodyさん04/04/08 20:22ID:???
詰まったので質問させてください。
「ハンドルネーム@〜」って名前を入れられた時に、@以下を切り落としたいんですが
名前によっては上手く切り落とせないんです。

$str = "ファイア@炎";
$str =~ /^([^@^@]+)/;
$str = $1;
print $str;

例えば、この場合「フ」とあとなんか変な文字が$strに入ってしまいます。
入力文字列によっては上手く切り落とせる事もあるんですが・・・
何が悪いんでしょうか?
0054nobodyさん04/04/08 20:41ID:???
$str =~ s/(@|@).+$//;
00555304/04/08 20:46ID:???
>>54
$str = "ファイア@炎";
$str =~ s/(@|@).+$//;
$str = $1;
print $str;

実行した出力結果:
@

切り落とせてないんですが・・・
00565304/04/08 20:48ID:???
勘違い。

$str = "ファイア@炎";
$str =~ s/(@|@).+$//;
print $str;

出力結果:
フ(と、変な文字)

やっぱり出力できてないんですが・・・
0057nobodyさん04/04/08 20:58ID:???
EUCに変換してから処理するのが吉。
たぶん、sjisでやっていると思うんだけど、
ァの二バイト目=0x40、@=0x40っていうところに注目。
0058nobodyさん04/04/08 21:02ID:???
>>53
$str = "ファイア@炎";
$str =~ /^((?:\x81[\x40-\x7e\x80-\x96\x98-\xfc]|
[\x82-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]|
[\x20-\x3f\x41-\x7e])*)/x;
$str = $1;
print $str;
0059nobodyさん04/04/08 21:14ID:nuxHv3wJ
pack関数で困ってます。
10進数のIPアドレスを、2進数の文字列に変換したいのですが、

$num2 = unpack("B32", pack("C*", 192,50,218,168)); のIPアドレスの部分を、192,〜の固定でなくて、
ファイルから読み取りたいのですが、そこを $file と指定しても読み取ってくれません。
どう書いたらいいのでせうか・・・
00605304/04/08 21:17ID:???
>>58
凄い!それで無事行けました。
perlメモの、「正しくパターンマッチさせる」のsjisへの応用ですよね。

ところで、文字コードを表す部分は分かるんですが、最初の
?: と 最後の修飾詞 x の役目が良く分からないんですが・・・
? は「直前の1文字が0回または1回」ということですが、直前に何も付いてないみたいなんですが・・・
また、x (拡張正規表現)は、持ってるperl本を引いてみた所、「空白文字を無視し、#以降をコメント扱いする」とあります。
でも、空白もコメントも使ってないので、外してみたらマッチしなくなりました。
良ければこれら意味も教えて頂けないでしょうか?
0061nobodyさん04/04/08 21:18ID:???
>>59
>>1
0062nobodyさん04/04/08 21:19ID:???
常識じゃないのか
0063nobodyさん04/04/08 21:27ID:???
>>60
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlre.html

改行やタブも空白文字 (white space) 。
>>58 は改行されているので /x が必要。
/x を外したかったら
/^((?:\x81[\x40-\x7e\x80-\x96\x98-\xfc]|[\x82-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]|[\x20-\x3f\x41-\x7e])*)/
とするべき。
0064nobodyさん04/04/08 21:46ID:???
>>59
$fileには何が入ってるの?
00655304/04/08 21:49ID:???
>>63
あーっ、分かりました。
とんでもない勘違いしてました。空白文字を含むのは$strではなく、パターンの方ですね。
どうもこういう勘違い多いな自分・・・
これで納得できました。どうも有難うございます。
?: については、本調べてたら載ってました。前方一致、ってことですね。
perl5に追加された拡張構文であり、拡張正規表現の x修飾詞とは別に関係ない。
まぎらわしいけど、何とか覚えました。

これで何とか出来そうです。
・・・なんですが、おまけで書いて頂いた「/xを外したかったら」を実行してみたところ挙動が変です。
何度もすみませんが、こういうのどうしても気になる性質で・・・

$str = "ファイア@炎";
$str = /^((?:\x81[\x40-\x7e\x80-\x96\x98-\xfc]|[\x82-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]|[\x20-\x3f\x41-\x7e])*)/;
print $str;# マッチング判定結果表示
$str = "$1 $2 $3 $_";
print $str;

実行結果:
1

------------------------
マッチングは上手く出来てるようなんですが、その文字列がどこに格納されたのかが分からないんです。
$1 に入ってなかったので、それっぽい変数を色々乗せてみましたが全く当たりません。
いったい、どこに行ったのでしょうか・・・?
0066nobodyさん04/04/08 21:52ID:???
>>65
マッチング?
$strに代入して何がしたい?
0067nobodyさん04/04/08 21:55ID:???
もういいよ来るな
何でもかんでも人に聞かずにとりあえず黙って調べてテストしてを繰り返せ
00685304/04/08 21:56ID:???
>>66
あ(恥
すみません、単純なコードミスでした。
エラー出して欲しかった・・・ use strictしてもにエラーでなかったし
00695304/04/08 22:00ID:???
>>67
でも、本当に簡単なミスでも、指摘されるまで気付かないことだってありますよ。
いくらテストしても、エラー出ないからどの行が悪いのかも見当つかないし。

これで完全に解決できたので、以降書き込みには来ません。
答えてくれた方、有難うございました。
0070nobodyさん04/04/08 22:12ID:???
> 指摘されるまで気付かないことだってありますよ。

普段どんなデバッグ手法使ってるのか良く分かった。
0071nobodyさん04/04/08 22:12ID:???
んなもん、やってるうちに簡単なミスなんかしなくなるし
何処でミスしたかもすぐわかるようになるんだよ

一つ質問する
↓
回答どおりしたら解決した
しかし他のわからないことも質問
↓
解決。別の質問
↓
繰り返し

この一連の流れの中に「自分で調べる」を入れろ
せめて2,3時間調べろ
0072nobodyさん04/04/08 22:19ID:???
たしかに言語と自分の癖が分かってくると、あー糞またあのミスかってなるw
0073nobodyさん04/04/08 22:21ID:???
>>72
それは財産だ。大事にするヨロシ
0074nobodyさん04/04/08 22:26ID:???
>指摘されるまで気付かないことだってありますよ

おまいプログラムやめろ
少なくとも共用サーバでスクリプト走らせるのやめろ
00755904/04/08 22:31ID:1altNbSl
>>64 IPアドレスが一行づつかれたファイルです。
192.168.0.1
192.168.0.10
192.168.0.100
みたなものです。
0076nobodyさん04/04/08 23:28ID:???
>>75
$file = '192.50.218.168';
$num2 = unpack("B32", pack("C*", split(/\./, $file)));
0077nobodyさん04/04/09 00:33ID:PgKEk2Oq
http::liteで、対象のページの一部分だけ取り出す方法はありますか?
例えば、1MぐらいあるHTMLファイルの<title>だけを知りたいので、先頭1000バイトだけ取るとか。
0078nobodyさん04/04/09 00:47ID:???
>>77
callback を使えばできるんじゃないかという気はするが、試してない
0079nobodyさん04/04/09 01:07ID:6udLpUMW
cgi-lib.plを使用して、HTMLのフォームから送信したテキストを新たなHTMLページに表示
させるコードが上手く動きません。(perl ver 5.8.0 cgi-lib.pl ver 1.14)

require 'cgi-lib.pl';

&ReadParse;
$namae=$in{'NAMAE'};

print "content-type: text/html\n\n";

print "<html>";
#print $namae;
print "test\n";
print "</html>";

としているのですが、HTMLフォームからテキストを送ると「ページを表示できません」が出てしまい
うまく実行されません。cgi-lib.plをコマンドラインから実行すると、間違いなく動いているのですが、
HTMLから上記CGIを実行すると うまくいきません。
 お分かりのかたいらっしゃるでしょうか
0080nobodyさん04/04/09 01:09ID:6udLpUMW
スミマセン ↑のコード間違いです

#!/usr/bin/perl
require 'cgi-lib.pl';
&ReadParse;
$namae=$in{'NAMAE'};

print "content-type: text/html\n\n";

print "<html>";
print $namae;
print "</html>";

というコードを書いたのですが、うまくいきません
0081nobodyさん04/04/09 01:21ID:ruDZ3+hJ
>>80
そのスクリプトのファイル名が myscript.cgi だとして

#!/usr/bin/perl
eval {
  require 'myscript.cgi'; # あなたのスクリプトを読み込む
};
if ($@) {
  print "Content-type: text/plain\n\n$@";
}

というスクリプトを実行するとどうなります?
詳しいエラーを見る事ができるはずなんだけど。
0082nobodyさん04/04/09 01:21ID:???
>>80
まずWWWサーバのエラーログを調べる

もしエラーログが調べられないときは、そうだな、
とりあえず改行コードでも疑ってみたらどうだ?
0083nobodyさん04/04/09 01:25ID:???
あと疑うべきは #!/usr/bin/perl の部分とか。
0084nobodyさん04/04/09 01:25ID:???
>>80
じゃあHTMLが間違ってるんだろ
0085nobodyさん04/04/09 01:36ID:???
>>77
http::liteはシランが、headerでrange:を送れば鯖が一部だけ送ってくれる。
0086nobodyさん04/04/09 01:58ID:6udLpUMW
>>81
ありがとうございます。下記のような表示が出たのですがさっぱりです(ちなみにcgiファイル名は「my.pl」

Can't locate my.pl in @INC (@INC contains: /usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/lib/perl5/5.8.
0 /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_pe
rl /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/ve
ndor_perl .) at /var/www/cgi-bin/test.pl line 3.

>>84
HTMLは間違っていないと思います
ちなみに下記
<html>
<meta http-equiv="Content-Type" content="text/html;charset=euc">
<body>
<form method="post" action="../cgi-bin/3-3-1.pl">
名前<input type="text" name="NAMAE"><p>
<input type="submit">
</form>
</body>
</html>

HTMLの文字をperlで変数に格納し、それをHTMLで表示させるだけなのですが
>>83さんもおっしゃるように perlのパスも本体CGIやcgi-lib.pl内のパスも確認したのですが
間違っていないと思うのですが、どうしてうまくいかないものでしょう
0087nobodyさん04/04/09 01:59ID:6udLpUMW
↑のHTML間違ってました(たびたびでスミマセン)

<html>
<meta http-equiv="Content-Type" content="text/html;charset=euc">
<body>
<form method="post" action="../cgi-bin/my.pl">
名前<input type="text" name="NAMAE"><p>
<input type="submit">
</form>
</body>
</html>
0088nobodyさん04/04/09 02:08ID:???
test.pl の 3行目にある my.pl なんて見つかりませんよと言われているが?
00897904/04/09 02:24ID:6udLpUMW
>>88
うーん おかしいなぁ 確かに指定したはずなのですが

CGIを実行したときのログをみてみたらこんな感じで書いてあった
Argument "NAMAE=ffffff" isn't numeric in subroutine
entry at /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/ModPerl/RegistryCooker.pm line 160.!

もう少し調べてみることにします ありがとうございました

0090nobodyさん04/04/09 04:37ID:+yDvGh6O
既にヘッダーが送信されているか判断する方法ってありますか?
エラー表示する時に、ヘッダー(content-type)が2重になってしまう場合があるので…。
ヘッダー出力すると同時に、定数か何かでフラグ立てておけば良いんでしょうか?
0091nobodyさん04/04/09 04:39ID:???
ヘッダーなんてただ標準出力に文字を垂れ流してるだから、判別は無理と思われ。
普通にフラグで判断しましょう。
0092nobodyさん04/04/09 04:42ID:???
>>91
素早い返答ありが�d
フラグ立てることにします。
0093nobodyさん04/04/09 08:40ID:qDAc9oFc
質問します

やりたいこと:
掲示板の投稿済み投稿内容編集フォームで
改行を<BR>に変換して保存した本文を
<BR>を改行コードになおして
テキストエリアに投稿済みの本文を表示する

こんな風にやってみた:
1.$text =~ s/<BR>/\x0D\x0A/g;
<textarea cols=60 rows=3 name=text value=$text></textarea>
2.$text =~ s/<BR>/\n/g;
<textarea cols=60 rows=3 name=text value=$text></textarea>

両方ともだめでした。
$textの内容が空になります

よろしくお願いします。
0094nobodyさん04/04/09 08:56ID:???
x <textarea cols=60 rows=3 name=text value=$text></textarea>
o <textarea cols=60 rows=3 name=text>$text</textarea>
0095nobodyさん04/04/09 09:02ID:???
>>94
できました。
タグ間違いだったとは(:;´.(Θ).`;:)
0096nobodyさん04/04/09 16:05ID:???
やりたいこと :
csvの中身を表示したい。

こんな風に自分は書いた :

open(FILE, "test.csv");
$data = <FILE>;
close FILE;
($a,$b) = split (/,/,$data);
$i = 0;
while ($i < 5){
print "$a"
$i++;
};

結果。同じ列の文字が繰り返される。。
(whileを使わなかったらずっと表示されたので
今は食い抑えてる幹事になってます。)

基本的っぽいけどサパーリなのです。
宜しくお願い致します。。
00979604/04/09 16:30ID:???
できました。。すいません。
0098nobodyさん04/04/09 17:03ID:???
せめてどうやったらできたのかぐらい書いてよ。
0099nobodyさん04/04/09 17:19ID:???
open (FILE, 'test.csv');
while (<FILE>){($_,@_) = split /,/; print;}
close (FILE);
01007504/04/09 18:56ID:gUQPCoa8
75 :59 :04/04/08 22:31 ID:1altNbSl
>>64 IPアドレスが一行づつかれたファイルです。
192.168.0.1
192.168.0.10
192.168.0.100
みたなものです。


76 :nobodyさん :04/04/08 23:28 ID:???
>>75
$file = '192.50.218.168';
$num2 = unpack("B32", pack("C*", split(/\./, $file)));

↑ありがとうございました。変換できました。
変換後、改行がなくなりこのように↓変換したIP文字列がつながってしまいました。
これを32文字づつ、改行したいのですが、どのような構文?を使用すればいいのでしょうか。
とっかかりが分かりませんので、さわりだけ教えていただければ後は調べますので
よろしければ教えて下さい。

=======================================================
00001100100110110111010011110011000011001101001000110000111111100000110011100101
11010011010101110000110011100110000100010010011010000001000010110110100000000001
10000001000010110110111011011010100000010000101101110100000011011000000100001011
01110100100000101000000100001011011101000011100010000001000010110111010001001010
10000001000010110111011001111000100000010000101101110110111110001000000100001011
10001011000000011000000100001011000011100000000110000001000010111001000000000010
================================================
0101nobodyさん04/04/09 19:03ID:???
>>100
open (FILE, "ip.txt");
while(<FILE>) {
 $num2 = unpack("B32", pack("C*", split(/\./)));
 print "$num2\n";
}
close (FILE);
0102nobodyさん04/04/09 19:04ID:???
それくらい調べろやヴォケェ!
もうくんな発言スンナ
0103nobodyさん04/04/09 19:40ID:???
>while ($i < 5){
>print "$a"
>$i++;
>};
ワロタw
$aの中身入れてないなら同じのが出て当然だろw
0104nobodyさん04/04/09 20:01ID:???
>>103
そっとしておいてやれよ
0105nobodyさん04/04/09 21:54ID:???
$dellist = $query{'del'};

open(FILE, "./aborn.csv");
@list = <FILE>;
close(FILE);

@temp = ();
foreach $rr (@list){
if($rr eq $dellist){
print "$rrを削除しました<BR><BR>";
} else {
push(@temp, $rr);
print "$rrは削除せず<BR><BR>";
}
}

open(OUT, ">./aborn.csv");
print OUT @temp;
close(OUT);

以上のようなソースでプログラムを動かすと、
@listに$dellistと同じ文字列が含まれているのに、その文字列は削除されずに
else以下の「削除せず」をprintして、csvファイルからも削除されませんでした。
「eq」の部分が原因だと思うのですが、==では当然正常に動きませんし…
はて、どうしたものでしょうか。
0106nobodyさん04/04/09 22:14ID:???
>>105
http://tohoho.wakusei.ne.jp/wwwperl1.htm#CompStrOperand
http://tohoho.wakusei.ne.jp/wwwperl1.htm#MachingOperand
0107nobodyさん04/04/09 22:16ID:???
chomp じゃないのか
0108nobodyさん04/04/09 22:16ID:???
だな
010910504/04/09 22:26ID:???
Active Perlでローカルな環境で動かしたらリストからの削除ができなかったのですが、
今サーバーにアップロードして試してみると、リストからの削除が行えました。

変わりに、文字化けが起こるようになりましたが…

謎。


>>106-108
なるほど、eqにこだわらずneで組めばelse文がいらないというわけですか。
参考になります。
01107904/04/09 23:21ID:6udLpUMW
>>79ですが 自己解決しました
下記のようにコードを直したら無事cgi-lib.plが処理してくれました

(訂正前) &ReadParse;         (訂正後)&ReadParse(*in);

実はこのコード、本にのっていたやつなんですけど、本が間違ってたんですかね。
いろいろ調べた結果&ReadParseの後ろに(*in)を付けないと フォームから渡された
データが in に入らないんですね。 なんかやられたって感じです。

でもみなさんにいろいろ教わった結果、perlのエラーはapacheのログみれば分かることや
その他いろいろのことを知ることができました。アドバイスいただいたみなさん ありがとう
ございました
0111nobodyさん04/04/10 00:15ID:???
>>110
&ReadParse; だけでもできるが。
cgi-libが古いんじゃないか?
0112nobodyさん04/04/10 00:16ID:???
多分もの凄く基本なんだと思いますが質問させてください。
日本語の表示についてです。
WindowsXP、AN HTTPD、ActivePerl5.8です。
ソースの文字コードはeucです。


use Encode;
use encoding 'euc-jp';

my $x = "あ";
print $x;


これだと文字化けしてしまいます。
Encode::from_toやEncode::encodeなどで$x文字コードを変換しても上手くいきません。

一応ググッてはみたのですが、見つかったPerl5.8の解説ページはどれも中級者向けといいますか、
読者が5.6以前の文字コードの扱いやjcode.plの扱いを理解しているという前提で書かれたようなものばかりで、
今から5.8でPerlを勉強しようという入門者向けに日本語の扱いを解説したページを見つけられませんでした。
0113nobodyさん04/04/10 00:44ID:???
>>112
おまいさんの思ってる「文字化け」の定義を述べよ。
ブラウザ側でエンコードを euc-jp として指定してやれば普通に見えるんじゃないか?
0114nobodyさん04/04/10 01:04ID:???
>>112
windowsのコンソールに表示させてる?
ならeuc-jpじゃなくてsjisで書いてencode指定すれば
とりあえず正しく表示される。

こんなのもちゃんと通る。
use encoding 'sjis';
my $x = "ソースを表示";
print "$x(";
print length $x;
print "文字)\n";
$x =~ s/表/提/;
print $x;
0115nobodyさん04/04/10 01:05ID:???
>>112
ソースの文字コードがeucで、ブラウザにeucを出力するのに
わざわざモジュールを呼ぶ必要があるのかと。
0116nobodyさん04/04/10 01:31ID:???
>>112
その$xはUnicodeだよ?
011711204/04/10 02:22ID:???
ありがとうございます。なんとか表示することができるようになりました。
新しく覚えたことはまず拡張子plでwindowsのコンソールで試し、その後CGIにして動かす、というやり方で勉強していました。
今回は最初のコンソールの段階で上手くいかなかったので、その後のCGIでブラウザ表示するのをやっておりませんでした。
レスを見て、CGIでのブラウザ表示を試したところ、eucで表示が確認できました。

>>113
というわけで、そもそもブラウザでの表示を試していませんでした。

>>114
ご指摘の通り、コンソールで表示させておりました。
ソースをsjisにすることでコンソールでも表示できました。
sjisだと色々問題が発生するのでソースはeucが基本、と書いてあるHPを読んだのでeucにしておりました。

>>115>
Perl5.8だと内部ではUTF8でどうのこうの、というあたりでかなり頭が混乱しております。
なんとか「あ」が表示できたので、これをとっかかりに詳しく勉強していこうと思います。

>>116
そのへん、まだ混乱しています。is_utf8($x)だと真になるので、UTF8なのか。
でも結局無変換のままで上手くいったので、やっぱりeucなのか。
UTF8フラグの立ったeuc??
この辺がまだきちんと理解できてないので、近いうちにまた壁にぶつかる予感です。
0118nobodyさん04/04/10 20:34ID:H+y5o94i
Perlスクリプトでhttp-referrerの偽装は可能でしょうか?
リンク先に飛ぶときhttp-referrerに任意のURLをぶち込んで飛ぶということは可能でしょうか?
0119nobodyさん04/04/10 20:43ID:???
>>118
できます。
ぐぐればサンプルはいくらでも見つかります。
0120nobodyさん04/04/10 20:44ID:???
CGIスレへどうぞ。
012111804/04/10 20:53ID:H+y5o94i
>>119-120
レスありがとうございます。
CGIスレ見てみましたが、出来ないっぽいですね?
0122nobodyさん04/04/10 21:06ID:???
リファラはクライアントが勝手に吐くからね。
サーバーからはどうにもならんでしょう。
2chみたいにワンクッションさせてみるとか?
0123nobodyさん04/04/10 21:51ID:???
>>118
プロキシかブラウザを作るしかないでしょ。
0124nobodyさん04/04/10 22:07ID:zPwA0QL/
とりあえず use strict; しとけっていうのを見たんでやってみたんですが、
下のスクリプトが上手く動かないんです

use strict;
{
package Config;
$host = "www.example.com";
}
package main;
print "host = $Config::host\n";

use strictしているときは、$Config::host = "www.example.com"; って書かないといけないみたいですが
これじゃあ、package Configの意味がないですよね?
package Config; のあとに no strict; っていうのを入れないといけないんですか?

どうしたらいいんだろう・・・おしえて。
012511804/04/10 22:07ID:???
>>122-123
やっぱそれしかないですね。
0126nobodyさん04/04/10 22:22ID:???
$e1=int(rand(6));
$e2=int(rand(6));
while($e2==$e1){
$e2=int(rand(6));
}
$enemy3=int(rand(6));
while($e3==$e1 or $e3==$e2){
$enemy3=int(rand(6));
}
1〜6から、ランダムで3つの数字を重複なしで、
取り出すプログラムなんですけど、
しょぼいですよね・・・
なにか華麗な方法知ってる方いれば、教えて下さい。

0127nobodyさん04/04/10 22:24ID:???
みすった><
$e1=int(rand(6));
$e2=int(rand(6));
while($e2==$e1){
$e2=int(rand(6));
}
$e3=int(rand(6));
while($e3==$e1 or $e3==$e2){
$e3=int(rand(6));
}
0128nobodyさん04/04/10 22:34ID:???
>>124
プラグマの影響範囲を誤解している。
http://perldoc.com/perl5.8.0/pod/perlmodlib.html

>>126
1..6 をランダムな順序で持つ配列から 3 つ取り出す。
http://www.din.or.jp/~ohzaki/perl.htm#ArrayRandom
0129nobodyさん04/04/10 23:02ID:???
>>124
use strictの意味も分からずuse strictしても意味無いですよね?

perl5.6.0未満のバージョンなら
{
package Config;
use vars qw($host);
$host = "www...";
}
perl5.6.0以上のバージョンなら
{
package Config;
our $host = "www...";
}
# ...
print $Config::host;
0130nobodyさん04/04/11 00:07ID:???
>>126
何スレか前に同じ質問があった。
そのときは確か、List::Utilが使えれば一番早くて楽だっていう
結論だった気がする。

use List::Util qw(shuffle);
($enemy1,$enemy2,$enemy3) = shuffle 1..6; #@enemy[0..2] の方がいいと思う。
0131nobodyさん04/04/11 00:12ID:???
>>130
これやね。
ttp://boobar.hp.infoseek.co.jp/bench/randlist.txt
■ このスレッドは過去ログ倉庫に格納されています