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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん05/01/27 18:08:42ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0002nobodyさん05/01/27 18:09:13ID:???
関連スレ
△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/

CGIだけど、なんか質問ある? Part 12
http://pc5.2ch.net/test/read.cgi/php/1097334246/

【Perl,CGI】参考書籍 第三版
http://pc5.2ch.net/test/read.cgi/php/1030209573/

【Perl】ファイルロック(排他処理)について語ろう
http://pc5.2ch.net/test/read.cgi/php/1024795138/

★負荷軽減対策委員会(Perl、PHP)★
http://pc5.2ch.net/test/read.cgi/php/1034645635/

Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/

CGIに依存しないPerlの話題一般/Part2
http://pc5.2ch.net/test/read.cgi/php/1030548610/

★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc5.2ch.net/test/read.cgi/php/1077525387/

【 スクリプト改造依頼スレ 】(丸投げ) part3
http://pc5.2ch.net/test/read.cgi/php/1105046286/
0003nobodyさん05/01/27 18:09:57ID:???
[過去ログ] 1 of 2

Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
 DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
 DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 http://pc.2ch.net/php/kako/1026/10269/1026977659.html
Part15 http://pc.2ch.net/php/kako/1028/10288/1028816385.html
Part16 http://pc.2ch.net/php/kako/1032/10320/1032070299.html
part17 http://pc.2ch.net/php/kako/1034/10345/1034583844.html
part18 http://pc.2ch.net/php/kako/1037/10377/1037797479.html
part19 http://pc.2ch.net/php/kako/1042/10422/1042260745.html
part20 http://pc2.2ch.net/php/kako/1044/10447/1044717887.html (タイトルに19と誤記)
0004nobodyさん05/01/27 18:10:35ID:???
[過去ログ] 2 of 2

part21 http://pc2.2ch.net/php/kako/1047/10479/1047980851.html
part22 http://pc2.2ch.net/php/kako/1050/10503/1050369328.html
part23 http://pc2.2ch.net/php/kako/1053/10530/1053051519.html
part24 http://pc2.2ch.net/php/kako/1054/10549/1054992610.html
part25 http://pc2.2ch.net/php/kako/1056/10567/1056730690.html
part26 http://pc5.2ch.net/php/kako/1059/10590/1059043704.html
part27 http://pc5.2ch.net/php/kako/1060/10608/1060808783.html
part28 http://pc5.2ch.net/php/kako/1063/10635/1063562491.html
part29 http://pc5.2ch.net/php/kako/1066/10662/1066286828.html
part30 http://pc5.2ch.net/test/read.cgi/php/1069846177/
part31 http://pc5.2ch.net/test/read.cgi/php/1072896288/
part32 http://pc5.2ch.net/test/read.cgi/php/1075545279/ (タイトルに31と誤記)
part33 http://pc5.2ch.net/test/read.cgi/php/1078076768/
part34 http://pc5.2ch.net/test/read.cgi/php/1081148490/
part35 http://pc5.2ch.net/test/read.cgi/php/1085557731/
part36 http://pc5.2ch.net/test/read.cgi/php/1089779036/
part37 http://pc5.2ch.net/test/read.cgi/php/1093106507/
part38 http://pc5.2ch.net/test/read.cgi/php/1097158988/
part39 http://pc5.2ch.net/test/read.cgi/php/1101522903/ (前スレ)
0005nobodyさん05/01/27 18:11:41ID:???
ム板Perlスレより

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

[本]
リャマ: http://www.oreilly.co.jp/BOOK/lperl3/
駱駝: http://www.oreilly.co.jp/BOOK/pperl3v1/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/BOOK/pcook/

[オンラインマニュアル]
Perldoc.com: http://perldoc.com
perldoc.jp: http://perldoc.jp
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/%7ekbk/perl5.005/

