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

Perlコーディング初心者質問スレ Part 54

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/02/10(土) 19:21:23ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >>2-10

前スレ http://pc10.2ch.net/test/read.cgi/php/1164519503/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
05865832007/04/08(日) 12:42:51ID:???
index関数にこだわりすぎてました。
$xx =~ /^$yy$/ でいけました。お手数かけました、ごめんなさい。
0587nobodyさん2007/04/08(日) 12:58:04ID:???
fooとかzooとかも付かず、本当に数だけが並んだファイルだったらしい。
だがな、それなら eq で比較するだけでもよさそうだな。
0588nobodyさん2007/04/10(火) 04:15:40ID:???
使ってる人がいるんだかどーだかわかんないけど、>>1の
> 過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
これ見ようとするとリダイレクトされて過去ログ閲覧不可なのね。

> 現在、mirrorhenkan/perl/ はFREESPACE利用規約の禁止事項に
> 抵触しているためアクセスを制限しております。
0589nobodyさん2007/04/11(水) 01:18:30ID:???
#�@配列に代入
open(IN, $file);  
@list = <IN>;
------------------------------------
#�Awhileで一行ずつ読み込んで処理
open(IN, $dfile);
while ( $line = <IN >) {
    #$lineを区切り文字を分割して、何か処理
}

何十Mというサイズの大きいCSVファイルを扱うときが前提です。
�@だと配列に格納するみたいですが、メモリの消費は大変でしょうか?
�Aのほうがよいでしょうか?
0590nobodyさん2007/04/11(水) 01:35:16ID:???
>>589
(1)の方はCSVが1GBならメモリも1GB以上使うわけだが、(2)は
CSVのサイズが1MBでも10GBでも変わらない。
ってことはわかってるわけだな。

答えわかってんじゃん。
しかし、割り切って(1)の方法を使う場合もあるよ。
書き捨て的なスクリプトとかだと。
っちゅうか、丸数字やめね?
0591nobodyさん2007/04/11(水) 03:38:11ID:???
>>590
パソコンの仕組みとperlの勉強を、はじめたばかりで、
メモリの動きとか、あまり考えたこと無かったので、
ちょっと自信がありませんでした。^^;
どうもありがとうございました。
0592nobodyさん2007/04/11(水) 04:20:00ID:???
> (1)の方はCSVが1GBならメモリも1GB以上使うわけだが、

そんなコンパクトに収まるかよw
0593nobodyさん2007/04/11(水) 10:31:55ID:???
今更ながらどうもコマンドラインがよく飲み込めてないかもしれないので、
少しお尋ねします。
例えば
perl -pi.bak -e "tr/A-Z/a-z/"*.html
とか便利ですよね?
これを.plとして使いたいのですが無理なのでしょうか?
コマンドラインから打ち込むしか手がないのでしょうか?
0594nobodyさん2007/04/11(水) 10:41:24ID:???
http://pc11.2ch.net/test/read.cgi/php/1171102883/593
http://pc11.2ch.net/test/read.cgi/tech/1173880452/235
0595nobodyさん2007/04/11(水) 10:41:25ID:???
マルチポストやめれ
0596nobodyさん2007/04/11(水) 10:45:21ID:???
すみません。最初にかきこんだとこはふさわしくないかもと思って
こちらに変えました。
申し訳ない。
0597nobodyさん2007/04/13(金) 14:21:28ID:ZxZihQHU
%ENV のように、どのpackage内からでも呼び出せる変数を作るのはどのようにしたらよいのでしょうか?
0598nobodyさん2007/04/13(金) 14:45:10ID:???
%{^_HOGE}のように名前を^_ではじめる。

詳しくはperlvar(1)の

Technical Note on the Syntax of Variable Names

を読め。
0599nobodyさん2007/04/13(金) 16:11:59ID:???
>>598
美しくないので却下します
もう少しマトモな回答しなさい
0600nobodyさん2007/04/13(金) 17:45:43ID:???
ちょ、教えてもらってるのに却下って・・・

