Perl 初心者コーナー Part21
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
03/03/18 18:47ID:Dujz7IUF【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は、【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0809nobodyさん
03/04/10 05:53ID:???>こうすると、キーを文字コード順で並び替え、
残念。そのままでは並び替えはされません。
文字コード順に並び替えるには、sort をつけるだけでok。
foreach $key (sort keys %hash) {
}
数字順にするには、sortに条件式を指定してやります。
foreach $key (sort { $a <=> $b } keys %hash) {
}
0810806
03/04/10 05:58ID:???そうですか・・・
そうやって配列に入れてる説明をしてるサイトがあったんで、
もしかしたら、無理なのかなぁと思いながらも質問してみました。
有難うございました
0811nobodyさん
03/04/10 06:00ID:???あぁごめんなさい
sort書いたつもりで、書いてないところコピペしてしまってました。
てか、えっ?
foreach $key (sort { $a <=> $b } keys %hash) {
}
これいけるんですか?確認してきます
0812nobodyさん
03/04/10 06:06ID:???有難うございました。
0813あぼーん
03/04/10 06:16ID:???http://muryou.gasuki.com/hankaku/hankaku03.html
http://muryou.gasuki.com/hankaku/hankaku04.html
http://muryou.gasuki.com/hankaku/hankaku02.html
http://muryou.gasuki.com/hankaku/hankaku01.html
http://muryou.gasuki.com/hankaku/hankaku10.html
http://muryou.gasuki.com/hankaku/hankaku09.html
http://muryou.gasuki.com/hankaku/hankaku08.html
http://muryou.gasuki.com/hankaku/hankaku07.html
http://muryou.gasuki.com/hankaku/hankaku05.html
http://muryou.gasuki.com/hankaku/hankaku06.html
0814佐々木健介
03/04/10 06:16ID:???/_ |
/. \ ̄ ̄ ̄ ̄|
/ / ― ― |
| / - - |
||| (5 > |
| | | ┏━┓| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | | ┃─┃| < こんなサイトを見つけた
|| | | | \ ┃ ┃/ \ 正直、スマンカッタ
| || | |  ̄ \_________
http://saitama.gasuki.com/kensuke/
0815かおりん祭り
03/04/10 06:16ID:???こんなのございま−す♪
 ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜oノハヽo〜
,.-''"¨ ̄●`' ‐(^▽^)
(,,●i,,,i,,,,,,,,i,,,,●),,)⊂ )
) ( || |
( ^▽^) (_(__)
~~~~~  ̄ ̄ ~~~~~ ~~~~~
0816nobodyさん
03/04/10 06:18ID:???0817nobodyさん
03/04/10 11:49ID:???${"data$form{name$no}"}{'age'}
これなんですが、
どうもエラーの原因は「$form{name$no}」これっぽい。
でも、ダブルクウォートの中にダブルクウォートなんて書けないし、どうしたら良いでしょうか?
0818nobodyさん
03/04/10 12:13ID:???> ${"data$form{name$no}"}{'age'}
${'data'. $form{'name'. $no}}{'age'}
とか。
でもそれ、基本的なところから見直したほうがいいのでは・・・。
0819nobodyさん
03/04/10 12:17ID:ofuMCP5lラジオたんぱのサイトからNEWS記事のリンクを取得するCGIなんですが、
突然出来なくなりました。
どこを修正していいか分かりません。
教えてください。
宜しくお願いします。
具体的には取得してきたhtml
と<!---------------------記事部分------------------->
を比較したいんですが…
文字コードが違うのかうまくいきません。
for( $i = 0 ; $i <= $#data ; $i ++ ){
$data[$i] = &PrintSjis($data[$i]);
if( $data[$i] eq &PrintSjis("<!---------------------記事部分------------------->")){
print $data[$i];
last;
}
}
----
宜しくお願いします。
0822鮮民
03/04/10 13:29ID:oo4Xo2Ys$data = {
01 => {
neme => 'name',
age => 'age',
},
};
$data->{$form{'no'}}->{'age'};
こんな感じにしてみたら?
0823817
03/04/10 13:31ID:???どうもです。変数名の中で演算子も使えるとは知りませんで…。
>でもそれ、基本的なところから見直したほうがいいのでは・・・。
出来るだけコンパクトになるよう考えてこれなんですよ…お恥ずかしい限り。
0825nobodyさん
03/04/10 13:50ID:5ksdsSWS<HEAD>内でcharset=iso-8859-1を指定して書かれた
HTMLのフォームから日本語で文章を打ち込んでメールを送信したいんですが
フォームでSUBMITしてCGI(Perl)でテキストエリアに入力された日本語を取得して
sendmailを開いてメールヘッダに
print SENDMAIL "Content-Type: text/plain; charset=iso-8859-1\n";
を指定して所定のアドレスにメールを送信したんですが
outlook expressで受信して開くと思いっきり文字化けしてる感じです。
とりあえずoutlookで見た時に日本語が表示されている必要があるんですが
HTMLのcharsetの方は事情により変更できないので
Perlの方でうまいぐあいに文字コードを変換(?)してメールするようにしたいんですが・・・
なにか方法とか参考になるサイトなどありましたらアドバイスよろしくです
0826nobodyさん
03/04/10 13:55ID:???テキストファイルに落とす等ちゃんとテストしてくれ。
んで、文字コードの件は、Jcode.pm か jcode.pl で。
あと charset に iso-8859-1 を指定したい理由が不明なのだが?
0827nobodyさん
03/04/10 14:05ID:5ksdsSWS一応、実際にメールを送信する前に
フォームに入力された文章の確認画面があるんですが
ここでは正常に日本語が表示されてるようです。
(吐き出されたHTMLのソースを見ると日本語が「???」などとなってる)
メールのヘッダに指定するcharsetは何を指定すればいいのか
分かんないのでHTMLの方とあわせただけです・・・
一応、メールの送信前にはPerl内で
&jcode'convert(*msg, 'jis');
などとはしているんですが、受信したoutlookの方では、そのまんま
日本語の部分が「???」などとなってしまう状態です・・・
jcodeでどんな変換が必要でメールのヘッダに
何のcharsetを指定すべきなんでしょうか・・
0828825
03/04/10 14:08ID:5ksdsSWS「???」の部分は
「&#12354;&#12354;&#12354;」てな感じです。
0829nobodyさん
03/04/10 14:11ID:???charset に何を指定良いか分からん奴が
メールを送信するプログラムを書く時代になったのか…。
すげーショックだ。
>>827
>フォームに入力された文章の確認画面があるんですが
アホ
>jcodeでどんな変換が必要でメールのヘッダに
単なる plain text だろうから、その変換で OK
>何のcharsetを指定すべきなんでしょうか・・
他のメールのヘッダを覗いてみなさい。
っつーか、少しは勉強してからそういうプログラム書いてください。
お願いします。この通りです。
0830鮮民
03/04/10 14:20ID:oo4Xo2Ysレファレンスを覚えてからは管理が楽になりましたよ。
1<>name<>age<>tel
2<>name<>age<>tel
@fields = qw(num name age tel);
while (<FILE>) {
$i = 0;
%hash = map {($fields->[$i++]) => $_ } split /<>/;
push(@lines,\%hash);
$lines{$hash{'num'}} = \%hash;
}
print "$_->{'num'} $_->{'age'}\n" for @lines;
print $lines->{'1'}->{'age'};
順番で表示したり、データをキーで指定できたりと何かと便利です。
初めは、わかりにくいと思いますが、頑張ってみてください。
リファレンスがわかれば、オブジェクト指向も出来るようになりますし。
0832鮮民
03/04/10 14:32ID:oo4Xo2Ys@fields = qw(num name age tel);
$fields = [qw(num name age tel)];
意味は無いけどレファレンス。
0833あぼーん
03/04/10 14:43ID:???0834825
03/04/10 14:49ID:5ksdsSWSメールのヘッダにてcharset=iso-2022-jpを
指定してみましたが、指定する前とまったく同じ結果でした…
フォームから受け取った文字が、すでに
&#12354;&#12354;&#12354;のような形ですので
これを&jcode'convert(*msg, 'jis');してメールヘッダでcharset=iso-2022-jpを
指定しても、そのまんま
&#12354;&#12354;&#12354;で表示される感じです。
でもIEのブラウザですとHTMLソース内の文字が
&#12354;&#12354;&#12354;となってても
画面ではちゃんと日本語に変換されて表示されてるようです。。。
outlookで開いて見る時のエンコードの設定もいろいろいじってみましたが
どの文字コードにしても&#12354;&#12354;&#12354;のまんまのようで・・・
0835nobodyさん
03/04/10 14:55ID:???0836nobodyさん
03/04/10 15:00ID:???0837nobodyさん
03/04/10 15:02ID:???単にそのまま sendmail に渡してるだけでしょ。
> そのまんま &#12354;&#12354;&#12354;
当たり前じゃん。
ちなみに「あああ」って書いたんでしょ?>>834
0838nobodyさん
03/04/10 15:35ID:???> <HEAD>内でcharset=iso-8859-1を指定して書かれた
> HTMLのフォームから日本語で文章を打ち込んでメールを送信したいんですが
ブラウザによってはページの文字コードを無視して送信するものもあるので、
こういったやりかたはあまり推奨されない。
きちんと文字コードを取得してから変換すべし。
0839825
03/04/10 15:37ID:5ksdsSWSはい、「あああ」です。
かいつまんで
http://rivernet.cool.ne.jp/upload/img/200304101536_test.lzh
にテストファイルあげてみました。
HTMLは変更せずにtest.cgiの中だけでなんたら変換して
メール送信してoutlookにて正常に日本語をよみたいんですが・・
0840825
03/04/10 15:39ID:5ksdsSWS[email protected]になってますので、ほんとにテストするときは変更お願いします
0841nobodyさん
03/04/10 16:00ID:???そこまで書いてなぜ正解を書いてあげないの〜?
>>834
>フォームから受け取った文字が、すでに
>&#12354;&#12354;&#12354;のような形ですので
HTMLの ?数字; 表記法を参照のこと。
これを正しい文字コードにそのまま変換できるモジュールあるのかな?
?数字;を抜き出して一文字ずつjisに変換するしかない?
0842841
03/04/10 16:01ID:???>>834
>フォームから受け取った文字が、すでに
>&#12354;&#12354;&#12354;のような形ですので
HTMLの &#数字; の表記法を参照のこと。
これを正しい文字コードにそのまま変換できるモジュールあるのかな?
&#数字;を抜き出して一文字ずつjisに変換するしかない?
0843nobodyさん
03/04/10 16:14ID:???837ですが、
1. 数値文字参照から charset=iso-2022-jp に適合するように変換する
効果的な方法を私も知らない
2. <FORM> のページが charset=iso-8859-1 という時点で
努力する方向が間違ってる気がする
3. 既にPerlの領域じゃない気がする
以上です。
0844841
03/04/10 16:29ID:???どうしてこうなるのか不思議に思ってたんだが、
フォームのページの問題を読み忘れていたようだ…。
というわけで>>825よ。
フォームのページのcharsetを日本語にしてみてくれ。
そもそもの問題はここにあると思われ。
0845nobodyさん
03/04/10 18:09ID:???ユーザーも規約が緩いサイトに流れるけど
多少規約が厳しくても(無論常識内)ファンが絶たないサイトみると
やっぱ実力なのかなぁ、、、とちょっと憧れる。
0846nobodyさん
03/04/10 18:11ID:???0847nobodyさん
03/04/10 18:46ID:???ハッシュだとややこしいことしないと、
いくつ入ってるかを知ることはできないのでしょうか?
0850nobodyさん
03/04/10 18:56ID:???0852nobodyさん
03/04/10 18:58ID:???ハッシュで$#これやってみたら、
期待してたとおりの動作が得られました。
いろんなサイトで探したんですけど、
見つからなかったんで質問させていただいたんですが・・・
それと、皆さん全然違うの書いてくださってますよねぇ?
$#使っちゃだめなんでしょうか?
0853849
03/04/10 18:59ID:???0854nobodyさん
03/04/10 19:00ID:???勘違いしてました
0855847,852,854
03/04/10 19:02ID:???>>849さんのでいけました。
ありが�dです
0856nobodyさん
03/04/10 19:25ID:???0857nobodyさん
03/04/11 03:32ID:Ngj0Yn4X質問させてください。
http://sabbath-jam.com/top/det/det_1.html
↑の掲示板使ってるんですが、改造して、新規投稿があったときに
自分のケイタイにお知らせメールが届くようにしたいんです。
もし可能なら、組み込むscriptを教えていただけないでしょうか?
0858nobodyさん
03/04/11 03:36ID:???(´-`).。oO(ここでもスレ違いとスルーされるだろうな・・・)
0859nobodyさん
03/04/11 03:41ID:Ngj0Yn4X(´-`).。oO(適切な場所に誘導してください。。)
0860nobodyさん
03/04/11 03:45ID:???http://pc2.2ch.net/test/read.cgi/php/1047806915/l50
0861nobodyさん
03/04/11 03:52ID:Ngj0Yn4X神!サンクスでつ
0862nobodyさん
03/04/11 04:03ID:e9H5z3qo何か良い方法ありますでしょうか。
0864nobodyさん
03/04/11 04:22ID:e9H5z3qo言い方悪くてごめんなさい。
私が描いているイメージは
$hash{key} = @array;
こんな感じです。
もしもできればご教授願いします。
0868nobodyさん
03/04/11 15:33ID:????????'??????????????????.????
???????! ??????????????????
0869nobodyさん
03/04/11 17:12ID:+804Cr9xmy $a = 'abcdef';#欲しいのは$a='cdef'。
substr($a, 0, 2);
print $a;
結果
'abcdef'
となってしまいます…
何か良い方法ありますか?
0870nobodyさん
03/04/11 17:18ID:???0871nobodyさん
03/04/11 17:20ID:???http://pc2.2ch.net/test/read.cgi/tech/1048519394/299
0872869
03/04/11 18:18ID:+804Cr9xすいません、勘違いするような書き方でしたね。
欲しいのは2バイト取り除いた後の残りの文字列なんです。
この場合はcdefが欲しいのですがabしか取れないんです…
0873nobodyさん
03/04/11 18:23ID:???向こうのスレで答えもらってるじゃん。
0874nobodyさん
03/04/11 18:27ID:???0875869
03/04/11 18:39ID:+804Cr9xようですね。
どうもスイマセンでした。
0876nobodyさん
03/04/11 18:47ID:???0877869
03/04/11 19:29ID:+804Cr9xいえ、「こちらに行きます」と明記しなかった私が悪いです。
本当に申し訳なかったです。
0878nobodyさん
03/04/11 19:48ID:???向こうで言われた事をそのまま書くだけか?
自分で考える脳は?
そんな考え方しかできないから、適切なスレに誘導してくれた人に対して
お礼も言えないんだよ。
0879nobodyさん
03/04/11 20:17ID:???ほっとけよ、生理が伝染るぞ
0880869
03/04/11 20:36ID:+804Cr9xなんか会社で怒られてるような気分になりました。
よくこんな感じで怒られるんですよ。
自分はトロいのでやれと言われたことしか中々できないの
ですがもっと自分の頭で考えられるように頑張ります。
本当にすいませんでした。
そしてありがとうございました。
0881nobodyさん
03/04/11 20:42ID:nKHFlgQT独り言ヤメレ
0882nobodyさん
03/04/11 21:29ID:???醜いアヒルの子でも見れ
0883nobodyさん
03/04/11 21:33ID:???がんすけも分かっているはず。
0885訂正(鬱だ
03/04/11 21:34ID:???○ガァ助
0886nobodyさん
03/04/11 22:51ID:???○ 板自体を間違えました
0888nobodyさん
03/04/12 01:59ID:Wz2xojvl読み書き両用でファイルを開く時、
open (DATA,"+<./data.dat");
open (DATA,"+>./data.dat");
この両者にはどういう違いがあるのでしょうか。
自分でやってみたところ前者は「>>(末尾に追加)」で、後者は「>(読み込んだ時点でファイルが空に)」と同じようでした。
「読み書き両用」の正しい使い方を教えて欲しいです。
0889nobodyさん
03/04/12 02:13ID:???0890nobodyさん
03/04/12 02:20ID:???読み込みと書きこみを1回のopenでしたいときに使う。
例えば掲示板の削除処理を俺はこう書く
open LOG, "+<", "./bbs.log" or die;
flock LOG, LOCK_EX;
while (defined(my $article = <LOG>)) {
chomp $article;
my($no, $name, $body) = split /\t/, $article;
$no == $delno or push @newlog, $article . "\n";
}
truncate LOG, 0;
seek LOG, 0, 0;
print LOG @newlog;
close LOG;
0891nobodyさん
03/04/12 03:02ID:???while (defined(my $article = <LOG>)) {
next if $article =~ /^\Q$delno\E\t/;
push @newlog, $article;
}
0892nobodyさん
03/04/12 03:29ID:???0893nobodyさん
03/04/12 03:37ID:???があったので質問させてください。
for($w=0;$w<10;$w++){
$f=&k($w);
print"$f\n";
}
sub k{
local($d)=@_;
my($w);
$w=$d*$d;
return($w);
}
というものがあるのですが、2行目の$wには1行目のfor()で決定される数字が
入るのでしょうか?それともreturnでの返り値が入るのでしょうか?
もし前者の場合は返り値はどこにはいるのでしょうか?&k($w)自体に入るのでし
ょうか?
もしも後者の場合は関数kには式だけあって数字がなくなってしまう気がしますが
どこから数字をもってきているのでしょうか?
きっとすごい簡単なことなんでしょうけど、教えていただければ幸いです。
よろしくおねがいします。
0895251
03/04/12 03:45ID:???for($w=0;$w<10;$w++){
$f=&k($w);
print"$f\n";
}
sub k{
local($d)=@_;
my($w2);
$w2=$d*$d;
return($w2);
}
こうすれば理解しやすいかな?
2行目の $wにはforループの$wがはいって、$fにはsub kのreturnが入ります。
おまけで、ソース的にもあやしいんで書きなおし
for($w=0;$w<10;$w++){
$f=&k($w);
print"$f\n";
}
sub k{
my $d =$_[0];
my $w2 = $d*$d;
return($w2);
}
ソースとしては 多分local($d)=@_; じゃなくて local($d)=$_[0];だとおもう
my $d =$_[0]; にしたのはlocalである必要が無い為・・・
0896nobodyさん
03/04/12 03:48ID:???それはsub kの$wはプライベート変数になっているからですよね?
8行目の$w=$d*$d;で2乗していますけど、そこの$dに入る数字は
どこから持ってきているのでしょうか?
よろしければ教えてください。
おねがいします。
0898nobodyさん
03/04/12 05:49ID:???まず
my($d) = @_;
受け側も右側もリストコンテクストだから、
右側の配列の要素0が左がわの最初の変数に入る。例えば
my($d1,$d2) = @_;
だったら
my($d1, $d2) = ($_[0], $_[1]);
と同じ。次に
my $d = @_;
受け側がスカラーコンテクスト、右がリストコンテクストだから、
my $d = scalar(@_);
と同等になる。よって、$dには@_に何個要素が入っているか、その数が
入る。最後に
my $d = $_[0];
受け側も右側もスカラーコンテクストだから、そのまま$dに@_の最初の
要素が入る。
というわけでlocal($d) = @_;というのは文法的には誤りはない。
local()の使い方としては多分間違ってるけど。(my()が正解)
0900nobodyさん
03/04/12 06:05ID:???0901888
03/04/12 10:35ID:???ありがとうございました。
「読み込みと書きこみを1回のopenでしたい」とまさにその通りでした。
truncate関数なんてものがあったんですね。勉強になりました。
おかげさまで無事解決。
0902nobodyさん
03/04/12 11:56ID:9LVB7yXuを
$article while (defined(my $article = <LOG>));
にしている意味は何のためですか?
0905nobodyさん
03/04/12 17:18ID:???0906nobodyさん
03/04/12 17:55ID:???#!/usr/local/bin/perl
my $test = '表示成功';
&test();
exit;
sub test {
print "Content-type: text/html\n\n";
print "$test";
}
__END__
このスクリプトを実行すると、出力が「表示成功」になります。
何故my宣言したのにこのような事が出来るのでしょうか?
0907nobodyさん
03/04/12 18:12ID:???> 何故my宣言したのにこのような事が出来るのでしょうか?
あなたが自宅の部屋に立てたテントの中も
「あなたの自宅の中」だからです。
0908はしのえみ好きー
03/04/12 18:15ID:???## ↓ここから package main;
my $test = '表示成功'; # パッケージに属する変数(my $main::testと等価
&test();
exit;
sub test {
print "Content-type: text/html\n\n";
print "$test"; # ブロック内に$testがないので、$main::testを探す
}
__END__
## ↑ここまで package main;
レス数が900を超えています。1000を超えると表示できなくなるよ。