[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://member.nifty.ne.jp/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
0006nobodyさん05/01/27 20:48:05ID:???
即死回避兼ねて>>1乙
0007未承諾広告※ ◆TWARamEjuA 05/01/27 21:14:31ID:???
>>1
ぼみょー
0008nobodyさん05/01/28 04:42:22ID:???
やりたい事はハッシュの配列をサブルーチンで作り
それを受け取って表示したいのですが・・・。

sub test {
 my ( $ref ) = @_;
 $ref->[1]->{'a'} = "A1";
 $ref->[1]->{'b'} = "B1";
 $ref->[2]->{'a'} = "A2";
 $ref->[2]->{'b'} = "B2";
}
↑こんなサブルーチンを作って

my ( @data, %tmp1, $tmp2 )
test( \@test );
foreach $tmp1 ( @data ) {
 foreach $tmp2 ( keys %tmp1 ) {
  print qq($tmp2=$tmp1{$tmp2},);
 }
 print qq(|,);
}
↑こういう呼び出しを書いたのですが
a=A1,b=B1,|a=A2,b=B2,|
という結果を期待したのですがなにも表示されませんでした。

これを期待どうりにするには、何処をどうすれば良いのでしょうか?
0009805/01/28 04:44:17ID:???
誤 test( \@test );
正 test( \@data );
…です。
0010805/01/28 04:53:41ID:???
自己解決しました。
foreach $tmp2 ( keys %$tmp1 ) {
 print qq($tmp2=$tmp1->{$tmp2},);
}
これで解決しました。
…ところで、サブルーチンの中の
$ref->[1]->{'a'} = "A1"; 等は
$ref->[1]{'a'} = "A1"; でも同じ結果なのですが
どうしてなのでしょうか?
0011nobodyさん05/01/28 11:34:29ID:???
>>10
ブラケットとブレースの間にはさまれた矢印は
省略可能だから。

ラクダ本3版8.3.3「矢印演算子を使う」参照。

0012nobodyさん05/01/28 15:00:30ID:???
まいったわ
0013nobodyさん05/01/28 16:48:58ID:???
test.txtの中に
%hash = (
"a-1" => "今日はお日柄もよく・・・",
"a-2" => "今日はみなさんに大切なお話があります・・・"
);
というスクリプトを書いています。

これをメインで
open FH,"test.txt";
eval FH;
close FH;
print %hash;

としてみたのですが、何も表示されません。
test.txtを1行にして、
eval <FH>;
とすればできるんですが、1行にすると見づらくなってしまいます。

何か方法はありますか?
0014nobodyさん05/01/28 17:25:08ID:???
>>13
doとかrequireを調べてみるといいかも。

でもそれよりファイルフォーマットを決めて
%hashにその値を読み込むルーチンにした方が
幸せになれると思う。
0015nobodyさん05/01/28 17:44:18ID:???
>>13
eval <FH>;じゃないの?
0016nobodyさん05/01/28 17:50:35ID:???
>>15
そういう話じゃないから。
0017nobodyさん05/01/28 19:54:19ID:???
>>13
if (open FH,"test.txt") {
  local $/;
  eval <FH>;
  close FH;
}
print %hash;

特殊変数 $/ について調べてみ
0018nobodyさん05/01/28 20:56:02ID:BqQoLRNT
(^-^)/
0019nobodyさん05/01/28 22:22:08ID:???
>>13
test.txtのパーミッションはしっかりしておいてね。
万が一でも書き換えられたら目も当てられないから。
0020nobodyさん05/01/28 22:33:47ID:???
前スレ>>991
・カンマ演算子はリストを作る。
・リストをスカラーコンテキストで評価すると最後の要素が返る。
・式の中に別の式を埋め込みたかった。
これで察してください。
00211305/01/29 13:14:26ID:???
>>14-19
一杯ありがとうございます!
とりあえず応急で
eval join '',<FH>;
で済ませてしまいましたが、やはり色々なやり方があるのですね。

>>14さんがいうようにperl構文をそのまま入れるならtextファイルにする意味も
微妙なところなんですが、実は結構値が長文だったりするのです;

目的は素人でもテキスト自体を追加・修正できるようするためです。
外部ファイルにして一定のわかりやすいフォーマットにするというのが前提だったのですが、
csvもどきだと長文がはいると行・列が把握しづらくなってしまいます。

できれば本当は"a-1"の中にハッシュリファレンスを入れて10項目くらいの
プロパティ的なものをもたせたいんですが、複雑化すればするほど
csvって視認性が悪くなるんですよね。

掲示板などのdatファイルってどうやってるんでしょうか?
視認性がよく、プログラムでの処理もしやすいものがいいんですが・・・

場合によってはPerl以外のプログラム言語でも使用するのでやはり現状の
Perlの構文そのまんまっていうのはいまいちですよね。

みなさんが掲示板など作るときに作るdatのフォーマットなどを参考に聞かせていただけると
助かります。
0022nobodyさん05/01/29 13:59:05ID:???
$hoge =~ /a (\w*?) go/;

これで$1の中にマッチした文字列が入りますが、
$1って1回中身を参照したら削除されてしまうのですか?

($a) = $1 =~ /\d/;
($b) = $1 =~ /[a-zA-Z]/;

試しにこういうことをしたら後からやるほうには何も代入されないんです。
windows版activePerl5.6.1での話です。

もしも$1の中身を何度も参照したければ一旦他の変数に入れる以外に策はありませんか?
0023nobodyさん05/01/29 14:36:54ID:fOhenI6O
>>22
中身を参照したら消えるのではなくて次のパターンマッチ成功
またはブロックの終わりまで有効なのだが、どちらにせよそれを
越えて値が必要なら変数なりなんなりにしまっておくしかないね。
0024nobodyさん05/01/29 16:22:50ID:???
そういうことですか
レスありがとうございます
0025nobodyさん05/01/29 18:02:14ID:4Kvcglsl
for文でインクリメントする時は
 for(1..100)
って書けるけどデクリメントする時はどう書くんだろう?
 for(100..1)
は無理だよね。
0026nobodyさん05/01/29 18:06:59ID:???
>>25
http://perldoc.com/perl5.8.4/pod/func/reverse.html
for (reverse 1..100) { ... }
0027nobodyさん05/01/29 18:24:05ID:???
すみませんCのwindows.hに入っているSleep関数とperlのsleep関数の違いはなんですか?
0028nobodyさん05/01/29 19:32:37ID:???
>>27
http://perldoc.com/perl5.8.4/pod/func/sleep.html
http://www.microsoft.com/japan/msdn/library/ja/jpdllpro/html/_win32_sleep.asp
0029nobodyさん05/01/29 20:47:53ID:YcAE5qw3
if($ENV{'HTTP_USER_AGENT'} =~ /$_/){
$flag = 1;
}
どうしてもこれが上手く行きません。
なぜなのでしょうか?
ご教授お願い親します。
0030nobodyさん05/01/29 20:54:06ID:YcAE5qw3
>>29
追加。
$_に入るのは
DoCoMo/2.0 F900i(c100;TB;W22H12)
です。
0031nobodyさん05/01/29 21:18:43ID:???
>>29
括弧が正規表現の括弧として扱われている。
クオートメタするか、eq演算子やindex関数を検討。
0032nobodyさん05/01/29 21:19:51ID:fOhenI6O
>>30
カッコやピリオドは正規表現のメタキャラクタなので
そのまま埋め込むと別の意味になってしまう。

if($ENV{'HTTP_USER_AGENT'} =~ /\Q$_\E/){
$flag = 1;
}

とかすればいいだろう。
0033nobodyさん05/01/29 21:20:55ID:???
よくわからんが、
$ENV{'HTTP_USER_AGENT'} と $_ をプリントして同じものか見れば?
単に$_ にセットされていないって話じゃないだろうな。
0034nobodyさん05/01/29 21:34:08ID:YcAE5qw3
\Q$_\E
だけでは上手く行かず
my(@data) = ("$tmpDefine[0]","$tmpDefine[1]");
と配列に入れるさいに""をつけて解決しました。
ありがとうございました。
0035nobodyさん05/01/29 21:43:44ID:fOhenI6O
>>34
後半はundefが空文字列に変換されるあたりの関係かねぇ。
0036nobodyさん05/01/29 23:31:30ID:k1P2HVvm
test.cgiをeucで書いて、シフトjisで出力するにはどう書いたらいいのですか?
携帯で見れるようにしたいのですが文字化けしてしまいます。
jcode.plはあるのですがどう使っていいのかわかりません。
perlコーディングというかプログラム自体初めてです。
文字コードのことがよくわかりません。
わかりやすいサイトなどありましたら教えてくださ
どれではおながします
0037nobodyさん05/01/30 00:35:14ID:???
最初からShift_JISで書け。
そしてスクリプト内で
use encoding 'Shift_JIS';
と宣言しろ。
0038nobodyさん05/01/30 01:34:47ID:7qmv52uq
>>36
最後の2行、グダグダやね。
0039nobodyさん05/01/30 12:47:06ID:???
>>36
CGIの中には日本語を一切書かない。
HTMLの類はすべて外部ファイルに。
これで解決。
0040nobodyさん05/01/30 13:02:28ID:0daQX9sH
>>36
nkfでShift-JISに変換してしまっては?
test.cgiをまた編集したくなったらnkfでEUCに。
ちょっと面倒だけど。
0041nobodyさん05/01/30 13:39:39ID:???
>29-34を読んで、気になったのでお聞きしたいのですが、
--------------------------------------------------
#@ip_listは下記のようなリストです。
@ip_list = ('333.139.141.','333.20.117.','333.255.29.');#という感じ

$addr = $ENV{'REMOTE_ADDR'};
foreach (@ip_list){
  if ($addr =~ /^$_/){
    $flag = 1;
  last;
  }
}
--------------------------------------------------
これで一応うまくいっていたので、これまで何も考えて無かったのですが、
これは「.」が正規表現のメタ文字で「任意の1文字」なためにたまたまうまくいってただけで、
  if ($addr =~ /^$_/)
は
  if ($addr =~ /^\Q$_\E/)
とした方がいいのでしょうか?
0042nobodyさん05/01/30 14:09:44ID:???
>>41
アホ。
$_内にピリオド等のメタ文字が入っていてもメタ文字評価されるわけないだろ。
0043nobodyさん05/01/30 14:16:22ID:???
>>42
おまいがアホ。されるっつーの。
0044nobodyさん05/01/30 15:12:44ID:???
>>41
yes.
今まではたまたまうまくいってただけ。
エスケープしたほうがいいな。
0045nobodyさん05/01/30 15:21:23ID:nMKi12Lv
マッチする相手が正しいipアドレスならば
パターンの「.」の部分が数字にマッチするよう
だとたいていはアドレスの中の「.」がパターン
の中の数字の位置に来るような気がするので
かなり必然に近い偶然とはいえるな。

しかしだから大丈夫だということを証明しようと
がんばるよりは素直にエスケープしとけ。
0046nobodyさん05/01/30 15:22:07ID:???
>>41
これでもOK。
@ip_list = map{ quotemeta } ('333.139.141.','333.20.117.','333.255.29.');
00474105/01/30 17:48:45ID:???
みなさん、どうもありがとうございました。
考えてみたら、
if ($addr =~ /^333\.139\.141\./)
ひとつだけの場合だったらこうやってエスケープして書いているのに、
リストの要素ひとつひとつとの比較の場合はエスケープしてないっておかしいですよね。
ちゃんとエスケープ処理をするよう気をつけたいと思います。

>46さん
map関数調べてみました。
こういう便利な関数もあるんですね。たいへん勉強になりました。
0048nobodyさん05/01/30 18:36:05ID:60wlVefX
質問です。

|ddddddd|momddomo|aaaaaaaaaa|
|wwwwwww|fddddddd|ssssssssss|
|eeeeeee|pppppppp|rrrrrrrrrr|

'|'を区切りとしてテーブルタグに変換させる正規表現
を作れる人いませんか?

どうか宜しくお願い射ます
0049nobodyさん05/01/30 18:59:58ID:???
>>48
何を「どのように」変換したいのかをはっきりさせてから↓で聞いてください。

正規表現道場@2ch Part4
http://pc5.2ch.net/test/read.cgi/php/1105930285/
0050未承諾広告※ ◆TWARamEjuA 05/01/30 19:09:18ID:???
そもそも'333'で始まるIPアドレスって存在するの?
0051nobodyさん05/01/30 19:10:45ID:???
ただの例だろ
0052未承諾広告※ ◆TWARamEjuA 05/01/30 22:08:02ID:???
ですよね(苦笑)
でも、一致しないときは全部サーチしなきゃだから、やっぱりハシュに入れちゃった方が効率よさそうですね。
0053nobodyさん05/01/31 17:52:56ID:sSr/NKoB
Perl であるシンボリックリンクを調べて、リンク先のファイルのフルパスを
知りたいのですが、どう書けばよいのでしょう?

system で、ls -l した結果を切り貼りすれば、とりあえずできそうなのですが、
もう少し何か方法がありそうな気がしまして。
0054nobodyさん05/01/31 18:04:55ID:???
>>43
マジかよ!?
何でそんなセキュリティホール量産体制を作っちゃうのよ?
ユーザが送ってきた文字列を正規表現に使う前にサニタイジングしないと
いけないなんて面倒じゃないか?

っていうか何のメリットがあってそんな仕様なんだ?
0055nobodyさん05/01/31 18:10:49ID:???
perl=CGIと思い込んでる奴がまた一人
0056nobodyさん05/01/31 19:58:07ID:???
>>53
readlink
0057nobodyさん05/01/31 20:39:27ID:8ZuDaXBy
みなさまへ
「/ほげほげ」という文字を消したいんですよ。
$line =~ s|/ほげほげ||g;
↑で消えないんですが、どうしてって気持ちです。
「ほげほげ」だけなら↓で消えるのですが。「/」←コイツ(全角)が消えないのです。
$line =~ s|ほげほげ||g;
どうしてご存じかいませんか?


0058nobodyさん05/01/31 20:40:18ID:8ZuDaXBy
↑日本語になってないぞ。自己っす。
0059nobodyさん05/01/31 20:44:59ID:???
$line =~ s\Q/ほげほげ\E||g;
か?
0060nobodyさん05/01/31 20:46:01ID:???
$line =~ s|\Q/ほげほげ\E||g;
こうだったか…orz
0061nobodyさん05/01/31 20:56:16ID:???
>>57
別の話になるが、マッチするしないは見た通りと一致しないこともある。
暇があったらこういうのも読んでおくといい。
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0062nobodyさん05/01/31 20:58:15ID:???
↑あ、なった!
ありがとう・・・・・
(>_<)
今日一日はずっとこれ考えてました。
早くココで聞けばよかった…
0063nobodyさん05/01/31 21:02:00ID:8ZuDaXBy
全角の「/」も、それなりの仕事をしていると、今日初めて知りました。。。
今まで、全角はずっと文字あつかいでした。
0064nobodyさん05/01/31 21:23:56ID:???
>>54
>っていうか何のメリットがあってそんな仕様なんだ?

多分、\Q と \E をタイプする程度のことに文句を言うユーザを
排除しようとしたんじゃないかな。
0065nobodyさん05/01/31 21:52:09ID:ZqzhsiuT
>>63
SJISで書いただけじゃねーの?

「/」は815eだから正規表現のメタ
文字の「^」を含むので。

use encodengする場合除いてSJISで
スクリプト書くとはまるからやめた
方がいいと思う。
0066nobodyさん05/02/01 01:04:11ID:???
$| = 1;
プログラムの冒頭に書いてあるこれはどういう意味でしょうか。
■ このスレッドは過去ログ倉庫に格納されています