$::HOGE = 1;とかもだめ?
後はこんなの書いといてプログラムの頭でuseするとか
package Global;
use strict;
use warnings;
use base qw(Exporter);
our @EXPORT = qw($BAKA $AHO $SHINE);
our $BAKA = 1;
our $AHO = 'a';
our $SHINE = 'A';

push(@UNIVARSAL::ISA,__PACKAGE__);

package TEST1;
use strict;
use warnings;
printf "%s::BAKA=%s\n",__PACKAGE__,$BAKA++;
printf "%s::AHO=%s\n",__PACKAGE__,$AHO++;
printf "%s::SHINE=%s\n",__PACKAGE__,$SHINE++;

package TEST2;
use strict;
use warnings;
printf "%s::BAKA=%s\n",__PACKAGE__,$BAKA++;
printf "%s::AHO=%s\n",__PACKAGE__,$AHO++;
printf "%s::SHINE=%s\n",__PACKAGE__,$SHINE++;
0601nobodyさん2007/04/13(金) 18:12:42ID:???
何をやりたいのか知らないけど、モジュール使って名前空間わけて必要に応じて
importするのが普通の方法なので、あまり変なことをせず従っておいたほうが
なにかといいと思われ。
06025972007/04/13(金) 20:19:19ID:ZxZihQHU
>>598, >>600, >> 601
ありがとうございます。試してみます。

何に使うってわけじゃなくて、そういうことが出来るのなら知りたいなと思いまして。有難う御座いました。

>>599
顔が見えないからってそういう言い方はしないほうがいいでしょうね。
0603nobodyさん2007/04/14(土) 04:03:04ID:???
掲示板やデータベースなどのスクリプトを作成しているんですが、
検索機能をつけて、検索語句を$wordとし、
$dataに一致するものがあれば、って形でやってます。

