Perlコーディング初心者質問スレ Part 40
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/01/27 18:08:42ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
00108
05/01/28 04:53:41ID:???foreach $tmp2 ( keys %$tmp1 ) {
print qq($tmp2=$tmp1->{$tmp2},);
}
これで解決しました。
…ところで、サブルーチンの中の
$ref->[1]->{'a'} = "A1"; 等は
$ref->[1]{'a'} = "A1"; でも同じ結果なのですが
どうしてなのでしょうか?
0012nobodyさん
05/01/28 15:00:30ID:???0013nobodyさん
05/01/28 16:48:58ID:???%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:???doとかrequireを調べてみるといいかも。
でもそれよりファイルフォーマットを決めて
%hashにその値を読み込むルーチンにした方が
幸せになれると思う。
0017nobodyさん
05/01/28 19:54:19ID:???if (open FH,"test.txt") {
local $/;
eval <FH>;
close FH;
}
print %hash;
特殊変数 $/ について調べてみ
0018nobodyさん
05/01/28 20:56:02ID:BqQoLRNT0020nobodyさん
05/01/28 22:33:47ID:???・カンマ演算子はリストを作る。
・リストをスカラーコンテキストで評価すると最後の要素が返る。
・式の中に別の式を埋め込みたかった。
これで察してください。
002113
05/01/29 13:14:26ID:???一杯ありがとうございます!
とりあえず応急で
eval join '',<FH>;
で済ませてしまいましたが、やはり色々なやり方があるのですね。
>>14さんがいうようにperl構文をそのまま入れるならtextファイルにする意味も
微妙なところなんですが、実は結構値が長文だったりするのです;
目的は素人でもテキスト自体を追加・修正できるようするためです。
外部ファイルにして一定のわかりやすいフォーマットにするというのが前提だったのですが、
csvもどきだと長文がはいると行・列が把握しづらくなってしまいます。
できれば本当は"a-1"の中にハッシュリファレンスを入れて10項目くらいの
プロパティ的なものをもたせたいんですが、複雑化すればするほど
csvって視認性が悪くなるんですよね。
掲示板などのdatファイルってどうやってるんでしょうか?
視認性がよく、プログラムでの処理もしやすいものがいいんですが・・・
場合によってはPerl以外のプログラム言語でも使用するのでやはり現状の
Perlの構文そのまんまっていうのはいまいちですよね。
みなさんが掲示板など作るときに作るdatのフォーマットなどを参考に聞かせていただけると
助かります。
0022nobodyさん
05/01/29 13:59:05ID:???これで$1の中にマッチした文字列が入りますが、
$1って1回中身を参照したら削除されてしまうのですか?
($a) = $1 =~ /\d/;
($b) = $1 =~ /[a-zA-Z]/;
試しにこういうことをしたら後からやるほうには何も代入されないんです。
windows版activePerl5.6.1での話です。
もしも$1の中身を何度も参照したければ一旦他の変数に入れる以外に策はありませんか?
0023nobodyさん
05/01/29 14:36:54ID:fOhenI6O中身を参照したら消えるのではなくて次のパターンマッチ成功
またはブロックの終わりまで有効なのだが、どちらにせよそれを
越えて値が必要なら変数なりなんなりにしまっておくしかないね。
0024nobodyさん
05/01/29 16:22:50ID:???レスありがとうございます
0025nobodyさん
05/01/29 18:02:14ID:4Kvcglslfor(1..100)
って書けるけどデクリメントする時はどう書くんだろう?
for(100..1)
は無理だよね。
0026nobodyさん
05/01/29 18:06:59ID:???http://perldoc.com/perl5.8.4/pod/func/reverse.html
for (reverse 1..100) { ... }
0027nobodyさん
05/01/29 18:24:05ID:???0028nobodyさん
05/01/29 19:32:37ID:???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$flag = 1;
}
どうしてもこれが上手く行きません。
なぜなのでしょうか?
ご教授お願い親します。
0030nobodyさん
05/01/29 20:54:06ID:YcAE5qw3追加。
$_に入るのは
DoCoMo/2.0 F900i(c100;TB;W22H12)
です。
0032nobodyさん
05/01/29 21:19:51ID:fOhenI6Oカッコやピリオドは正規表現のメタキャラクタなので
そのまま埋め込むと別の意味になってしまう。
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だけでは上手く行かず
my(@data) = ("$tmpDefine[0]","$tmpDefine[1]");
と配列に入れるさいに""をつけて解決しました。
ありがとうございました。
0035nobodyさん
05/01/29 21:43:44ID:fOhenI6O後半はundefが空文字列に変換されるあたりの関係かねぇ。
0036nobodyさん
05/01/29 23:31:30ID:k1P2HVvm携帯で見れるようにしたいのですが文字化けしてしまいます。
jcode.plはあるのですがどう使っていいのかわかりません。
perlコーディングというかプログラム自体初めてです。
文字コードのことがよくわかりません。
わかりやすいサイトなどありましたら教えてくださ
どれではおながします
0037nobodyさん
05/01/30 00:35:14ID:???そしてスクリプト内で
use encoding 'Shift_JIS';
と宣言しろ。
0038nobodyさん
05/01/30 01:34:47ID:7qmv52uq最後の2行、グダグダやね。
0040nobodyさん
05/01/30 13:02:28ID:0daQX9sHnkfでShift-JISに変換してしまっては?
test.cgiをまた編集したくなったらnkfでEUCに。
ちょっと面倒だけど。
0041nobodyさん
05/01/30 13:39:39ID:???--------------------------------------------------
#@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/)
とした方がいいのでしょうか?
0045nobodyさん
05/01/30 15:21:23ID:nMKi12Lvパターンの「.」の部分が数字にマッチするよう
だとたいていはアドレスの中の「.」がパターン
の中の数字の位置に来るような気がするので
かなり必然に近い偶然とはいえるな。
しかしだから大丈夫だということを証明しようと
がんばるよりは素直にエスケープしとけ。
0046nobodyさん
05/01/30 15:22:07ID:???これでもOK。
@ip_list = map{ quotemeta } ('333.139.141.','333.20.117.','333.255.29.');
004741
05/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:???何を「どのように」変換したいのかをはっきりさせてから↓で聞いてください。
正規表現道場@2ch Part4
http://pc5.2ch.net/test/read.cgi/php/1105930285/
0050未承諾広告※ ◆TWARamEjuA
05/01/30 19:09:18ID:???0051nobodyさん
05/01/30 19:10:45ID:???0052未承諾広告※ ◆TWARamEjuA
05/01/30 22:08:02ID:???でも、一致しないときは全部サーチしなきゃだから、やっぱりハシュに入れちゃった方が効率よさそうですね。
0053nobodyさん
05/01/31 17:52:56ID:sSr/NKoB知りたいのですが、どう書けばよいのでしょう?
system で、ls -l した結果を切り貼りすれば、とりあえずできそうなのですが、
もう少し何か方法がありそうな気がしまして。
0054nobodyさん
05/01/31 18:04:55ID:???マジかよ!?
何でそんなセキュリティホール量産体制を作っちゃうのよ?
ユーザが送ってきた文字列を正規表現に使う前にサニタイジングしないと
いけないなんて面倒じゃないか?
っていうか何のメリットがあってそんな仕様なんだ?
0055nobodyさん
05/01/31 18:10:49ID:???0057nobodyさん
05/01/31 20:39:27ID:8ZuDaXBy「/ほげほげ」という文字を消したいんですよ。
$line =~ s|/ほげほげ||g;
↑で消えないんですが、どうしてって気持ちです。
「ほげほげ」だけなら↓で消えるのですが。「/」←コイツ(全角)が消えないのです。
$line =~ s|ほげほげ||g;
どうしてご存じかいませんか?
0058nobodyさん
05/01/31 20:40:18ID:8ZuDaXBy0059nobodyさん
05/01/31 20:44:59ID:???か?
0060nobodyさん
05/01/31 20:46:01ID:???こうだったか…orz
0061nobodyさん
05/01/31 20:56:16ID:???別の話になるが、マッチするしないは見た通りと一致しないこともある。
暇があったらこういうのも読んでおくといい。
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:???>っていうか何のメリットがあってそんな仕様なんだ?
多分、\Q と \E をタイプする程度のことに文句を言うユーザを
排除しようとしたんじゃないかな。
0065nobodyさん
05/01/31 21:52:09ID:ZqzhsiuTSJISで書いただけじゃねーの?
「/」は815eだから正規表現のメタ
文字の「^」を含むので。
use encodengする場合除いてSJISで
スクリプト書くとはまるからやめた
方がいいと思う。
0066nobodyさん
05/02/01 01:04:11ID:???プログラムの冒頭に書いてあるこれはどういう意味でしょうか。
0067nobodyさん
05/02/01 01:09:11ID:ViOttCyfperlvar(1)よめ
0068nobodyさん
05/02/01 09:48:19ID:???こういう場合って345はどこへいくんですか?
テストしたら$a==1,$b==2でしたので、$bの中身が後続で上書きされ続ける
ような動作はしないことを確認しました。
メソッドからの返り血が複数で合った時に受け取り側ではリストを用意さえすれば
リストの数が合わなくても前列のみが必要な時は通用するんですね。
0071nobodyさん
05/02/01 12:36:12ID:???($x, undef, $y) = foo();
と
($x, $y) = (foo())[0,2];
のどっち使いますか?
私は拾う値が少ないときは後者、捨てる値が少ないときは前者で
ビミョーなときはなんとなく気分で使い分けなんですが。
0072nobodyさん
05/02/01 12:57:50ID:???最後が 2 番目だという保証もないので前者でしょ。
0073nobodyさん
05/02/01 12:59:01ID:???0074nobodyさん
05/02/01 14:57:15ID:HcuaG0EwPerlメモにある
$str =~ s/(\W)/'%' . unpack('H2', $1)/eg;
このスクリプトはeucを前提にしてるようですが
Shift_JISでは間違った置換をする可能性がありますか?
基本的には大丈夫なような気がするんですが;
一応まだ間違う瞬間を見つけれてませんし・・・
不安なので宜しくお願いしますm(_ _)m
0075nobodyさん
05/02/01 15:29:34ID:???というケースが多数出てきそう
実用上は支障なさそうだが
はたしてそれって「正確にURIエスケープ」したと言ってよいものなのか?
007674
05/02/01 15:49:54ID:HcuaG0Ewやはりそういうことが起きるのですかorz
Shift_JISの文字列を正確にURIエスケープするのは無理なのでしょうか?
>実用上は支障なさそうだが
・・・?
あ、もしかしてエスケープする時点でバイトの途中で区切られても大抵の
アンエスケープ処理後に何の問題も起こらないということですか?
それならうれしいのですが・・・・
007874
05/02/01 17:25:29ID:HcuaG0Ewそれなら安心です。
ありがとうございましたm(_ _)m
0079nobodyさん
05/02/01 18:36:33ID:???ひとつ前の文字が [\x81-\x9f\xe0-\xfc] の範囲なら [\x40-\x7e] も置換する、とか。
0080nobodyさん
05/02/01 19:20:22ID:???backgroundでは駄目なんでしょうか?
0081nobodyさん
05/02/01 19:22:07ID:???evianでは駄目なんでしょうか?
0082nobodyさん
05/02/01 20:59:16ID:???0083nobodyさん
05/02/01 23:18:19ID:???2, 真性の馬鹿
3, 実はインド人だ
0084nobodyさん
05/02/02 00:09:28ID:hjWjou/0今gazou.cgiの直下にgazouフォルダがあり中にはn個のjpg画像があります。
これをgazou.cgiが呼ばれたら、jpg画像があるだけ(n個)htmlで出力したいのですが
どう書いたらいいのでしょうか?ちなみに10個ごとに改行を入れたいのですが、そういうことは可能なのでしょうか?
もしよろしければご教授ください。
0085nobodyさん
05/02/02 01:14:46ID:???あるディレクトリに入っているjpgファイルの一覧ページを作りたいのなら可能。
自分でできるだけのことをやって、行き詰まってからまたおいで。
0086nobodyさん
05/02/02 01:42:57ID:???4時間かけてやっとhello.cgiを動かした俺。
てめぇらなんかに負けるものかぁぁぁぁぁぁぁぁぁてかハラヘッタァァァ
008884
05/02/02 03:00:32ID:hjWjou/0require './jcode.pl';
$dir = "./img/";
$title = "画像リンク";
opendir DIR, $dir;
@files = grep { !m/^(\.|\.\.|Thumbs\.db)$/g } readdir DIR;
close DIR;
if ( @files ) { &htmlheader;
exit;}
sub htmlheader {
$GAZOU = "画像";
$p= <<"HTML";
<HTML><HEAD><TITLE>$title</TITLE></HEAD><BODY>
HTML
&jcode'convert(*p,'sjis');
&jcode'convert(*GAZOU,'sjis');
print "Content-type: text/html\n\n";
print $p;
foreach $a (@files){
$a =~ s/\.jpg//g;
print "<a href=$dir$a>$GAZOU</a><br>";
}
print "</body></html>";
}
>>84ですが一応あるディレクトリに入っているn個のjpgファイルへのリンク集を作ることはできました。上の汚いソースがそれです。
ですがたとえば10個ごとに改行を入れることや、100個ごとにべつのファイルを作成といったことはできるのでしょうか?
見当がつかなくここの先輩方にご教授いただけたら幸いです。
0089nobodyさん
05/02/02 03:47:54ID:???後は、条件分岐でごにょごにょと指定するだけ。
0090nobodyさん
05/02/02 08:38:32ID:???#!/usr/bin/perl
$w=10;
print join"\n",'Content-Type: text/html','','<table>',map('<tr><td>'.
join('</td><td>',@$_).'</td></tr>',do{$otakara[$i/$w][$i++%$w]=
qq{<img width="80">}while<img/*.jpg>;@otakara}),'</table>';
0091nobodyさん
05/02/02 09:28:59ID:???@array[-1]
確か以前にマイナス値を与えると逆から数えると読んだのですが、今探しても
そのソースが見つからないのでお願いします。
一応動作はうまくいってますが、@array[$#array]とは違う働きをする瞬間が
存在したら怖いので賢者に聞きにきました。
0092nobodyさん
05/02/02 11:16:14ID:???http://www.kt.rim.or.jp/~kbk/perl5.005/perldata.html#Variable_names
http://www.kt.rim.or.jp/~kbk/perl5.005/perlfaq4.html#What_is_the_difference_between_
http://www.kt.rim.or.jp/~kbk/perl5.005/perltrap.html#General_data_type_traps
009391
05/02/02 11:25:02ID:???私が思っているほど-1についての動作は単純じゃないんでしょうかorz
009484
05/02/02 11:27:46ID:???ありがとうございます。これからいろいろ試してみたいと思います。
>>90
わざわざコードをかいてもらって本当ありがとうございます。
これから解読しつつ試してみたいと思います。
0096nobodyさん
05/02/02 13:11:44ID:???配列の添え字が負であったとき、それは配列の終端から数えられるようになりました。
@a = (1, 2, 3, 4, 5);
print "The third element of the array is $a[3] also expressed as $a[-2] \n";
# perl4 の出力: The third element of the array is 4 also expressed as
# perl5 の出力: The third element of the array is 4 also expressed as 4
つまりPerl5からは-1と$#arrayは同じ作用をするってこった。
まあ巷のPerlはほぼ5だから気にせず使えよバカ。
0097nobodyさん
05/02/02 16:36:20ID:43fDDoaTforeachなどのループ文を書くときによく何回目のループかを知りたくて
my $i = 0;
foreach.....$i++;.....
のようにして$iを使用しますよね。
これはきっと昔から使われている手法だと思います。
でもちょっと面倒ですよね。
そこで思ったのですが、何故にデフォルトで何回目のループかを専用の特殊変数
に代入するような仕様にならないのでしょうか?
例えば
@+R
などを作って内側から1つ目のループが何回目かを調べる時は
$+R[0]
で、こういう感じで実装してあると結構便利だと思います。
まあ何故に仕様がこうであるかはここで言ってもしょうがないですし、
素人の脳みそでは理解できない事情があるのかもしれません。
こういう特集変数めいたものを自分で作ることは可能でしょうか?
例えばhogeモジュールをuseすれば自動的にそういう特殊変数が作成されるような。
しょうもないことですがあると便利だと思うんですよね。
0098nobodyさん
05/02/02 16:45:17ID:???010197
05/02/02 17:39:48ID:43fDDoaTパフォーマンスの問題でしたか。
そうですよね;
>>99
for以外のループ文でも使えないと・・・・・
それに汚いですよね。
>>100
どういうことですか?whileだけ特殊変数が用意されてるんですか?
ちょっと特殊変数一覧見直してみますm(_ \)m
0103nobodyさん
05/02/02 18:09:14ID:???010484
05/02/02 21:19:40ID:???0105nobodyさん
05/02/03 01:49:12ID:???#施錠
$try=3;
while(! rename('off.loc','on.loc')){
if(--$try <= 0){die;}
sleep(1);
}
#解錠
rename('on.loc','off.loc')
ただ、これでは施錠してから解錠する間にプロセスが逝った時施錠されたままになってしまいますが、
そこで、最後にrenameした時間を求めるにはどうすればよいのでしょうか
0106nobodyさん
05/02/03 03:31:38ID:???http://www.din.or.jp/~ohzaki/perl.htm#File_Lock
0107nobodyさん
05/02/03 13:38:41ID:???cpan検索するとないわけではなくて結構たくさん出て来
るんだがどれがいいんだかよくわからん。
でもhttpで何かゲットというとLWP使えって速攻で返って
くるのに、ロックだとそういうの見たことないし、実は
どれもあまりよくないというオチだろうか?
0109nobodyさん
05/02/04 03:38:45ID:???0110nobodyさん
05/02/04 12:26:33ID:O0itZOq3では配列を取り出し名がらやるにはどうやるんですか?
■ このスレッドは過去ログ倉庫に格納されています