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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/11/27 11:35:03ID:DJwiGeFM
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0593nobodyさん05/01/05 15:36:47ID:???
質問です。文章中において
>|     <strong>
文章 → 文章
|<     </strong>
みたいな事をしたいのですが、どうしたらよいでしょうか。


自分で考えたのは
$mes =~ s/(>\|)((\n*.*)*)(\|<)/<strong>$2<\/strong>/g;
この場合
>|あああ|< → <strong>あああ|<
>|いいい|<    >|いいい</strong>
となるので
$mes =~ s/(>\|)((\n*[^(<\|)]*)*)(\|<)/<strong>$2<\/strong>/g;
としたのですが、これだと >| |< の中にlやtがあっても駄目です。
0594nobodyさん05/01/05 18:04:47ID:???
>>593
正規表現の部分にちょっと無駄な部分があるような希ガス

$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;

(Perl5以上で)これでいいんじゃないかな。

解説
・ >| と |< を括弧でくくる理由がわからない。
・繰り返し記号の後に ? を使ったら、最短でマッチする。
・オプション s を使うと、 . (←半角ドットね^^;)も改行文字にマッチするようになる。
0595nobodyさん05/01/05 18:07:50ID:???
594です
ごめん、ちょっと電波が
$mes =~ s/>\|/<strong>/g;
$mes =~ s/\|</<\/strong>/g;
じゃだめなの?
0596nobodyさん05/01/05 18:39:11ID:???
それだと

>|
ちりぬるを
|<
いろはにほへと|<

とかなっていた時に困った事になるんです。
なので、「>|を発見したら、以降に|<があればそれぞれを置換し、これを最後まで繰り返す」ような事を
したい訳なのですが、いい案が思いつかないんですよね・・・。
0597nobodyさん05/01/05 18:43:18ID:???
>・ >| と |< を括弧でくくる理由がわからない。
「>|」とかっていうのは記号の例えでして、掲示板でタグを使えない代わりに
そういう記号でマークアップさせようという意図からです。・・・が正直厳しいです。

>・繰り返し記号の後に ? を使ったら、最短でマッチする。
>・オプション s を使うと、 . (←半角ドットね^^;)も改行文字にマッチするようになる。
勉強になりました!ありがとうございます。
0598nobodyさん05/01/05 19:11:13ID:???
じゃあ
$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;
ってやってしまおう。

括弧でくくる、ってのは
(>\|)
これね。グルーピング、説明不足ですまん
0599nobodyさん05/01/05 21:09:19ID:fN7gQymP
print "@$row[0]";  を実行した結果が、
あいうえおかきく

print "@$row[0]\n";  を実行した結果が、
あいう
えおか
きく

となる配列の要素を、
「あいう」、「えおか」、「きく」
それぞれ別の変数(もしくは配列)に入れる方法を教えてください。

print "$a, $b, $c";  を実行すると、
あいう, えおか, きく
(↑例えばこのように出力したい)