if($data =~ /\Q$word\E/){

すると、「[」で「ー」もヒットしてしまったりします。
これは「ー」に「[」のコードが含まれているからだと思うのですが、それを除外する方法はどうしたらよいでしょうか?
0604nobodyさん2007/04/14(土) 04:08:26ID:???
つ【utf8】
0605nobodyさん2007/04/14(土) 04:17:21ID:???
>>604
なるほどutf8という方式だとコードの重複がないんですね
検索語句と、検索対象をutf8に一旦エンコしてから、ってやり方にしてみます。
有難う御座いました。
0606nobodyさん2007/04/14(土) 05:37:58ID:???
jcode::convert(*data, 'euc');
みたいな感じに簡単にできると思ってましたが、複雑ですね。
一時的に対象の$変数をutfに変換して戻す簡単な方法は御座いませんでしょうか?
調べた限り、utfでスクリプトを書くことが前提の記事ばかり出てきてしまいます。
0607nobodyさん2007/04/14(土) 10:35:22ID:???
encode guess
0608nobodyさん2007/04/14(土) 11:07:17ID:???
ハッシュで自動的に補完されるのを防ぐにはどのようにするのでしょうか?

my %hash = ();
$hash{a}{b}{c}{d} = 'test';

↑の場合だと自動的に {b}{c}{d}の部分が無いのに自動的に作られてしまいます。こういうのを防ぎたいのですが・・
0609nobodyさん2007/04/14(土) 11:22:25ID:???
期待する動作をするものを作ってtieするとか。
既にありそうだけど。
0610nobodyさん2007/04/14(土) 12:46:48ID:???
>>606

http://pc11.2ch.net/test/read.cgi/tech/1173880452/10
0611nobodyさん2007/04/14(土) 12:50:45ID:???
>>606

http://pc11.2ch.net/test/read.cgi/tech/1173880452/10

utf8でスクリプト書くことがそんなに困るの?
今あるsjisやeucのスクリプトをエディタなどで変換するだけでしょ。
0612nobodyさん2007/04/15(日) 03:41:41ID:???
>>611
困るというか、モバイル機などでutf8がバケる機種があってそれに対する対策が自分はまだわかってないってだけです。
気分を害してしまったのならすみません。
0613nobodyさん2007/04/15(日) 03:57:25ID:???
utf-8が化ける機種なんかがまだあんのか?
0614nobodyさん2007/04/15(日) 09:33:34ID:???
俺は携帯サイトを作るとき、3G 端末以外は切り捨てて作る
古い機種つかってる人なんか無視
0615nobodyさん2007/04/15(日) 11:29:23ID:???
普通にutf8でスクリプト組んで
古い機種の携帯からのアクセス時だけJcode.pmか何かで
Shift_JISにエンコードすればいいだけの話じゃね?

if($ENV{HTTP_USER_AGENT} =~ /<適当に古い携帯の条件>/){
require Jcode;
$data = Jcode->new($data, 'utf8')->sjis;
print "Content-Type: text/html; charset=shift_jis\n\n";
print $data;
}else{
print "Content-Type: text/html; charset=utf-8\n\n";
print $data;
}

みたいに
0616nobodyさん2007/04/15(日) 14:24:51ID:???
>>612

611のリンク先をよく読んで。
utf-8を使うのは、あくまでもPerlスクリプトだけであって、
入出力はsjisだよ。
0617nobodyさん2007/04/16(月) 03:22:14ID:???
>>616
有難う御座います。勉強してみます。
0618nobodyさん2007/04/16(月) 08:23:29ID:???
横から質問なんだけと、漏れも前から疑問に思ってた。

「Perlスクリプトはsjisで、内部で扱うデータは
utf8というのはできない」という事で、FAなのかな?
0619nobodyさん2007/04/16(月) 11:00:24ID:???
そもそもPerlスクリプトをsjisではかかない。
Windows上であっても。
0620nobodyさん2007/04/16(月) 13:15:51ID:MjOOmdj6
行数が多く、サイズも大きなファイルの指定した箇所を読み込みたいのですが、
どのような方法がよいでしょうか?

指定方法は、
1.X行目からY行分
2.最終行(何行目かは分からない)から数えてX行目からY行分
の2通りです。

0621nobodyさん2007/04/16(月) 14:24:24ID:???
>>618
Perlで扱うマルチバイト文字は、内部的には「常に」utf8だよ。
use encoding を使えばsjis でスクリプトを書くこともできるが、
副作用があるから、よく理解した上で使わないといけない。

>>620
File::Tieを使うのが吉
0622nobodyさん2007/04/16(月) 14:48:25ID:???
>>621
Tie::Fileじゃなかったっけ?
06236202007/04/16(月) 17:55:42ID:???
>>621-622
Tie::File で幸せになれそうです。
ありがとう。
0624nobodyさん2007/04/16(月) 18:55:47ID:???
if(($x > -1 && $x < 1) && ($y > -1 && $y < 1)){

}

このような条件式をもっとスマーティーに書きたいのですが・・・
良きアイデアをお願いします!
0625nobodyさん2007/04/16(月) 19:12:41ID:???
if (abs $x < 1 and abs $y < 1) {
  &foo;
}
0626nobodyさん2007/04/16(月) 19:18:36ID:???
サンクスです!
なんか自分が情けなくなってきました・・
0627nobodyさん2007/04/16(月) 21:56:54ID:???
>>624
?
$xも$yも0だったら真としたいんじゃないの?
お前さんは >>625 で本当にいいの?
0628nobodyさん2007/04/16(月) 22:07:23ID:???
>>627
なるほど。
しかし、>>624が意図していることが実は>>625だったってことも考えられる。
0629nobodyさん2007/04/16(月) 22:28:33ID:???
>>627
OKです・・・絶対値すら忘れている自分に鬱もう詩嚢
0630nobodyさん2007/04/16(月) 22:29:15ID:???
メ欄に入れてさらに鬱
0631nobodyさん2007/04/16(月) 22:35:41ID:???
脱線するけど、もとのコードの
$x > -1 && $x < 1
は、個人的には直感的じゃないと思った。
こう書くんだとしても
-1 < $x && $x < 1
にしたほうが視覚的に分かりやすい。
0632nobodyさん2007/04/16(月) 23:05:14ID:???
-1 < $x < 1
とか書けたら一番幸せなんだけどな。

# ソースフィルタ使えばできるか?
0633nobodyさん2007/04/16(月) 23:17:54ID:???
Perlに限らず、よく言われる話だよな。
0634nobodyさん2007/04/16(月) 23:28:48ID:???
Pythonは -1 < x < 1 と書けるね。
0635nobodyさん2007/04/16(月) 23:51:39ID:???
Perl実行中のメモリ監視することって可能?
他のサービスも同時に動いていて、Perlが使用してるメモリだけを知りたい。
0636nobodyさん2007/04/17(火) 03:37:59ID:???
topとかじゃダメ?
0637nobodyさん2007/04/17(火) 06:11:09ID:nSKTWe9a
同一のメールアドレスを禁止するのを掲示板に適用させたいのですが、男性のログと女性のログがあり、どう設定していいか分かりません。男女のログファイルは階下のフォルダに入ってて、
男性 $mensfile
女性 $ladysfile とメインのCGIで設定されていす。

チャレンジしてみたら、過去のログファイルが全て消えてしまい散々な目に会いました。下のどちらかでできそうな・・宜しくお願い致します。

(1)# 二重登録のチェックをします
if(-e $data){
open(FILE, "< $data"); # この時点でファイルは必ず存在します
while(<FILE>){
@v = split(/\t/);
if(@v[0] eq $name){
print "<center><b>すでに$nameさんは登録されています</b><br>\n";
print "「戻る」を押して入力しなおしてください</center>\n";
exit(0);
}
}
close(FILE);
}

06386372007/04/17(火) 06:12:56ID:nSKTWe9a
(2)#----------2重登録チェック----------
&lock;
if(!open(IN,"$mail01"))
{print 'ファイルOPENができませんでした。',"\n"; exit;}
@dataline = <IN>;
close(IN);
unlink $lockfile;
foreach $DATA (@dataline) {
chomp $DATA;
if($DATA eq $MAIL){
print 'このメールアドレスは既に登録されています。',"\n";
exit;
}


宜しくお願い致します。
0639nobodyさん2007/04/17(火) 09:23:10ID:???
>>637-638
二重登録チェックの方法はひとまず置いといて、
ログファイルが消えちゃったってことは
書き込みの段階でしくじってるんじゃないの?

ありがちな例だと
 × open (FILE, '> file.txt'); # 上書き(つまり消える)
 ○ open (FILE, '>> file.txt'); # 追加書き込み
とか。
0640nobodyさん2007/04/17(火) 09:43:54ID:???
男女別のファイルがどうこう言ってる割にプログラムには欠片も反映されて
ないし、ここで回答もらえるレベルに達してない質問の典型だね。
「日本語でOK」「エスパー回答者さんよろしく」ということで。

質問する側にも最低のスキルは必要で、問題を理解してもらえないことには
どうにもならんよ。
0641nobodyさん2007/04/17(火) 10:34:42ID:???
>>624のが素朴な疑問なんだが、
$x===0 && $y===0 こんなん駄目?
0642nobodyさん2007/04/17(火) 10:35:21ID:???
改造スレ池
0643nobodyさん2007/04/17(火) 13:55:12ID:???
>>641
perlで同値演算子使えたっけ?
ってか、>>625の意図で正しいらしいから、
元々ダメだけど。
0644nobodyさん2007/04/17(火) 17:05:48ID:???
ひねくれモンには
! int $x and ! int $y
って手もある罠、、、
0645nobodyさん2007/04/17(火) 17:06:59ID:???
>>637 
キミみたいなのがスクリプト書くと、クロススクリプティングの餌食になるだけ。
何もしないのが吉。
0646nobodyさん2007/04/17(火) 17:13:38ID:???
スクリプティングがスクリプディングに見えた
0647nobodyさん2007/04/17(火) 21:26:07ID:???
>>644
イイ!
0648nobodyさん2007/04/17(火) 23:26:16ID:???
初心者ってどの程度のこと言うの?

何となくスレの雰囲気から察すると
『はじめてのPerl』マスターレベルは初心者じゃないよね、もう。

『続・はじめてのPerl』に至っては
題名だけ聞くと優しそうだけど、
マスターしたら、CPAN Authorくらいなれちゃうし。

俺的には、『はじめてのPerl』読みこなし中レベルだと解釈してるが、どうか?
0649nobodyさん2007/04/18(水) 00:03:35ID:???
「はじめてねperl」を理解できても、自分なりの書き方ができない奴は初心者
じゃないかな
0650nobodyさん2007/04/18(水) 00:12:31ID:???
クロススクリプティングってなに?
0651nobodyさん2007/04/18(水) 08:05:12ID:???
XSSのことじゃね?
0652nobodyさん2007/04/18(水) 10:28:13ID:???
IPv4アドレスを4バイト固定でファイルに保存したり、
ファイルから読み込むことは可能でしょうか?

pack('C4', 255, 255, 255, 255) とすると4バイト(FF FF FF FF)になるかと思ったんですが、
8バイト(C3 BF C3 BF C3 BF C3 BF)になってしまいます・・・
06536522007/04/18(水) 11:33:42ID:???
ファイルハンドルをbinmodeでバイナリモードにしたら解決しますた。orz
0654nobodyさん2007/04/18(水) 11:56:14ID:???
>>618
> 「Perlスクリプトはsjisで、内部で扱うデータは
> utf8というのはできない」という事で、FAなのかな?

リテラルの話であれば、Encode.pm で明示的に変換して使う分にはやりたい放題です。
Perl 5 の時点ではデフォルトで use bytes 状態なので、スクリプト内のリテラルが SJIS でも UTF-8 でも iso-8859-1 でも、perl にとってそれらは単なるオクテットシーケンスに過ぎません。
0655nobodyさん2007/04/20(金) 14:39:02ID:???
mod_perlオンリーの日本語書籍出してくれないかなぁ?
当たり前のようにmod_php前提のPHPに「Perl遅いし」とか言われても仕方ない。
0656nobodyさん2007/04/20(金) 15:21:01ID:???
mod_perlがApache標準Moduleになってさえくれれば・・・
0657nobodyさん2007/04/20(金) 15:30:53ID:???
> print "<center><b>すでに$nameさんは登録されています</b><br>\n";
> print "「戻る」を押して入力しなおしてください</center>\n";
にしてもきったねーHTMLだな
0658nobodyさん2007/04/20(金) 15:59:34ID:???
時代は ClearSilver だよな。うん。
0659nobodyさん2007/04/20(金) 17:22:02ID:???
lighttpdとApacheの橋渡しをしてくれるモジュールとかないんかね。
0660nobodyさん2007/04/20(金) 22:18:03ID:???
よく探してください><
0661nobodyさん2007/04/21(土) 05:09:19ID:???
> lighttpdとApacheの橋渡しをしてくれるモジュールとかないんかね。

なにそれ?w
0662nobodyさん2007/04/21(土) 09:34:59ID:???
リバースプロキシ立てれば?
0663nobodyさん2007/04/21(土) 13:00:06ID:???
エスパーの俺様はApacheのモジュールを、そのままlighttpdに
ロードできるようにするモジュールは無いか? という質問だとわかる。
0664nobodyさん2007/04/21(土) 18:05:32ID:TzVmcQvU
通常の関数のように
引数を省略すると$_が渡される
ようなサブルーチンを作る方法はある?
0665nobodyさん2007/04/21(土) 18:17:53ID:???
$_[0]
0666nobodyさん2007/04/21(土) 18:21:27ID:???
>>664
どんな引数が渡されたか見て、渡されてなかったら $_ を使えばいいのでは?
06676642007/04/21(土) 18:37:51ID:TzVmcQvU
>>665-666
うわ、言われてみれば単純な話ですね…
ありがとうございました
0668nobodyさん2007/04/23(月) 15:02:16ID:NvRgzOji
SSIで動くカウンターの中にprint "Location:…"を入れたのですが、
カウンターの箇所に「Location:…」も表示されてしまいます。
カウントした数字だけ表示して、指定したURLに遷移させる機能を保持するにはどうしたらいいですか?

何かトンチンカンなこと言ってたら指摘お願いします。
0669nobodyさん2007/04/23(月) 16:33:16ID:LAYu+KhN
出来るならワンタッチで、しかも「情報起業」に特化した
ホームページ作成ソフトがあったらいいのに・・・。

もし、プロ並みにキレイなホームページが作成が出来たとしたら、
情報商材で一旗あげようと思っているあなたの人生は変りますか?

【早くも成功者続出!】起業サイトビルダー
http://www.infotop.jp/click.php?aid=16484&iid=5683
0670nobodyさん2007/04/23(月) 17:00:46ID:???
>>668
どういうタイミングで遷移させたいのか。
表示したらすぐに遷移してしまったら、表示を見る暇がない。
クリックしたら、であれば、出力したカウント文字列なりイメージにaタグを張ればよいです。
0671nobodyさん2007/04/23(月) 18:06:45ID:???
>>670
すいません説明不足でした。

今作っているのは、
メールフォームに入力して送信ボタンを押すと、
送信完了ページにアクセスカウンタが表示されるというもので、
SSIを使ってそのページにカウントを表示させています。
0672nobodyさん2007/04/23(月) 18:14:15ID:???
>>671
使い方を間違えているような悪寒
0673nobodyさん2007/04/24(火) 14:35:35ID:???
>>671
送信完了ページにSSIのカウンタを表示させているのはわかったが、なぜカウントの出力と一緒に
Locationヘッダを出力しようと思ったのか、それを書いてくださいよ。
0674nobodyさん2007/04/25(水) 03:14:10ID:???
エスパー登場。

Location(も使い方間違ってるがw)じゃなく、
入力したフォームの値を隠し属性にして
同時にカウンタも仕込んだ別のページを表示させる。
0675nobodyさん2007/04/25(水) 04:08:26ID:???
別のエスパー。

・静的HTMLで作られた送信完了ページの冒頭に<meta>でrefreshでも入れとく。
・動的に吐かれる送信完了ページを吐く前の段階でカウント*だけ*して(表示要らない)
 送信完了ページを吐く代わりに Location: を吐いて希望のページに飛ばす。

期待してる動作はこんな感じなんじゃないのかな。
0676nobodyさん2007/04/25(水) 16:31:04ID:???
さらに別のエスパー只今 \( ̄^ ̄)/ 参上!!

送信完了ページはCGIが吐き出すタイプだね?
その中にSSIのカウンタを仕込もうとしてprint "Location:カウンターのスクリプト"とか書いたんじゃないの?
メールフォームのスクリプトにカウンターの機能を組み込んで送信完了ページに書き出せばいいじゃん。
SSIなんて必要ないよ。
0677nobodyさん2007/04/25(水) 18:21:45ID:???
すみません、質問させて頂きます。
やりたいことはフォームに入力されたデータをCGIで受け取り一括編集です。
<tr><td>NO</td><td>項目1</td><td>項目2</td></tr>
<tr><td><input type="hidden" name="no" value="1_g9gnt3">1_g9gnt3</td>
<td><input type="text" name="text1"></td><td><input type="text" name="text2"></td></tr>
<tr><td><input type="hidden" name="no" value="2_ghtt3d">2_ghtt3d</td>
<td><input type="text" name="text1"></td><td><input type="text" name="text2"></td></tr>
・
・
とログのデータと比例して続くフォームからデータを受け取り、
ログ形式 log.txt
------------------------
1_g9gnt3<>text1<>text2<>
2_ghtt3d<>text1<>text2<>
・
・
------------------------
と続くログとを照らし合わせてPOSTデータの「no」とログの先頭が一致する場合、
一致した行のtext1とtext2を書き換えたいと思っています。

一行ずる編集するスクリプトは書けましたが、
POSTで受け取った指定行を一括で同時編集するソースがわかりません。
お手数おかけしますが是非ご教授ください。
0678nobodyさん2007/04/25(水) 20:05:49ID:???
ループを使って1行ずつ編集したら?
0679nobodyさん2007/04/25(水) 23:47:47ID:???
>>678
たとえば、下記のようなデータが投げられたときのソースを教えていただければと思います。
mode=edit&no=1_g9gnt3&text1=hoge1&text2=huga1&no=2_ghtt3d&text1=hoge2&text2=huga2
こんな感じのデータが投げられたときどうやったらやりたいことができるのか、
全く持ってわかりません。。
06806782007/04/26(木) 00:06:04ID:???
パラメータを解析することは出来るみたいだし、何が問題なんだろう。

分解できないのか? 変数に格納できないのか? ループが分からないのか? 顔が濡れて力が出ないのか?
0681nobodyさん2007/04/26(木) 00:12:28ID:???
あまりに初歩的過ぎる上に、単なる教えて君にしか見えない。
さらにはスレ違いの予感さえする。
でもヒマなので、親切にしてやる。

(1) &で分割してから配列に格納。
(2) ループで配列内を、=で分割してからハッシュに格納。
あとは…分かるな。

普通は、CGI.pm使うのが一般的だろうな。
0682nobodyさん2007/04/26(木) 00:42:18ID:???
>>680
>>681
わざわざご親切にありがとうございます。

流れとしては
[&]で分割後配列へ格納→配列分ループ→ループ中に[=]で分割→noと一致する行があれば書き換え
という感じかと思い、色々ソースを書いてみましたが無限ループにはなるは、
配列分のループが上手く行かないとかぐっちゃになってしまって。。
(それで具体的なソースが欲しくなり、教えて君になってしまいました。。すみません。。)
ちょっと外出先にソース忘れてきちゃったので明日もう一度やってみます。
ハッシュとCGI.pmについて教えていただいたので調べてみます。
ありがとうございます。
0683nobodyさん2007/04/26(木) 01:27:54ID:???
>>682
方法論としては間違ってないので、単純ミスだろうな。
ソース晒せば一瞬で解決するような問題だと思う。
06846822007/04/26(木) 10:14:48ID:???
下記のようなソースを書いてみましたが上手く動きません。。
アドバイス、、よろしくお願いいたします。。

$formdata="mode=edit&no=1_g9gnt3&text1=hoge1"
. "&text2=huga1&no=2_ghtt3d&text1=hoge2&text2=huga2";

@pai = split(/&n/,$formdata);
open(IN,"$logfile") || print "error\n";
while($date = <IN>) {
$date =~ s/\x0D\x0A|\x0D|\x0A//;
my($no, $text1, $text2) = split(/<>/, $date);
for ($i=0;$i<@pai;$i++){
push @line, split(/&/,$pai[$i]);
($names, $values) = split(/=/,$line[$i]);
$p{$names} = $values;
if($no == $p{o}){
#書き込み処理
}
}
}
close(IN);
0685nobodyさん2007/04/26(木) 10:50:46ID:???
$logfileの中身とどういう風に動いて欲しいかの説明がないと
書いたとおりに動いてるだろと言われて終了だよ。

あとはエスパーさんよろしく。

なぜ/&n/でsplitするのかとか、あとでまたsplitするのはなぜかとか
$text1, $text2はどこへいったのかとか、@lineどんどん太るぞとか
いろいろつっこみどころはありそうだが。
0686682=6772007/04/26(木) 10:59:54ID:???
>>685
レスありがとうございます。
$logfile は下記です。
log.txt
------------------------
1_g9gnt3<>text1<>text2<>
2_ghtt3d<>text1<>text2<>
・
・
------------------------
やりたいことはログの一括編集です。
(掲示板なんかの編集機能などログファイルの一行だと思いますが
  それの複数行を一括で編集するような機能)
&nの理由は&だけで分割したらforループ時回数がわからなくなってしまうなぁ、、
というなんとなくでやってみました。ループ中にもう一回splitした理由は
=で分割しないといけないかなぁ、、という理由です。
@lineが太るということについてはわかりません、、すみません。。
■ このスレッドは過去ログ倉庫に格納されています