Perlコーディング初心者質問スレ Part 40
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/01/27 18:08:42ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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では配列を取り出し名がらやるにはどうやるんですか?
0111nobodyさん
05/02/04 12:47:46ID:???@array = (1,2,3,4,5);
for ($i=0; $i<=$#array; $i++) {
print $array[$i];
}
0112nobodyさん
05/02/04 13:42:59ID:???きょうび、flockが動かないサーバーなんてあるか?
flockの仕様がやや使いづらい、というのなら分かるがな。
そういう意味ではPerlメモで紹介しているmkdirによるlockを使うことも十分あり得る。
0113nobodyさん
05/02/04 18:09:07ID:???以下のように書いても動きませんでした。
何が間違ってるか教えてください。
#!/usr/local/bin/perl
require 'extlib/LWP/Simple.pm';
use LWP::Simple;
$doc = get('http://www.xxx.com/xxx/test.html');
$filename = "./data/test.html";
open( FH , ">$filename" );
print FH $doc;
close( FH );
exit( );
__END__
0115nobodyさん
05/02/04 18:51:19ID:???require 'extlib/LWP/Simple.pm';
と書く芸風ははじめてみたがそれは置いといて、
$doc = get('http://www.xxx.com/xxx/test.html');
defined $doc or die "cannot get";
と
open( FH , ">$filename" ) or die "cannot open: $!";
ぐらいはしろよ。どこでだめになったかさっぱりわからんだろ。
0116nobodyさん
05/02/04 20:43:55ID:???0117nobodyさん
05/02/04 20:51:29ID:3semSWSAWeb板の内容でしたらすいません。
print "<SELECT NAME=\"nenrei\">\n";
print "<OPTION VALUE=\"10\">10\n";
print "<OPTION VALUE=\"20\">20\n";
print "<OPTION VALUE=\"30\">30\n";
print "</SELECT>\n";
と表示させ、事前にselectedで選択させるのではなく、後から変数の値
を参照し、変数値が10だったら10を、20だったら20を、30だったら30を
選択した状態にしたいのですが、良い方法はないでしょうか?
0118nobodyさん
05/02/04 20:54:33ID:???選択状態にするには、次のようにselected を付ける。
<option value="value" selected>
0120nobodyさん
05/02/04 21:03:46ID:???条件分岐して selected 付きprintしたりしなかったりしたりしなかったりしたりしなかったりしたりしなかったり…
すればいいんじゃないの?
0121nobodyさん
05/02/04 21:05:00ID:???print qq{<OPTION VALUE="10"$hoge{10}>10\n};
以下略
"をエスケープするのは個人的に好きじゃない
0122nobodyさん
05/02/04 21:07:13ID:???print qq|<option value="$_"|;
print qq| selected| if $str eq $_;
print qq|>$_</option>\n|;
}
こうかな?
0124nobodyさん
05/02/04 21:11:59ID:???cgiの入力フォームで送信ボタンを押した後など
ブラウザでリロードを行うと同じ処理が繰り返し行われてしまいます
そのせいで、例えばリストの中の2番目のデータを削除していた場合
リロードの度に新しく2番目となったデータが削除されていってしまうのですが
こういった場合に、ある程度経験のある方は
どのようなやり方で解決しているのかお伺いしたいのですm(__)m
0125nobodyさん
05/02/04 21:15:56ID:2GvnZ25o2chの書き込み後の処理をまねてみるとか。。
0126nobodyさん
05/02/04 21:22:44ID:MsfARYCJrefreshを使いなさいという事です。
頑張って下さい。
0127nobodyさん
05/02/04 21:25:30ID:???require 'extlib/LWP/Simple.pm';
と書く不思議コーディングはははじめてみたがそれは置いといて、
dataディレクトリがないだろ。
0128nobodyさん
05/02/04 22:19:37ID:???1.locationやrefreshで飛ばしてブラウザにGETメソッドを記憶させる。
2.最後の投稿を記録しておいて、二重投稿(この場合削除)をチェック。
3.削除する前に確認画面を出す。
4.固有の番号指定で削除するようにする。
0129124
05/02/04 22:21:56ID:???2chの書き込み後の処理というのは、やはり入力フォームと表示部を分けるということでしょうか
確かにそれが一番いいのかもしれませんね
でもできればフォームと一体型で、根本的な解決方法がないものか気になるのでもう少しこのまま頑張ってみます
ありがとうございましたm(__)m
>126
refleshというものがあるのですね
これから検索をして勉強してみたいと思います
ありがとうございましたm(__)m
0130124
05/02/04 22:25:16ID:???おお、具体的な方法を4つも教えて頂いて本当に感謝です
1番目の方法だけまだ勉強不足で分からないので、いろいろ試してどの方法が一番いいか考えてみます
本当にありがとうございましたm(__)m
0131nobodyさん
05/02/04 22:57:25ID:???そういえばどこかの掲示板の作者がサポートの質問で
で二重投稿になるのは仕様だとバカみたいなこと平気で言ってたな
0132nobodyさん
05/02/05 00:13:26ID:???1はよく使われるけど、ボタンの2度押しは防げないよね。
手軽で便利なんだけど。
0133nobodyさん
05/02/05 00:21:40ID:KAYC+D6O確実じゃないかと。
0134nobodyさん
05/02/05 01:11:51ID:???$tbl[0][0] = "00";
$tbl[0][1] = "01";
$tbl[1][0] = "10";
$tbl[1][1] = "11";
print "<TABLE BORDER=1>\n";
foreach $value (@tbl) {
print " <TR>\n";
foreach $value2 (@value) {
print " <TD>$value2</TD>\n";
}
print " </TR>\n";
}
print "</TABLE>\n";
何もでてきません
何がだめなんでしょうか?誰か教えてください・・・
0136nobodyさん
05/02/05 01:44:54ID:???二次元の読み出し方も間違っているが仮に読み出せたとして
$valueはどこで使われてるのよ?
表示させる@valueっていったい何よ?
0137nobodyさん
05/02/05 02:21:14ID:???0138nobodyさん
05/02/05 02:28:27ID:???0141nobodyさん
05/02/05 02:45:38ID:???0142137
05/02/05 02:51:46ID:???0143nobodyさん
05/02/05 03:17:56ID:???Perlの起動が上手くいきません…
XPでPerlのVerは5.8.3です
とりあえずデフォルトでインストールは終わったのですが
コマンドプロンプトを開くと即閉じてしまいます。
サイトみてもXPの説明が…
0144nobodyさん
05/02/05 03:28:41ID:???スレ違いです。
△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0145nobodyさん
05/02/05 03:30:56ID:???0148nobodyさん
05/02/05 05:41:11ID:???とりあえず2個目の foreach の @value を @$value に変えて正常に出力されるのを確認したら、
http://www.google.co.jp/search?hl=ja&q=Perl+%E9%85%8D%E5%88%97%E3%81%AE%E9%85%8D%E5%88%97
で勉強してくれ。
>>147 なんつーか…
print'<table>',(map{('<tr>',map("<td>$_</td>",@$_),'</tr>')}@tbl),'</table>';
0149nobodyさん
05/02/05 17:35:50ID:???if ($name = ~/fusianasan/){
$name = ~s/fusiansan/<strong>$host<\/strong>/
}
注)$name…名前欄の文字列 $host…$ENV{'REMOTE_HOST'}
とすると、名前欄にfusianasanが入っていてもいなくても
名前欄が4294967295になってしまいます。
また、同様に
foreach (@post_check_list){
~ s/</</gi;
~ s/>/>/gi;
~ s/\r\n/<br \/>/gi;
~ s/\r/<br \/>/gi;
~ s/\n/<br \/>/gi;
~ s/"/&guot;/gi;
~ s/&/&/gi;
~ s/\0//g;
${"$post_check_list2[$i]"} = $_;
$i++;
}
注)@post_check_list = (\$name ,\$mail, \$honbun…
$nameは名前欄、$mailはメール欄、$honbunは本文
@post_check_list2 =('name', 'mail', 'honbun'…
とするとメール欄などが全てREF(0x814d354)となってしまいます。
文字コードはeucなのになぜなのでしょうか…知っている方ご教
授いただければ幸いです。
0151nobodyさん
05/02/05 17:52:11ID:???fusianasanのほうは他の処理に原因があるのだろう。
@post_check_listは中身がリファレンスなんだから当然の結果。
eucとかそういう話は無関係。
0152nobodyさん
05/02/05 18:36:20ID:???日本語をwriteすると文字化けるというのは仕様でしょうか?
#以下ソース
$hoge = 'test1';
$hoge2 = 'あ';
format STDOUT =
TITLE : @<<<<<<<<<<
$hoge
TITLE2 : @<<<<<<<<<<
$hoge2
.
write (STDOUT);
#$hoge2が化けてます。
0153nobodyさん
05/02/05 18:42:39ID:???if ($name = ~/fusianasan/){
$name = "<strong>$host<\/strong>";
}
0155nobodyさん
05/02/05 19:50:46ID:???if ($name = ~/fusianasan/){
$name = "<strong>$ENV{REMOTE_HOST}<\/strong>";
}
0156nobodyさん
05/02/05 19:54:28ID:???つか、漏れの借りてる鯖は$ENV{'REMOTE_HOST'}禁止なんだよね。
0157nobodyさん
05/02/05 19:55:01ID:???でもいいな。
0161未承諾広告※ ◆TWARamEjuA
05/02/05 21:13:22ID:???0162149
05/02/05 21:15:54ID:???ありがとうございました。スペースを削除したら上手くいきました。
>>151
リファレンスにせずに、普通に
@post_check_list = ($name ,$mail, $honbun…
としたら上手くいきました。ありがとうございます。
>>155,>>157
それだと、名前欄に「ほげほげ fusianasan」などと入れたときに
ほげほげが消えてしまいます。
0163nobodyさん
05/02/05 21:39:54ID:???勘違いしてるみたいだけど、~ は正規表現の先頭に付ける文字じゃないからね。
後半のソースは左辺値がないからたまたま期待通り動いてるだけ。
どういう意味があるのかは調べてみてください。
0164nobodyさん
05/02/05 22:35:02ID:???$name = ~/fusianasan/;
これは
$name = (~($_ =~ m/fusianasan/));
と同じ意味。
0165nobodyさん
05/02/05 23:56:22ID:5Rr9/6OZprint << " END_OF_PRINT";
処理
END_OF_PRINT
って書くけど、
こんな時に処理部に例外処理が沢山あって
print << " END_OF_PRINT";
処理A
END_OF_PRINT
print << " END_OF_PRINT";
処理B
END_OF_PRINT
・・・
ってな感じで細かく使わないといけないけど普通のprint文を使うまでも無いって時はどうしてる?
なんかソースが汚く見えるんだよね。
0166nobodyさん
05/02/05 23:58:48ID:???意味わかんないんだけど。
スペースも意味わかんない。
■ このスレッドは過去ログ倉庫に格納されています