chomp、 split(/\n/, @$row[0]) では不可でした。
0600nobodyさん05/01/05 21:40:56ID:???
>>599
print "@a"; を print "@a\n";にかえただけで改行が
少なくとも2箇所増えるような@aはオレには思いつかない。
0601nobodyさん05/01/05 22:30:59ID:DtV5vUlC
use utf8; で作っているのですが、
DBに格納してあるutf8の文字列を取得するとき、その都度 utf8::decode($str)
としてUTF8フラグを付けているのですが、自動的にUTF8フラグが付くようにする
にはどのようにしたらよいのでしょうか?
060259305/01/05 23:36:16ID:???
>598
ありがとうございます。
$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;
にしたら動くには動いたのですが
>|         <strong>
>|ああああ|<→ >|ああああ</strong>
|<         |<
となってしまいました・・・結果を見れば多少納得しつつも改善策が思いつかないです・・・。
Wiki的記法スクリプト作ってる人って凄い・・・orz
0603nobodyさん05/01/05 23:40:02ID:???
ぁ、ためしに
$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;
を2行連続して書く事で602の現象は回避できました・・・が、
これだと激しく手順がおかしい・・・(;´Д`)
0604nobodyさん05/01/05 23:40:55ID:???
じゃあWikiのソース参考にすれば?
文章の整形や修飾に関しては全然難しい事やってないよ。
0605nobodyさん05/01/05 23:49:42ID:???
>>599
その質問の真意はよくわからんけど、
馬鹿正直に答えるとまずprint関数の定義をいじらんとダメかな。
perlはめちゃくちゃな言語なんでいじる手段は複数あるよ。
でも、きっと君が望む回答じゃないと思う。

まず本当に自分がやりたい事を整理しなされ
0606nobodyさん05/01/05 23:59:20ID:???
>604
そうなんですか。
実は読んだのですが、2日前にPerl始めたばっかりなんで結構チンプンカンプンでした・・・。
精進します。
0607nobodyさん05/01/06 03:24:55ID:???
つまり >|.*?|< という括弧のネストを解決したいわけだな
0608nobodyさん05/01/06 06:40:28ID:???
>>593
括弧の種類が一つならば、ネストは考えなくてもいい。

my ($open, $close);
$data =~ s/(>\|)|(\|<)/$1 ? ($open++, "<strong>") : ($close++, "<\/strong>")/ge;
($open > $close) and die "開き括弧が多すぎます";
($open < $close) and die "閉じ括弧が多すぎます";
060960805/01/06 12:23:08ID:???
訂正です。閉じが先に来るパターンを忘れてました。

my ($open, $close);
$data =~ s/(>\|)|(\|<)/
$1 ? ($open++, "<strong>") :
(($open <= $close and die "対応する開き括弧が見つかりません"),
$close++, "<\/strong>")/ge;

($open > $close) and die "対応する閉じ括弧が見つかりません";
0610ty8it05/01/06 12:31:38ID:???
ut
0611nobodyさん05/01/06 12:41:53ID:???
つーか>>595でいいじゃん、残り全部強調したいのかも知れないし
0612nobodyさん05/01/06 12:49:00ID:???
>>611
|<あああ>| →</strong>あああ<strong>
|>| →</strong>strong>

この辺りを許容するかどうかだけどね。
許容するなら、>>595のでもいいし。
061359905/01/06 13:53:22ID:???
>>600 >>605
回答ありがとうございました。解決しました。

print文がLoopされていて
@$row[0] がそのつど書き換わっていただけでした。
素人甚だしく申し訳ございませなんだ
0614nobodyさん05/01/06 17:38:48ID:???
>612
許容でいいんじゃないの?
>609みたいに親切にエラー表示しなくてもいいような気がする・・・

意図する表現にならなかったらユーザーが文法間違えたってことだから、
入力したユーザーが修正で再度入力すればいいだけじゃないの?
掲示板で使うってことだから、書き込む前に変換後のプレビュー画面でも見せて
そこで修正するかそのまま書き込むかユーザーに選ばせればいいと思う。
0615nobodyさん05/01/06 20:45:08ID:???
質問
 XMLをハッシュに変換したいのですけどどうしたらよいでしょうか
0616nobodyさん05/01/06 21:25:44ID:VJDwnbh+
サブルーチンの中で<STDIN>を使って入力した値を受け取り、その値を比較に使おうと
思っても上手く行きません・・。何が原因なのでしょうか?

sub a{
my $input = <STDIN>;
if($input eq "a"){print "a\n";}
}

こんな感じのソースで、入力時に「a」と入力してもその後の文字列比較が上手く
いかないようで、printが行われません。何でなのでしょうか?
初歩的な質問ですいません。
0617nobodyさん05/01/06 21:35:38ID:???
my $input = <STDIN>
chomp $input;
if($input eq ...
0618nobodyさん05/01/06 22:40:43ID:???
>>615
なんか久々に見る大胆な質問だな
DOMツリーを作るなら XML::DOM とかあるが、どういう形のハッシュで出力させたいんだ?
061961605/01/07 00:37:45ID:???
>>617
なんと改行文字が含まれていたからなのですな・・・・。
ドツボにはまってました(汗

どうもありがとうございました!
0620nobodyさん05/01/07 05:02:49ID:???
>>615
XML::Simple が丁度 XML <=> Hash 変換してくれるモジュール。
0621nobodyさん05/01/07 09:45:47ID:???
>>619
このケースに限らないが、困った時はまず変数の中身を確認しろ。

use Data::Dumper;
print Dumper($scalar);
print Dumper(\%hash);
print Dumper(\@array);
0622nobodyさん05/01/07 11:48:48ID:???
多次元配列をサブルーチンの中で生成して、リファレンスを返したのですが、その多次元配列を
別のサブルーチンで扱うにはどうしたら良いのでしょうか?
リファレンスを渡すだけだと、
Can't use string ("ARRAY(xxxxxxxx)") as an ARRAY ref while 〜
と怒られてしまうのですが・・・・。
よろしくお願いいたします。
0623nobodyさん05/01/07 11:55:12ID:???
>>622
リファレンスを返すだけで普通は扱える。つか俺は使えている。
たぶん君の書いたコードが間違っているのだろう。
動かないコードと、何を読んでその書き方を憶えたか、を晒すと、
後学のためになると思う。
062462205/01/07 12:20:19ID:tb1n+4Nw
>>623
そうなのですか、まだ苦戦してます。やろうとしてるのは次みたいな感じです。

sub a {
open FH, '<', "$_[0]";
my @data;
while(<FH>){
push(@data, [ split(/;/) ]);
}
close(FH);
return \@data;
}

で生成した多次元配列@dataを別サブルーチンで扱いたいです。
my $ref = &a();
でリファレンスを受け取って、別のサブルーチンに引数として渡したのですが、
上手くいきません。

例えば、
sub b{
my $abc = $_;
foreach my $dummy (@{$$data[2]}){
print "$dummy";
}
}
とすると前述のエラーが出て怒られてしまいます。
何故なのでしょうか?
最初の質問が説明不足でしたが、よろしくお願いいたします。
062561505/01/07 12:28:40ID:???
>>620
やってみましたがリファレンスで返されて使いづらいのですが
0626nobodyさん05/01/07 13:53:30ID:???
>>624
sub b{
× my $abc = $_;
○ my $abc = $_[0];
○ my $abc = shift;
0627nobodyさん05/01/07 14:00:27ID:???
>>624
あと気付いてるとは思うが、
$abcに代入してるのに、$dataでデリファレンスしても
どうにもなんねーべや
062862405/01/07 14:30:35ID:tb1n+4Nw
>>626, >>627
レスありがとうございます。

$abc = $_[0];
で受け取って、$abc でデリファレンスしてみましたが、同じ様に
Can't use string ("ARRAY(xxxxxxxx)") as an ARRAY 〜 と出てしまいました。
$abc を表示したところ、ARRAY(0x810e7f0) と表示されたので、引数の受渡し自体
は上手くいっていると思いますが、そこからのデリファレンスがどうしても出来ません。
@{$abc}
@{$$abc}
とか、いずれも前述のエラーの対象となるようです・・・。
ここらへんざんまり良く分からないのですが、教えて頂けないでしょうか?
たびたびすみません
0629nobodyさん05/01/07 14:39:54ID:???
>>628
エラーが出る直前のあたりに print $abc; を入れて様子を見てみそ
063062405/01/07 14:51:20ID:tb1n+4Nw
並べて書いてみました。
sub b{
$abc = $_[0];
print "$abc\n"; #ARRAY(0x810e8c4) を出力
print "@$abc\n"; #Can't use string〜
print "@{$$abc[1]}\n"; #Can't use string〜
}

でした・・・・。

何故なのでしょうか?
サブルーチンの外で print "@$abc\n"; を実行すると
ARRAY(0x8118f74) ARRAY(0x8118fb0) ARRAY(0x8118ff8) ・・・・・
と表示されます。
構文がおかしいのでしょうか?
0631nobodyさん05/01/07 15:08:26ID:???
×b("$ref")
○b($ref)
0632nobodyさん05/01/07 15:14:52ID:???
>>630
あ、わかった気がする。
use strict してないでしょ。
063362405/01/07 15:19:31ID:???
>>630
問題解決しました!
引数として指定するときに""で囲ってました、リファレンスを渡す場合はいらないのですね。
気づいてみると単純なものでしたけど、ハマってました。

どうもありがとうございました!

>>632
use strict;
してました。もし同じことをするのにuse strict;を外すと、これまたエラーになってしまうのでしょうか?
0634nobodyさん05/01/07 19:09:58ID:???
変数を""で囲むという文化はどこから来たんだ
0635nobodyさん05/01/07 19:29:23ID:???
http://www36.tok2.com/home2/boboburajiru/xxx/data/bobo_20050107192625.lzh
これなんですけど、名前の部分とフォームの部分を一緒のformにいれることはできませんか?

1 スーパーひとし : テスト3 01/07’18:54
例えばこういう感じに。。
あと日付の表示のところに「'」が入ってしまいます。どうすればいいでしょうか。
0636nobodyさん05/01/07 19:30:21ID:???
訂正 フォームの部分→記事の部分
0637nobodyさん05/01/07 20:07:47ID:???
>>635
スレ違い
0638nobodyさん05/01/07 20:44:00ID:???
>>633
そのケースだとuse strictをしていないと*エラーにならず間違った動作*をする。
0639nobodyさん05/01/07 22:09:18ID:???
Perl初心者です。1つ質問させて下さい。

例えば

「今日は(・∀・)な日だった」

という文があったとして、この文から日本語だけを削除して

「(・∀・)」

このような文にしたいのですが、どのようにプログラミングすればいいでしょうか?
0640nobodyさん05/01/07 22:54:19ID:???
$data = '今日は(・∀・)な日だった';
$data =~ s/.*(\Q(・∀・)\E).*/$1/s;
0641nobodyさん05/01/07 22:57:48ID:???
$hoge='今日は(・∀・)な一日だった';
$hoge=~s/今日は//og;
$hoge=~s/な一日だった//og;
は間違いです
0642nobodyさん05/01/07 23:27:50ID:GrSDiTmV
gethostbyaddr関数の第2引数ってどういう意味なんでしょうか?
本によって、PF_INETと書いてあったりAF_INETと書いてあったりします。
よろしくお願いいたします。
0643nobodyさん05/01/07 23:30:16ID:???
>>1が読めないのかな?
0644nobodyさんNGNG
>>639
記号を残すということかな?
Shift-JISでひらがなを削除するにはこんな感じ。
$data = '今日は(・∀・)な日だった';
$data =~ s/\x82[\x9F-\xF1]//g;
あとは>>5のPerlメモから「日本語を扱う」とか、正規表現について調べたらいい。
064564205/01/07 23:41:11ID:???
>>643
すいませんスレを間違えました。
逝ってきます
0646nobodyさん05/01/07 23:45:04ID:???
>>645
いってらっしゃい
064763905/01/08 00:01:23ID:oXOik1WL
>>640
>>641
>>644
みなさんご丁寧な回答、本当にありがとうございます。
ひらがな、漢字、カタカナ、英語の文字を削除したかったのです。

644さんの通りやったら、ひらがなを削除することができました。
ASCIIコードで範囲を指定してやればいいのですね。

次は漢字、カタカナを頑張って調べてみます。

0648nobodyさん05/01/08 00:19:58ID:???
use strict;
条件下で、サブルーチンの中で宣言したローカル変数は、返り値として外部に渡したらグローバル変数になるのでしょうか?
0649nobodyさん05/01/08 01:04:43ID:???
何の為のローカル変数?
0650nobodyさん05/01/08 02:39:34ID:???
>>648
返り値は値であって変数ではない。その辺の概念を
勉強しなおすことをおすすめする。

my $r = 1;
return $r;

は、$rという変数を返すのではなくて$rという式
の値(=1)を返す訳だ。




0651nobodyさん05/01/08 03:06:03ID:???
俺もこれ気になったことあった。
sub a{
my @array = (1, 2, 3);
return \@array;
}

$a = &a();
で返り値受け取ったとすると、リファレンス使って@arrayの値を参照したり、
配列をしたり出来る訳だけど、となるとmyで宣言したローカル変数はいずこへ・・・と思ったりした。
これって、シンボリックリファレンスの@arrayは消滅するけど、そこで確保された値は残っていて、
ハードウェアリファレンスを用いることで@arrayを参照できる・・・・ってことでいいのかな?
(一度確保した値はメモリ上にいつまで残っているのだろうか?)

適当に覚えた知識ゆえ間違ってたらすまん。
玄人の方訂正やつっこみよろしく頼みます。
0652nobodyさん05/01/08 03:14:24ID:???
どこかから参照している限りは残るんじゃなかったっけ。
0653nobodyさん05/01/08 07:34:20ID:???
変数を宣言すると、名前と実体が確保される。
実体は参照カウンタ型ガーベッジコレクション付きのメモリに確保される。
実体は参照されている数がカウントされていて、カウントが0に(誰も参照していなく)なると破棄される。

変数がサブルーチンから抜けるなどでスコープから外れると、
変数の名前が破棄されて、参照カウント値が一つ減らされる。
しかし、リファレンスによって参照されている限りカウントは0にならないから実体は破棄されない。
(ここでのリファレンスはシンボリックではない、ハードリファレンスのこと)

C,C++の(一般的な実装の)ローカル変数のようにスタック上にメモリを確保する訳じゃないから、
こんな芸当ができる。
0654nobodyさん05/01/08 07:35:17ID:???
Perlの変数には注目度というものがあります。
誰かに注目されている限り神様が生かしてくれます。
友達のお婆ちゃんはこれが原因で亡くなりました。
0655nobodyさん05/01/08 09:37:13ID:???
いつの間にかリファレンスの話になってるけど、
この辺は「初めてのPerl」読めばすっきりすると思う。

クロージャとかも混乱しやすいね。
0656nobodyさん05/01/08 13:05:23ID:???
下記の2パターンのような文字列から値だけを取得したい場合どうすればいいのでしょうか?
split(/\s/);を使ってスペースで区切ると"と"の間のスペースでも、区切られてしまいます。。。
,で区切る場合は、realmで,が現れるとそこでくぎられてしまいます。
また、スペースがない場合はrealmは"と"で区切られないこともあるかもです。

誰か助けてください。。。

パターン
Basic realm="Secret Zone"
Digest realm="Secret Zone", nonce="RMH1usDrAwA=6dc290ea3304de42a7347e0a94089ff5912ce0de",
algorithm=MD5, qop="auth"

取り出したい値
$type = Basic 又は Digest;
$realm = Secret Zone;
以下$type=Digestの場合のみ。BasicのときはNull。
$nonce = RMH1usDrAwA=6dc290ea3304de42a7347e0a94089ff5912ce0de;
$algorithm=MD5;
$qop=auth;
0657nobodyさん05/01/08 13:25:08ID:???
要点を絞れよ
言ってることがよく分からん
0658nobodyさん05/01/08 14:09:43ID:???
1つ質問させて下さい。Perl初心者です。
ファイルの中身が「abcCLEてすと」である文章をopenして、

$text = "abcCLEてすと" 

とし、これから「abc」を削除しようと思って

$text =~ s/a|b|c//g;
print "結果:$text\n";

として、結果を表示すると

「結果:bkEてすと」
と表示されます。
abcは削除されているようですが、他の文字が文字化けしています。
文字化けさせない為には、どうすればいいでしょうか?
065965605/01/08 14:21:24ID:???
ttp://www.studyinghttp.net/rfc_ja/rfc2617.ja#sec2
ttp://www.studyinghttp.net/rfc_ja/rfc2617.ja#sec3.2.1
2種類のWeb認証ヘッダを取得して変数に代入したいということです。

ヘッダから取り出したいのは、
Basic又はDigestなどの第一要素。
認証名を収納しているrealm。
Digestで必要なnonceとalgorithmとqop。
以上の5つです。
0660nobodyさん05/01/08 16:41:21ID:???
>>659
だからよ、そのパターンってのが何に入っているんだ?
配列か?変数か?ハッシュか?
splitとか言ってるってことはもう格納してあるんだろ?
0661nobodyさん05/01/08 16:54:51ID:???
>>656
フォーマットが固定されてるなら、正規表現のパターンマッチで切り出すのが楽だと思う
066265605/01/08 18:35:50ID:???
>>660
splitでやって失敗したので困ってます
,で区切った場合、""で囲まれたところで,が出てきたら大変なことに・・・

>>661
正規表現はちょっと苦手なので、なるべく避けたいと思ってたり・・・
それに、それがすべてではなく、順番なども異なっている鯖もあるかもです
0663nobodyさん05/01/08 18:40:17ID:???
>>662
ハッシュと正規表現使え。
0664656=66205/01/08 18:41:53ID:???
>>663
やっぱり正規表現使うしかないですか・・・
少しだけ正規表現を調べてきます
0665nobodyさん05/01/08 19:56:37ID:???
>>658
$text = "abcCLEてすと";
$text =~ s/a|b|c//g;
print "結果:$text\n";

結果:CLEてすと
化けないよ。
0666nobodyさん05/01/08 20:50:34ID:???
>>664
なんか良く分からんが、絶対使われない(っぽい)<>とかで区切っちゃダメなの?
0667nobodyさん05/01/08 20:53:20ID:???
>>666
君は何を言ってるんだね?
0668nobodyさん05/01/08 20:58:27ID:???
Windowsで、"abcCLEてすと"だと化けるな。(CLEは全角)
0669nobodyさん05/01/08 22:26:26ID:???
なんかよくわからんがひょっとして、SJISでパターンマッチした→化けたよ助けてどらえもーん、
という話か?

それなら「それはきみがわるい」でまとめちゃうぞ
0670nobodyさん05/01/09 01:39:48ID:???
http://www.rescue.ne.jp/study/pack/
画像を文字に変換するというスクリプト(バイナリデータを16進ダンプし、
それをスクリプトに埋め込んで復号)を試してます。
上記のサイトの変換、復号cgiをレンタル鯖(Linux+Apache1.3+Perl 5.008003)に
設置してやると正常に動くのですが、ローカル(Win2k+Apache2+Perl 5.008004)
だと画像が壊れてビットマップがぐちゃぐちゃになってしまいます。
$data = pack('C*',hex($_));
ここらへんに原因があるとしか思えないのですが、、、
Windows+Perlでファイル出力の場合ならbinmodeにしたりするところですが、
こういう場合はどうしたらいいでしょうか。
0671nobodyさん05/01/09 05:52:13ID:???
>>670

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0672nobodyさん 05/01/09 07:33:40ID:???
なにが悪いか解ったけど、質問の方法を考えてもらってからにしよう
0673nobodyさん05/01/09 07:49:51ID:???
binmode(STDIN);
全体像が見えないので勘で答えてみた。
0674nobodyさん 05/01/09 08:04:25ID:???
>>673
当たり。
だけど、質問者に考えてほしかったなぁ
0675nobodyさん 05/01/09 08:13:53ID:???
>>674
でも、当たりじゃないな
0676nobodyさん05/01/09 08:24:21ID:???
驕
0677nobodyさん05/01/09 12:43:15ID:???
つか、CGIレスキューなんだろ?
0678nobodyさん05/01/09 13:11:09ID:???
>>659
> 2種類のWeb認証ヘッダを取得して変数に代入したいということです。
ここで言ってる「Web認証ヘッダ」とはクライアントからサーバに送られるAuthorizationヘッダの事か?
このヘッダはセキュリティ上の理由でCGIには渡されないと言う事を知っているか?
067967005/01/09 14:17:11ID:???
>>672-677
レスありがとうございます。わかりにくくてすみませんでした。
1: 16進ダンプされた数値を画像に変換したい。
2: ttp://www.rescue.ne.jp/study/pack/ 変換 復号cgiをそのまま実行。
  レンタルサーバーでは全く問題がなかった。
3: 自宅サーバーで画像が化けた。
binmode(STDIN);入れてもダメでした。
ttp://para-site.net/up/data/1032.zip
↑正常な画像,壊れた画像,使用したソースです。
068067005/01/09 14:32:59ID:???
すみません。解決しました。
やはりbinmode(STDOUT);でした。
IEのキャッシュを消してリロードしたら表示されました。(^-^;)
0681nobodyさん05/01/09 14:35:38ID:???
>>680
自力解決乙。

ちなみにその二つの画像ファイルをバイナリエディタで見比べてみると
0xBC の 0A F6 F4 の部分が壊れた画像では 0D 0A F6 F4 となっている。
これくらい自力で調べられるようにしておくといいかも。
0682nobodyさん05/01/09 15:13:59ID:???
>>658
Perlバージョンが分からないから、とりあえず。

use encoding "shiftjis";

$text = "abcCLEてすと";
$text =~ s/a|b|c//g;
print "結果:$text\n";
068365905/01/11 22:55:58ID:???
>>678
> ここで言ってる「Web認証ヘッダ」とはクライアントからサーバに送られるAuthorizationヘッダの事か?
サーバーからの要求のほうです。

> このヘッダはセキュリティ上の理由でCGIには渡されないと言う事を知っているか?
もちろん知っています。モジュールを使えば取得できることも知っています。
今回は、CGIにブラウザから渡って来るのではなく、Socketで取得してますのでこの点は関係ありません。
0684nobodyさん05/01/12 00:36:54ID:???
配列の中で重複する要素の番号を返すプログラムを考えているのですが、
どうやるとスマートに出来ますか?

一応自分で考えてみたのは

my @number = ();
my $dummy_count = 0;
foreach my $dummy (@array){
my $dummy2_count = 0;
foreach my $dummy2 (@array){
if($dummmy1_count != $dummy2_count){
if($dummy1 eq $dummy2){

ここでさらに$dummy1_count と$dummy2_count が@numberにあるかどうか
    をみて、ない場合にそれぞれ追加

}
}
$dummy2_count++;
}
$dummy1_count++;
}

ってな感じの初心者丸出しコードなんですが(汗 見難いですね・・・。
結果としては上手く出来たのですが、もっと良いコードの書き方があるかと。。。
いかがなもんでしょうか?
068568405/01/12 00:38:26ID:???
Σ(゚Д゚;エーッ!  
半角スペース使ったせいで死。。すいません
0686nobodyさん05/01/12 00:44:21ID:???
Σ(゚Д゚;エーッ!
0687nobodyさん05/01/12 01:23:28ID:???
>>684
my @list = qw/test1 test2 test3 test4 test5 test2 test6 test7/;

my %count;
@_list = grep $count{$list[$_]}++, 0 .. $#list;

print @_list;
0688nobodyさん05/01/12 01:33:22ID:???
>>687
それだと5しかでないけど、欲しい結果は1,5なんじゃない?

私ならこうする。

my %count;

foreach (0..$#array) {
push @{$count{$array[$_]}}, $_;
}

my @number = map @$_, grep @$_ >= 2, values %count;
0689nobodyさん05/01/12 02:00:22ID:???
すみません初心者の質問なんですけど、ご教授ください

連想配列の要素の数はどうやってもとめればいいんですか?
0690nobodyさん05/01/12 02:04:48ID:???
>>689
そういう関数があるので調べてください
0691nobodyさん05/01/12 02:04:54ID:???
>>688
そうだったんか。俺ならこう。

my @list = qw/test1 test2 test3 test4 test5 test2 test6 test7/;

my %count;
$count{$_}++ for @list;
my @_list = grep $count{$list[$_]} >= 2, 0 .. $#list;

print @_list;
069268405/01/12 02:23:19ID:???
>>687さん >>688さん
レス有難うございます。

>>688さんの仰るように、例でいくと1, 5が欲しかったです。
それで、今>>688さんのコードを試して見たのですが・・・・・。
あっさりすぎるほどに求めていた答えがでました。私が書いた50行がたったのコレだけで
出来てしまうんですね(汗 悲しい部分もありますが、すごく感動ですね。
本当にありがとうございますm(_ _)m

ですが・・・・コードがまだ理解出来ないのがイタイです(笑
もし>>688さんに少しお時間ありましたら、ほんとにさわりだけでもいいのでコード解説とか
お願いできませんか? 解説頂いても理解出来ないかもしれませんが、人のコード使っておいて
まったく何やってるか分からないってのも困りますし、自分のためにならないぽいので。。。。
こちらはお聞きすることしか出来ませんが、もし余裕があればお願いします。

>>677さんのコードも試してみました。
こちらも重複する項目の番号が返ってきました。
こちらの説明が足らなかったので申し訳なかったです。けどパッと書けてしまうみなさんは
すごいですね。私もまだまだ頑張らないと。

>>687さん >>688さん、本当にありがとうございました
0693nobodyさん05/01/12 09:12:09ID:SoBMVf5u
携帯用の非会員制ネットショップをPerlで構築してる途中です。(最後にmysqlに突っ込む形式)
携帯はキャリアごとに画像形式などが違うので完全にCGIで作っています。

PCサイトは既に作ってあり運営中なので、簡単だろうなと思ってとりあえず
見た目はある程度できました。

が、携帯はcookieが使えないとこのことorz
PCサイトではcookieに注文内容を詰め込んでいたので、ちょっと困っています。

今はURIの?以降にページIDを使ってページの移動をしてます。
今考えているのは
http://www.2ch.net/?page=index&商品番号=数量&商品番号2=数量2
等の形式で常にリンクURLの後ろに注文内容を保持していく方法です。
getの制限である255byteはそうそう超えないんで大丈夫だと思いますが・・・・

?page=index&ユニークID のようにIDを発行して注文内容はサーバ側で
管理してIDマッチングでセッションするならばバイト数なんて気になりませんが、
現状の私のスキルでは少し時間がかかりそうです^^;

もっと賢いやり方があるなら教えてくださいm(_ _)m
■ このスレッドは過去ログ倉庫に格納されています