Perl 初心者コーナー Part24
■ このスレッドは過去ログ倉庫に格納されています
0001 ◆fBgbHI04bQ
03/06/07 22:30ID:GbQKLcPE【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0133nobodyさん
03/06/09 20:52ID:???$in{id} = 8;
$in{file1name} = "hoge.jpg";
$in{file1name} = "fuga.jpg"
rename($ImageDir.$in{file1name}, $ImageDir."photo1_id".$in{id}."jpg");
rename($ImageDir.$in{file2name}, $ImageDir."photo2_id".$in{id}."jpg");
とやっても、renameされません。
パス付きファイル名をrenameに渡してもダメなのでしょうか?
だとしたら、同じことを実現するにはどうすればいいのでしょうか?
0134nobodyさん
03/06/09 21:32ID:???・ フィアル名が正確かどうかprintで出力して確認
・ エラーがあれば、エラー内容を出力
エラー内容は$!に入ってるので、
rename $file1,$file2 or die "rename Error : $!"; で見てみればいい。
0136nobodyさん
03/06/10 02:08ID:0JHS1DHo半角カナとかの1バイト文字と、1バイト文字も含めた全ての文字列との比較させて、その結果によって処理を振り分けるスクリプトを作りたいんで。
ちょっと説明が難しいんですが、知ってる方いたら教えて下さい。
substrではダメなんです。
0137nobodyさん
03/06/10 03:04ID:???2バイトも一文字として認識してほしいって事?
そんな関数ないっぽいです。
モジュールなら、どこかにあるかも。
極論で言わせてもらえば、jperl使えって事になってくるかな。
0138nobodyさん
03/06/10 03:07ID:???0139nobodyさん
03/06/10 03:16ID:???たぶん極論・・・
って言うか、俺的に極論かな・・・?
日本語文字列で問題がおきてる。
↓
jperl使え。 終了。
これが、黄金パータンでしょ?(w
0140nobodyさん
03/06/10 07:44ID:???sjisじゃできんが(2バイト文字と1バイト文字が重複する)、eucならできる。
perlメモの「日本語を扱う」に書いてある。がいしゅつ
0141nobodyさん
03/06/10 09:10ID:???2:CGI::Sessionモジュールを試用してテスト中、
クライアントからセッションIDを取得できなかった場合のテストをやってみたら...
3:サーバにセッション情報を保持したファイルが残って、更新されることも消えることもなかった。
該当のセッションを使用してのアクセスがないので更新されないのはあたりまえなのですが、
もう使われることのないセッション情報を消す管理用メソッドとかないのでしょうか。
0142nobodyさん
03/06/10 14:45ID:H1NA4Acv"person" => "tanaka",
"adana" => "tanachan",
"adanaid" => 5,
};
$ORG[1] = {
"person" => "takada",
"adana" => "takachan",
"adanaid" => 2,
};
$ORG[2] = {
"person" => "imai",
"adana" => "imachan",
"adanaid" => 3,
};
@tmp = sort { (${ORG[$a]->{adanaid}} <=> ${ORG[$b]->{adanaid}}) } 0 .. $#ORG;
foreach (@tmp) {
print 'person='. $ORG[$_]->{person}. "\n";
print 'adana='. $ORG[$_]->{adana}. "\n";
print 'adanaid='. $ORG[$_]->{adanaid}. "\n";
}
はわかるのですが(以前こちらで教えていただいたのですが)
そうではなく、@ORGを、${ORG[?]->{adanaid}}でソートした結果を、
再び@ORGとして得るにはどうすればいいのでしょうか?
(ただし、一個一個person、adana、adanaid などとせずに。。。実際は項目が多いもので)
foreach my $key (keys %{$ORG[0]}){
\$ORG[0]->{$key}
}
↑この辺をどうにかするよな気がするのですが・・・
0143nobodyさん
03/06/10 15:16ID:???よくわかんないけど、こんな感じ?
@tmp = sort { (${ORG[$a]->{adanaid}} <=> ${ORG[$b]->{adanaid}}) } 0 .. $#ORG;
foreach (@tmp) { push(@temp,$ORG[$_]); }
foreach (@temp){
while(($i,$j) = each(%$_)){
print qq|$i = $j\n|;
}
}
0145nobodyさん
03/06/10 18:37ID:???XML::Parser::Liteで読めるようになったけど書き込めない・・・。
0146通行人さん@無名タレント
03/06/10 18:53ID:???foreach my $man(@ORG){
#print_man
foreach my $atti(keys %{ $man }){
print $atti, ' => ' ,$man->{ $atti }, "\n";
}
print "\n";
}
0148nobodyさん
03/06/10 20:13ID:???foreach my $person (@ORG) {
foreach my $attr (sort keys %$person) {
print $attr, ' => ', $person->{$attr}, "\n";
}
print "\n";
}
0149nobodyさん
03/06/10 23:10ID:???0150nobodyさん
03/06/10 23:15ID:???(∞ ) …出来ないんじゃないか?
| |
0152nobodyさん
03/06/11 01:07ID:b6wCYV2GsubInputPage {
print "Content-type: text/html; charset='Shift_JIS'\n\n";
$fname = $FORM{'name'};
print <<END;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><body>
<strong>$fname</strong>さん<br>
</body></html>
END
}
subResultPage {
print "Content-type: text/html; charset='Shift_JIS'\n\n";
print <<END;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head><title>名前入力</title></head>
<body>
<strong>$fname</strong>さん
</body></html>
END
}
↑ResultPage内の $fname が空になってしまうのですが、
InputPage内の $fname に格納したもの(これは表示される)を
ResultPageの中の $fname に受け継がれるようにするには
どうしたらいいのですか?
0153無料動画直リン
03/06/11 01:10ID:xrcrQEEf0154nobodyさん
03/06/11 01:19ID:???http://www.indigostar.com/perl2exe.htm
>>152
表示されるよ?
ちなみにsubの後にスペースが無いのは関係ないよね?
0156nobodyさん
03/06/11 01:34ID:b6wCYV2G>>154
subは関係ないです。
>>155
全くその通りです。
if($FORM{'mode'} eq 'enter') {
InputPage();
}
elsif($FORM{'mode'} eq 'result'){
ResultPage();
}
ってやってます。
どうやったら表示されるようになりますか?
0158nobodyさん
03/06/11 02:04ID:???0161nobodyさん
03/06/11 02:09ID:???0162152
03/06/11 02:10ID:b6wCYV2Gたびたびすいません、ネタじゃなくてまじわからんです。
$fname = '名無し';
if($FORM{'mode'} eq 'enter') {
InputPage();
}
elsif($FORM{'mode'} eq 'result'){
ResultPage();
}
これだと$fnameに「名無し」がはいちゃうし・・
0163nobodyさん
03/06/11 02:14ID:???myやlocalをつけなければグローバルになるはずだから、そのままでも受け継がれるはずだけど・・・
サブルーティンを呼び出す順番は正しい?
0164nobodyさん
03/06/11 02:15ID:???入っちゃいけないの?(´・ω・`)
そういう風に自分で設定してるんだよ(´・ω・`)マジデ マジデ
$fname = $FORM{'name'};
if($FORM{'mode'} eq 'enter') {
InputPage();
}
elsif($FORM{'mode'} eq 'result'){
ResultPage();
}
これじゃだめなの?(´・ω・`)
0165nobodyさん
03/06/11 02:18ID:???0166nobodyさん
03/06/11 02:22ID:???<strong>$FORM{'name'}</strong>さん<br>
0167nobodyさん
03/06/11 02:29ID:???InputPage()とResultPage()は一度に両方とも呼ばれることはないんでしょう?
0168152
03/06/11 02:42ID:b6wCYV2G感激しております。
if($FORM{'mode'} eq 'enter') {
InputPage();
}
elsif($FORM{'mode'} eq 'result'){
ResultPage();
}
else {
EntryPage();
}
exit;
EntryPage()のフォームで読み込んだものをInputPage()で表示し、
その後、InputPage()でボタンを押すと、ResultPage()に移って表示
って感じなんです。
やっぱり表示されないです・・・
何かうまい方法ないですかねぇ
0169nobodyさん
03/06/11 02:45ID:???0170152
03/06/11 02:59ID:b6wCYV2GInputPageは入力のページですよ。
名前を表示してその下に入力フォーム
0172nobodyさん
03/06/11 03:01ID:???0173_
03/06/11 03:03ID:???0174nobodyさん
03/06/11 03:04ID:???こんな初歩的なことで躓いてるようじゃ全部晒したほうが早いわ
0176152
03/06/11 03:10ID:b6wCYV2G試しましたよー
>>172
分ける必要は無いんだけど、その方がわかりやすいかなーと思って
やっぱり、ひとつのページにまとめる事にしました。
ご迷惑をおかけしました。
考えてくださった方々ありがとうございました。
0180nobodyさん
03/06/11 03:20ID:???そのままの意味。
perlccはPerlのソースをCのソースに変換するものだから、実行可能なものにするためにはCコンパイラが必要。
一連の処理をまとめてやってくれるから(実はPerlスクリプトやバッチファイルだったりする)Perlのソースを直接実行可能な形式にしているようにみえるけど。
Windowsの場合はVC++6.0ならOKだった。他のコンパイラは試していない。
0183nobodyさん
03/06/11 03:39ID:???>perlcc hello.pl
>a.exe
Hello World.
0184nobodyさん
03/06/11 06:42ID:u2aqyjyIすみません、一つ質問させてください。
HTMLファイル内のアンカータグで指定されているURLを全てエンコードして返すコードを書きましたが、どうも思う
ように動いてくれません。問題のコードは下記となっております。
-----------------------------------------------------
while(<FH>){
if($_ =~ /\<a.*?href.*?\=.*?\>/ig){
my $tmp = $_;
while($tmp =~ /(.*\<a.*?href.*?\=)(.*?)(\>.*?)(\<|\n)/ig){
my $tmp1 = $1; my $tmp3 = $3;
my $tmp2 = main::url_encode($2);#エンコードルーチン
$tmp2 =~ s/\%20//g; $tmp2 =~ s/\%22/\"/g;
$index_file .= $tmp1 . $tmp2 . $tmp3;
}
}
else{
$index_file .= $_;
}
}
-----------------------------------------------------
1行に2つ以上のアンカータグがあった場合を考えてwhileを使用しておりますが、その部分の正規表現に問題が
あるというところまでわかっていながら、全く前進せぬまま朝になってしまいました。情けないです。
ここの正規表現の区切りとなるものが曖昧なことから、うまく認識してくれず、整形後のHTMLファイルがおかしく
なってしまっているのだと思われます。
もし宜しければ、教えてください。
すみませんが宜しくお願いいたします。
0185nobodyさん
03/06/11 07:22ID:???正規表現道場@2ch Part2
http://pc2.2ch.net/test/read.cgi/php/1038146241/432-n
このへんでグダグダやっているようだが
0186nobodyさん
03/06/11 11:58ID:???}
と、
for ($i=0;i<=$#tmp;$i++){
}
って、何が違うのでしょうか?
0187nobodyさん
03/06/11 12:20ID:???前者は@tmpの中身を順番に参照する。
後者は0から$#tmpまで$iがカウントアップしていく。
前者は数字とは限らないが、後者は確実に数字。
0188nobodyさん
03/06/11 12:47ID:???したら、
glob failed (child exited with status 127) at index.cgi line 863.
といわれてしまったのですが、
どうすればいいのでしょう?
glob関数は使ってないはずなのですが・・・
0191nobodyさん
03/06/11 16:26ID:???スマートな方法はありませんか?
今はこんなやり方をしてるんですけど…
$_="0123aa456789";
m/([a-z]+)/;
$str = $1;
0193nobodyさん
03/06/11 16:40ID:Gw/QAyIn($str) = /([a-z]+)/;
0195_
03/06/11 17:19ID:???0196194
03/06/11 18:07ID:???0198nobodyさん
03/06/11 19:14ID:???処理系依存の関数ってけっこうあるし。
0199nobodyさん
03/06/11 20:11ID:fefOLsV8送れる(どっちを表示するかはメーラーがきめる)と聞いたのですが
sendmailにどういう風に渡したらいいんでしょうか?
Content-Type: multipart/alternative;を使うらしいとこまでは
わかったんですが…
(プログラムを動かそうとしているサーバには、モジュールは入れられないみたいです)
どなたか御存じの方がいらっしゃったら、よろしくおねがいします。
0201nobodyさん
03/06/11 20:16ID:???$a = "あ";
print $b;
このとき、当然ですが「いうえお」しか表示されません。
「あいうえお」と表示したい場合はどうすればいいですか?
$aを$bの前に持ってくるというのはナシで。置換しかないですかね?
0202YUIS
03/06/11 20:28ID:oL0No0ho↓↓↓
http://www.dvd-yuis.com/
0203nobodyさん
03/06/11 20:35ID:???print eval($b);
$aや$bにコマンドを入れられてたら、かなり危険な状態になるのであまりお勧めできない。
0204_
03/06/11 20:44ID:???0205nobodyさん
03/06/11 21:02ID:OIUswXrqprint eval($b);
↑何も表示されない。
print eval{$b};
↑「いうえお」しか表示されない。
アルェー?
0206nobodyさん
03/06/11 21:09ID:???すまん。
俺の記憶違いだった。
0207nobodyさん
03/06/11 21:25ID:???$a = "あ";
print eval($b);
0209_
03/06/11 21:35ID:???0210nobodyさん
03/06/11 21:38ID:???シングルクォートじゃなくても良いけど$bの内容が「""」とか「qq!!」と文字列リテラルとしてエバれるようになってりゃいい。
0211nobodyさん
03/06/11 23:03ID:???$b ='"(split(/<>/))[0]いうえお"';
print eval($b);
だと
いうえおと表示されます。
(split(/<>/))[0]にはある文字列がはいっています。
0212nobodyさん
03/06/11 23:26ID:???evalがどういう働きをするものか勉強しなおしてください。
あなたの期待している通りにならない事がわかります。
0213188
03/06/11 23:39ID:???ありがとうございます。なるほど。
ところで、こういう場合、考えられる原因ってなんでしょうか・・・?
いちお、「tmp*」のパーミッションは666にしてます。
0215nobodyさん
03/06/12 00:07ID:???フォームから
<input type="file"〜(以下略
と言う風に入力してもらいcgiでcgi-libを使用してデコード、とまでは
できたのですが、どのようにして拡張子を取得するべきか・・・
複数のファイルをアップロードする場合、どのようにして拡張子を取得するのでしょうか?
(今現在、プログラムが手元にないのであまり詳しく状況を書けなくて申し訳ありません。)
0218君のBodyはNobody
03/06/12 01:23ID:???Webでアンケートを作成し、その結果をCSVファイルにしました。
それをWindowsマシンにダウンロードして、Excelで開くと
日本語部分が文字化けをしてしまいます。
一応、SJISコードに変換してからCSVを作成しているのですが...
やり方として、根本的なことを分かっていないがために
何か間違っているような気がします。
恐れ入りますが対処方法を教えてください。
0219sage
03/06/12 01:30ID:SEaNTt27どのようにSJISに変換している?
0220nobodyさん
03/06/12 01:31ID:???0221nobodyさん
03/06/12 01:31ID:WFfieXIn0222nobodyさん
03/06/12 01:37ID:???0223君のBodyはNobody
03/06/12 01:38ID:???こういう説明で十分なのか不安なのですが
&jcode'convert(*form,'sjis');
というようなコードを使っています。
0224nobodyさん
03/06/12 01:57ID:???ちなみに俺は素人さんです。
・腹の立つほど複雑な処理を数日考えて作りました。
・記述の量はかなり多いです。
・強引に作ったので処理はめちゃめちゃで見れた物じゃないです。
・多分半年後の自分は、解読出来ません。
・さらに、メンテしにくくバグが出たら大変そうな仕組みです。
・ついでにデータファイル(txt)の書き換えもめんどくさそうです。
しかし!
上記のダメダメな処理が出来た直後に。。。
もっと効率が良くて、見やすくて、メンテしやすくて、スマートな処理を思いつきました。
・でも、ハッキリ言って書き換えるのめんどいです。
・データ(txt)も全部書き換えです。
・データの書き換えも含むと1日では出来なさそうです。
・しかも苦労して作ったダメの処理を破棄するのは抵抗があります。
普通はそんな時どうするんですか?
ダメな処理を強引に使いますか?
プログラムは苦労するものなのだと割り切って作り直しますか?
多分、処理は使い捨てではなく、ちょくちょく直しながらそれなりに使うと思います。
・そこら辺の常識を玄人さんに聞きたいです。
0225nobodyさん
03/06/12 01:58ID:???0226nobodyさん
03/06/12 02:03ID:???0227君のBodyはNobody
03/06/12 02:15ID:???ちなみに、Print文で空のファイルに書き込みをしています。
print FILE $data;
みたいにです。
0229nobodyさん
03/06/12 02:34ID:???良いと思う処理方法が見つかったなら、ソースは書き換えるべき。
データファイルは、Perlで新しいフォーマットに書き換えるスクリプトを作ればいい。
俺は、そうしてる。
いや、そうするべき。
0230nobodyさん
03/06/12 02:49ID:???スパッと気分を変えて書き直したいと思います。
って言うか、もう始めてます。
綺麗な記述&処理のほうが後々イライラせずにすみそうだし。。。
データはperlに直接埋め込む方式に変更したので書き換えスクリプトは作れなさそうです。
まったく変な構造を持ったデータでして…。
では、ありがとうございました。
0232nobodyさん
03/06/12 03:47ID:???作ったのかい?
ま、書きかえってのはそのうちやらないといけない時がくるわな。
■ このスレッドは過去ログ倉庫に格納されています