Perlコーディング初心者質問スレ Part 39
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/11/27 11:35:03ID:DJwiGeFM【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0581580
05/01/05 02:14:50ID:V9sS6I440582nobodyさん
05/01/05 02:16:38ID:???調べろ
sub a {
my %hash = ( a => 1, b => 2 );
my @array = ( "a", "b", "c" );
my $ref = [ \%hash, \@array ];
return $ref;
}
0583nobodyさん
05/01/05 02:18:17ID:elOzKoqYspliceを使えばよいかと。
こんな感じで。
splice(@array, 0, 4);
0584580
05/01/05 03:11:37ID:V9sS6I44なるほど、こんな便利な関数があったのですね。
ありがとうございました。
0585nobodyさん
05/01/05 03:37:03ID:???}
これって一つの条件式、あるはもっと簡単に出来ないでしょうか
0587nobodyさん
05/01/05 04:02:01ID:???すいませんでした。。&& thx;
0589nobodyさん
05/01/05 04:39:44ID:???0590nobodyさん
05/01/05 07:39:31ID:???# 1以下
if ($hoge - $foo <= 1) {
# 処理;
}
ただし、0.5とかも入っちゃうけど…。
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:???正規表現の部分にちょっと無駄な部分があるような希ガス
$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;
(Perl5以上で)これでいいんじゃないかな。
解説
・ >| と |< を括弧でくくる理由がわからない。
・繰り返し記号の後に ? を使ったら、最短でマッチする。
・オプション s を使うと、 . (←半角ドットね^^;)も改行文字にマッチするようになる。
0595nobodyさん
05/01/05 18:07:50ID:???ごめん、ちょっと電波が
$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]\n"; を実行した結果が、
あいう
えおか
きく
となる配列の要素を、
「あいう」、「えおか」、「きく」
それぞれ別の変数(もしくは配列)に入れる方法を教えてください。
print "$a, $b, $c"; を実行すると、
あいう, えおか, きく
(↑例えばこのように出力したい)
chomp、 split(/\n/, @$row[0]) では不可でした。
0600nobodyさん
05/01/05 21:40:56ID:???print "@a"; を print "@a\n";にかえただけで改行が
少なくとも2箇所増えるような@aはオレには思いつかない。
0601nobodyさん
05/01/05 22:30:59ID:DtV5vUlCDBに格納してあるutf8の文字列を取得するとき、その都度 utf8::decode($str)
としてUTF8フラグを付けているのですが、自動的にUTF8フラグが付くようにする
にはどのようにしたらよいのでしょうか?
0602593
05/01/05 23:36:16ID:???ありがとうございます。
$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:???文章の整形や修飾に関しては全然難しい事やってないよ。
0605nobodyさん
05/01/05 23:49:42ID:???その質問の真意はよくわからんけど、
馬鹿正直に答えるとまずprint関数の定義をいじらんとダメかな。
perlはめちゃくちゃな言語なんでいじる手段は複数あるよ。
でも、きっと君が望む回答じゃないと思う。
まず本当に自分がやりたい事を整理しなされ
0606nobodyさん
05/01/05 23:59:20ID:???そうなんですか。
実は読んだのですが、2日前にPerl始めたばっかりなんで結構チンプンカンプンでした・・・。
精進します。
0607nobodyさん
05/01/06 03:24:55ID:???0608nobodyさん
05/01/06 06:40:28ID:???括弧の種類が一つならば、ネストは考えなくてもいい。
my ($open, $close);
$data =~ s/(>\|)|(\|<)/$1 ? ($open++, "<strong>") : ($close++, "<\/strong>")/ge;
($open > $close) and die "開き括弧が多すぎます";
($open < $close) and die "閉じ括弧が多すぎます";
0609608
05/01/06 12:23:08ID:???my ($open, $close);
$data =~ s/(>\|)|(\|<)/
$1 ? ($open++, "<strong>") :
(($open <= $close and die "対応する開き括弧が見つかりません"),
$close++, "<\/strong>")/ge;
($open > $close) and die "対応する閉じ括弧が見つかりません";
0610ty8it
05/01/06 12:31:38ID:???0612nobodyさん
05/01/06 12:49:00ID:???|<あああ>| →</strong>あああ<strong>
|>| →</strong>strong>
この辺りを許容するかどうかだけどね。
許容するなら、>>595のでもいいし。
0613599
05/01/06 13:53:22ID:???回答ありがとうございました。解決しました。
print文がLoopされていて
@$row[0] がそのつど書き換わっていただけでした。
素人甚だしく申し訳ございませなんだ
0614nobodyさん
05/01/06 17:38:48ID:???許容でいいんじゃないの?
>609みたいに親切にエラー表示しなくてもいいような気がする・・・
意図する表現にならなかったらユーザーが文法間違えたってことだから、
入力したユーザーが修正で再度入力すればいいだけじゃないの?
掲示板で使うってことだから、書き込む前に変換後のプレビュー画面でも見せて
そこで修正するかそのまま書き込むかユーザーに選ばせればいいと思う。
0615nobodyさん
05/01/06 20:45:08ID:???XMLをハッシュに変換したいのですけどどうしたらよいでしょうか
0616nobodyさん
05/01/06 21:25:44ID:VJDwnbh+思っても上手く行きません・・。何が原因なのでしょうか?
sub a{
my $input = <STDIN>;
if($input eq "a"){print "a\n";}
}
こんな感じのソースで、入力時に「a」と入力してもその後の文字列比較が上手く
いかないようで、printが行われません。何でなのでしょうか?
初歩的な質問ですいません。
0617nobodyさん
05/01/06 21:35:38ID:???chomp $input;
if($input eq ...
0618nobodyさん
05/01/06 22:40:43ID:???なんか久々に見る大胆な質問だな
DOMツリーを作るなら XML::DOM とかあるが、どういう形のハッシュで出力させたいんだ?
0621nobodyさん
05/01/07 09:45:47ID:???このケースに限らないが、困った時はまず変数の中身を確認しろ。
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:???リファレンスを返すだけで普通は扱える。つか俺は使えている。
たぶん君の書いたコードが間違っているのだろう。
動かないコードと、何を読んでその書き方を憶えたか、を晒すと、
後学のためになると思う。
0624622
05/01/07 12:20:19ID:tb1n+4Nwそうなのですか、まだ苦戦してます。やろうとしてるのは次みたいな感じです。
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";
}
}
とすると前述のエラーが出て怒られてしまいます。
何故なのでしょうか?
最初の質問が説明不足でしたが、よろしくお願いいたします。
0626nobodyさん
05/01/07 13:53:30ID:???sub b{
× my $abc = $_;
○ my $abc = $_[0];
○ my $abc = shift;
0628624
05/01/07 14:30:35ID:tb1n+4Nwレスありがとうございます。
$abc = $_[0];
で受け取って、$abc でデリファレンスしてみましたが、同じ様に
Can't use string ("ARRAY(xxxxxxxx)") as an ARRAY 〜 と出てしまいました。
$abc を表示したところ、ARRAY(0x810e7f0) と表示されたので、引数の受渡し自体
は上手くいっていると思いますが、そこからのデリファレンスがどうしても出来ません。
@{$abc}
@{$$abc}
とか、いずれも前述のエラーの対象となるようです・・・。
ここらへんざんまり良く分からないのですが、教えて頂けないでしょうか?
たびたびすみません
0630624
05/01/07 14:51:20ID:tb1n+4Nwsub 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)
0633624
05/01/07 15:19:31ID:???問題解決しました!
引数として指定するときに""で囲ってました、リファレンスを渡す場合はいらないのですね。
気づいてみると単純なものでしたけど、ハマってました。
どうもありがとうございました!
>>632
use strict;
してました。もし同じことをするのにuse strict;を外すと、これまたエラーになってしまうのでしょうか?
0634nobodyさん
05/01/07 19:09:58ID:???0635nobodyさん
05/01/07 19:29:23ID:???これなんですけど、名前の部分とフォームの部分を一緒のformにいれることはできませんか?
1 スーパーひとし : テスト3 01/07’18:54
例えばこういう感じに。。
あと日付の表示のところに「'」が入ってしまいます。どうすればいいでしょうか。
0636nobodyさん
05/01/07 19:30:21ID:???0639nobodyさん
05/01/07 22:09:18ID:???例えば
「今日は(・∀・)な日だった」
という文があったとして、この文から日本語だけを削除して
「(・∀・)」
このような文にしたいのですが、どのようにプログラミングすればいいでしょうか?
0640nobodyさん
05/01/07 22:54:19ID:???$data =~ s/.*(\Q(・∀・)\E).*/$1/s;
0641nobodyさん
05/01/07 22:57:48ID:???$hoge=~s/今日は//og;
$hoge=~s/な一日だった//og;
は間違いです
0642nobodyさん
05/01/07 23:27:50ID:GrSDiTmV本によって、PF_INETと書いてあったりAF_INETと書いてあったりします。
よろしくお願いいたします。
0644nobodyさん
NGNG記号を残すということかな?
Shift-JISでひらがなを削除するにはこんな感じ。
$data = '今日は(・∀・)な日だった';
$data =~ s/\x82[\x9F-\xF1]//g;
あとは>>5のPerlメモから「日本語を扱う」とか、正規表現について調べたらいい。
0647639
05/01/08 00:01:23ID:oXOik1WL>>641
>>644
みなさんご丁寧な回答、本当にありがとうございます。
ひらがな、漢字、カタカナ、英語の文字を削除したかったのです。
644さんの通りやったら、ひらがなを削除することができました。
ASCIIコードで範囲を指定してやればいいのですね。
次は漢字、カタカナを頑張って調べてみます。
0648nobodyさん
05/01/08 00:19:58ID:???条件下で、サブルーチンの中で宣言したローカル変数は、返り値として外部に渡したらグローバル変数になるのでしょうか?
0649nobodyさん
05/01/08 01:04:43ID:???0650nobodyさん
05/01/08 02:39:34ID:???返り値は値であって変数ではない。その辺の概念を
勉強しなおすことをおすすめする。
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:???誰かに注目されている限り神様が生かしてくれます。
友達のお婆ちゃんはこれが原因で亡くなりました。
0655nobodyさん
05/01/08 09:37:13ID:???この辺は「初めてのPerl」読めばすっきりすると思う。
クロージャとかも混乱しやすいね。
0656nobodyさん
05/01/08 13:05:23ID:???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:???ファイルの中身が「abcCLEてすと」である文章をopenして、
$text = "abcCLEてすと"
とし、これから「abc」を削除しようと思って
$text =~ s/a|b|c//g;
print "結果:$text\n";
として、結果を表示すると
「結果:bkEてすと」
と表示されます。
abcは削除されているようですが、他の文字が文字化けしています。
文字化けさせない為には、どうすればいいでしょうか?
0659656
05/01/08 14:21:24ID:???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:???だからよ、そのパターンってのが何に入っているんだ?
配列か?変数か?ハッシュか?
splitとか言ってるってことはもう格納してあるんだろ?
0662656
05/01/08 18:35:50ID:???splitでやって失敗したので困ってます
,で区切った場合、""で囲まれたところで,が出てきたら大変なことに・・・
>>661
正規表現はちょっと苦手なので、なるべく避けたいと思ってたり・・・
それに、それがすべてではなく、順番なども異なっている鯖もあるかもです
0665nobodyさん
05/01/08 19:56:37ID:???$text = "abcCLEてすと";
$text =~ s/a|b|c//g;
print "結果:$text\n";
結果:CLEてすと
化けないよ。
0668nobodyさん
05/01/08 20:58:27ID:???0669nobodyさん
05/01/08 22:26:26ID:???という話か?
それなら「それはきみがわるい」でまとめちゃうぞ
0670nobodyさん
05/01/09 01:39:48ID:???画像を文字に変換するというスクリプト(バイナリデータを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:???1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0672nobodyさん
05/01/09 07:33:40ID:???0673nobodyさん
05/01/09 07:49:51ID:???全体像が見えないので勘で答えてみた。
0676nobodyさん
05/01/09 08:24:21ID:???0677nobodyさん
05/01/09 12:43:15ID:???0678nobodyさん
05/01/09 13:11:09ID:???> 2種類のWeb認証ヘッダを取得して変数に代入したいということです。
ここで言ってる「Web認証ヘッダ」とはクライアントからサーバに送られるAuthorizationヘッダの事か?
このヘッダはセキュリティ上の理由でCGIには渡されないと言う事を知っているか?
0679670
05/01/09 14:17:11ID:???レスありがとうございます。わかりにくくてすみませんでした。
1: 16進ダンプされた数値を画像に変換したい。
2: ttp://www.rescue.ne.jp/study/pack/ 変換 復号cgiをそのまま実行。
レンタルサーバーでは全く問題がなかった。
3: 自宅サーバーで画像が化けた。
binmode(STDIN);入れてもダメでした。
ttp://para-site.net/up/data/1032.zip
↑正常な画像,壊れた画像,使用したソースです。
0680670
05/01/09 14:32:59ID:???やはりbinmode(STDOUT);でした。
IEのキャッシュを消してリロードしたら表示されました。(^-^;)
■ このスレッドは過去ログ倉庫に格納されています