Perl コーディング初心者質問コーナー Part35
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
04/05/26 16:48ID:kkhhiYmo【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0809nobodyさん
04/07/07 16:32ID:???1: abc:123
2: aiu:456
3: abc:123
4: aiu:456
5: abc:123
open(IN, "list.txt");
while (<IN>) {
$tmp .= $_;
}
print "$tmp\n";
0811nobodyさん
04/07/07 16:46ID:???open(IN, "list.txt");
while ($tmp = <IN>) {
print "$tmp<br>\n";
}
close(IN)
暗黙の$_使うか明示的に一時変数$tmpを使うか、だけの違いだろ。
>>808
間違ってるよね
0813nobodyさん
04/07/07 17:04ID:???0814nobodyさん
04/07/07 17:42ID:???0815801
04/07/07 17:54ID:Dj0xztEmこの方法、他にないんでしょうか?
0817nobodyさん
04/07/07 18:12ID:???0818801
04/07/07 18:17ID:Dj0xztEm変数を送る部分を、
クリックしなくても変数を送れるようにしたいんです。
意味分かりますかね?perlの超町長初心者なんで勘弁してください。
どうかよろしこです
0819nobodyさん
04/07/07 18:36ID:???perlの問題じゃないです。
要は【submit】ボタンを押さなくても、submitされるようにしたいって事?
JavaScriptとかで勝手にクエリ送るとかか?
やっぱ、perl関係ないです。
0820nobodyさん
04/07/07 18:37ID:???ちゃんと持ってるもの全部吐き出してください。
0821黒死犬 ◆EgxBlf8nvc
04/07/07 18:39ID:???<input type="hidden" name="Name" value="Value">
</form>
<script language="PerlScript">
$window->document->all->forms->send->submit();
</script>
これで出来んじゃないか(テストしてない)
てか板違い
0822nobodyさん
04/07/07 18:42ID:???ユーザ側の視点だと「自動的」「クリックしなくても」で済むんだろうけど、
プログラムにとっては「ある条件が満たされたとき」じゃない?
その「ある条件」は、あなたしか知らないわけですよ。
# で、JavaScriptで何かしらのイベント拾うんだろーけど。
0824nobodyさん
04/07/07 20:13ID:???・・・何故お前が皆に叩かれてるのか未だに分かってないのか???
下の二つを実行してみなさい。そして首吊ってください。
# 1
while (<IN>) {
$tmp = $_;
print "$tmp\n";
}
# 2
while (<IN>) {
$tmp .= $_;
print "$tmp\n";
}
0825nobodyさん
04/07/07 20:39ID:???@d = ( " abc ", " bcd ", " cde " );
for($i=0;$i<@d;$i++){ $d[$i] =~ s/^\s*(.*)\s*$/$1/; }
これをもうちょっとスマートに書いてみたいですが
どしたらいい? for文ははずせないのかな
0826黒死犬 ◆EgxBlf8nvc
04/07/07 20:45ID:???0828nobodyさん
04/07/07 21:40ID:???何で俺にレスしてんの?
しかもみんなって・・・
日本語理解してるか?
ついでいっとくと俺は質問者でも解答者でもない。愉快な煽り厨
0829nobodyさん
04/07/07 21:40ID:???お前大丈夫か?
どこが叩かれてるんだ?>>810は・・・
レス一つもないじゃん。
まさか勝手に前の人と同じと認定してるとか?
0832nobodyさん
04/07/07 21:59ID:???ググっても使用例が見つからなくて困っています。
0833nobodyさん
04/07/07 22:09ID:???もっとググれ
0834nobodyさん
04/07/07 23:02ID:???http://www.google.co.jp/search?hl=ja&ie=UTF-8&c2coff=1&q=Perl+%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%A2%E6%95%B0&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
PHPしか出てきませんが・・・
0835nobodyさん
04/07/07 23:07ID:???ttp://www.google.co.jp/search?q=Perl+-PHP+%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3&ie=UTF-8
( ゚д゚)ポカーン
0837nobodyさん
04/07/08 00:41ID:???0838nobodyさん
04/07/08 03:00ID:???<q cite="http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html">
戻り値をただ単に捨ててしまうような void 文脈で、grep()やmap()、
`backticks` (訳注: `ls`のようにバッククォートで括った実行文のこと)
を使うことは避けましょう。そういった関数はすべて戻り値を持って
いるのですから、それを使うべきです。戻り値に用がないのであれば、
代わりにforeach()を使ったループか system()関数を使いましょう。
</q>
>>825
s/^\s+//, s/\s+\z// for @d;
0839nobodyさん
04/07/08 03:04ID:LQirb/WJwindowsで他のサーバのディレクトリを
ネットワークドライブに割り当て
その中のファイルに対して
-e を実行したらエラーしか返ってきません。
自分のサーバ内なら正常にファイルを検知できたのですが
ネットワークドライブはファイルの検査ができないのでしょうか?
$Path="d:/data/"
$Data="test.dat"
if(-e "$Path$Data")
0840nobodyさん
04/07/08 03:04ID:o03xV6akdo $line = <FILE> until (($line eq "<HOGE>") || (eof FILE));
だと$line eq "<HOGE>"がいつまでも真になりません。
$line =~ /<HOGE>/だと真になってくれますが、「含まれる行」ではなく「一致する」行を検出したいのです。
上のやり方だとなぜ出来ないのでしょうか?
0841nobodyさん
04/07/08 03:34ID:???do { chomp($line = <FILE>) } until $line eq "<HOGE>" || eof FILE;
do { $line = <FILE> } until $line eq "<HOGE>\n" || eof FILE;
0842nobodyさん
04/07/08 03:38ID:???$line =~ /^<HOGE>$/
0843840
04/07/08 04:02ID:???回答ありがとうございます。しかしそれでも解決しませんでした・・・
がその後自己解決しました。
アップロード時の文字コード変換が原因で認識しなかったようです。
# 最近HDが吹っ飛んでOSアプリすべてを再インストールしたために、FFFTPの転送設定が正しくなされてませんでした
<FILE>をアスキーモード転送でアップしたところ正しい挙動になりました。
0844nobodyさん
04/07/08 08:07ID:???だれも指摘してないが、その置換では末尾の空白は
とれないよ。先に.*の方に食われちゃうので。838は
黙ってさりげなく直しちゃってるけどな(笑)
0846nobodyさん
04/07/08 11:32ID:lii7HGr3PCやドコモの携帯では普通に書き込めていましたが、auで試したら、
書き込んだ内容がURLエンコードされたまま書き込まれてしまいました。
なぜでしょうか。
書き込まれた内容 : %92x%82%ea%82%c4%83X%83%7d%83%93
デコード処理部分
sub getparam{
my($QUERY_DATA,@pairs,$pair,$key,$value,%FORM);
if($ENV{ 'REQUEST_METHOD' } eq "POST"){
read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});
}
@pairs = split(/&/,$QUERY_DATA);
foreach $pair (@pairs){
($key,$value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/"/"/g;
$value =~ s/&/&/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/\r\n|\r|\n//g;
$value =~ s/\,/、/g;
$value =~ s/\t//g;
$FORM{$key} = $value;
}
return(%FORM);
}
0848847
04/07/08 11:39ID:???0849nobodyさん
04/07/08 13:09ID:???自分のスクリプトから欠陥を見つけられないならauの方の糞さを疑ったらどうだ?
三菱から欠陥を見つけられないなら乗り手の方の糞さを疑ったらどうだ?
0850nobodyさん
04/07/08 13:26ID:???よく眺めてみるのがいいかもね。
0851nobodyさん
04/07/08 13:29ID:???横軸が等間隔じゃないデータは
扱いにくそうだな
ほかにグラフ描くいいライブラリないかな
0852nobodyさん
04/07/08 14:03ID:???独り言の前にCPAN
http://search.cpan.org/search?m=module&q=Graph&n=100
0853nobodyさん
04/07/08 14:09ID:???http://pc5.2ch.net/test/read.cgi/php/997829243/
の方がベターと思われる
0854nobodyさん
04/07/08 16:34ID:???http://developer.apple.com/internet/webcontent/xmlhttpreq.html
これ使えばいけるかもね
0855nobodyさん
04/07/08 17:51ID:fxJBz/QH#!/usr/local/bin/perl -Tw
use strict;
my $data = './data.dat';
open COUNTER, "+<", $data or die "$data:$!";
my $count = <COUNTER>;
$count += 1;
seek COUNTER, 0, 0;
print COUNTER $count, "\n";
close COUNTER;
#html排出
print "$count";
exit;
なんどやっても、おかしいと思うところやタイプミスを直しても動きません(Internal Server Error)
どこが間違っているのでしょうか?勉強後初プログラミングなもんで…
ご教授よろしくお願いしますm(_ _)m
0856nobodyさん
04/07/08 18:01ID:???cgiのパーミッションは755
datのパーミッションは777
です。よろしくお願いします
0858nobodyさん
04/07/08 18:11ID:???速レスありがとうございます。
-Twが間違っているのですか
あの、よろしかったらどのようにすればよいのか教えていただけないでしょうか?とりあえず抜いてみたのですが、事態は変わらず…
0861nobodyさん
04/07/08 19:59ID:???ヘッダ書け。
#!/usr/local/bin/perl
use strict;
my $data = './data.dat';
open COUNTER, "+<", $data or die "$data:$!";
my $count = <COUNTER>;
$count += 1;
seek COUNTER, 0, 0;
print COUNTER $count, "\n";
close COUNTER;
#html排出
print "Content-type: text/html;";
print "$count";
良心で書いてやったぞ(藁
0862nobodyさん
04/07/08 20:14ID:???まともにエラーも確認できないようじゃ、大変だよ。
見られない環境なら↓こんなんもあるし。。。
http://www.kent-web.com/utility/index.html
0863nobodyさん
04/07/08 20:21ID:UcZ/C4OX$testdat = 'c:/Program Files/Apache Group/Apache2/cgi-bin/test.dat
open IN, $testdat or die "$!\n";
while(<IN>){
chomp;
$record{(split(/<>/,$_))[0]} = $_;
}
print (((sort keys %record))[-1]);
でテストすると、syntax error at test1.cgi line 8, near "open "
Execution of test1.cgi aborted due to compilation errors.
が、出てしまいます、これはどこを縦・・・じゃなくて
どうやって原因をつきとめていったらいいのでしょうか?
0864名無しさん@Linuxザウルス
04/07/08 20:29ID:3Hvq7uliあったら最初は楽しいかもしれんが、ウダイだろ
0865863
04/07/08 20:34ID:7oRlGTHBperl -cw test1.cgi
で出てきたものです。
0866名無しさん@Linuxザウルス
04/07/08 20:37ID:3Hvq7uliかえしてくれるやつを作るとしたら
まず何をすればいいのでしょうか?
0867863
04/07/08 20:44ID:7oRlGTHBnear "open " のところがわかりません。
近いっていったいなにが?って感じです。
0868nobodyさん
04/07/08 20:49ID:???0869nobodyさん
04/07/08 20:51ID:???0870nobodyさん
04/07/08 21:05ID:???よくWebサイトに『〜〜100の質問』ってありますよね。
あれを簡単にHTMLで出力できるようなCGIを作ってるのですが
うまくうごかなかったので、質問させてください。
処理の流れは以下の通りです。
1.テキストファイルから質問を読み込む
2.質問を一度表示させる。その際、1つの質問に対して1つのテキストエリアをつける(sub quesView)
3.テキストエリアに回答をいれ、一番最後に出力というボタンをおすことにより、HTML出力のサブルーチンに移動(sub sub regist)
4.HTML出力
質問を読み込んで出力できているのですが
HTML出力するときのサブルーチンにうまく移行できていないみたいなのですが
どうあがいてもうまくいきません。
よかったらご教授いただけませんでしょうか?
【サンプル】
ttp://cgi.www5f.biglobe.ne.jp/~c-fellow/cgi-bin/04_test/100/100q.cgi
【ソース】
ttp://www5f.biglobe.ne.jp/~c-fellow/cgi-bin/04_test/100/100q.zip
ソースはコピペだらけで、汚いと思いますが、宜しくお願いします。
0871名無しさん@Linuxザウルス
04/07/08 21:17ID:???開店前の銀行がどうしたんだ?
0873nobodyさん
04/07/08 22:18ID:???自分のソースを読み直してくれ。
$testdat = 'c:/Program Files/Apache Group/Apache2/cgi-bin/test.dat
これはどう見てもopenの前にあるよな?
0874nobodyさん
04/07/08 22:19ID:???なぜ、このような文法が許されるのですか?
unless($_) { $_=undef; } と書かないのはなぜですか?
0876nobodyさん
04/07/08 22:22ID:???そのようにPerl上で定義されてるから。
> unless($_) { $_=undef; } と書かないのはなぜですか?
ここではunless($_)より$_を解放する処理が有るということの方が重要だから。
0877nobodyさん
04/07/08 22:51ID:???0879nobodyさん
04/07/08 23:00ID:???sub Form_Input {
my($buffer,@pairs,$value,$name);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs =split(/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$input{$name}=$value;
}
}
を最後の行にぶち込み、%Form_Input(); を条件分岐(# メイン処理 つーところ)の前で呼びだし、$mode を $input{'mode'} に変更し、
サブルーチン、registを、
sub regist {
&header;
print "$buffer";
&footer;
exit;
}
とすればとりあえず動く。長くてスマソ。
0881nobodyさん
04/07/09 01:31ID:???0883nobodyさん
04/07/09 02:16ID:???0886nobodyさん
04/07/09 02:27ID:???俺も>>882見た瞬間に
「なんでそうつなげるんだろ?面白い人だなぁ」
と思ったんだけどな。
俺も必死杉な質問者扱いされる仕様なのか…。
# このスレ、どうなっとるんだ?
>>866
% vi ~/tateyomi.pl
0887870
04/07/09 08:45ID:???レスありがとうございます。
ご指摘があった箇所を書き換えたところ、一応動きました。
が、$bufferが書き出されません・・・。
sub Form_Input の処理というのは
Formデータを読み込んで$bufferにいれ
それを&で切り分けたものを@pairsにいれる。
@pairsに入れたものを=でさらに分けて、$nameと$valueにいれる。
$valueに対してデコード処理。
で合ってますか?
これならば、$bufferは生データが表示されるはずですよね・・・。
(´ヘ`;) う〜ん・・・
もうちょっと頑張ってみます。
0888nobodyさん
04/07/09 11:39ID:???%Form_Input();じゃなくて&Form_Input();だよな。キー隣だもんな。
>>870
ソース見れないので、間違ってたらスマソ。
print $input{'1'} ;
にするとどうなる?
0889863
04/07/09 11:42ID:???朝起きて、もう一度みたら気が付いた・・・・。
>>880以降の人たち
漏れには0時過ぎに起きて2ちゃんやれるほどの元気はないぞ・・・いいな若いって。
0890nobodyさん
04/07/09 11:44ID:6LTGfdJzif ($aaa_tel eq $bbbtel){print "同じ電話番号が存在します。";}
こうしたソースで、$aaatelが0123-45-6789の場合、$bbbtelの中が
0123456789や、01-2345-6789、012-345-6789、012-345-6789
0123-45-6789、01-2345-6789なども
同じ番号と判定して警告を出すためには、どのように書き直した方が
いいのでしょうか?
0892nobodyさん
04/07/09 12:04ID:???とかやった上で比較するわけだな。
一般には「正規化」と呼ばれる。
0893890
04/07/09 12:05ID:6LTGfdJz0894nobodyさん
04/07/09 12:11ID:???0897nobodyさん
04/07/09 13:37ID:???1. 双方とも全角→半角する。Encode でも Jcode でも。
2. 双方とも tr/0-9//d; にする。
3. 双方を比較する。
4. おしまい。
0899nobodyさん
04/07/09 17:20ID:???%table = ('A' => '5',
'B' => '10',
'C' => '8',
'D' => '13');
sub number {
if ( $table{$a} > $table{$b} ) {
return 1;
}
elsif ( $table{$a} == $table{$b} ) {
return 0;
}
elsif ( $table{$a} < $table{$b}) {
return -1;
}
}
foreach $KEY (sort number values %table){
print "It's $KEY \n";
}
上記のプログラムを実行したところ、tableの値がソーティングされておらず、しかもデバッグにより、サブルーチン内の$aと$bに値が入っていないことが解りました。時分でも減員を調べたのですが解らなかったので、教えて頂けませんでしょうか?
0900nobodyさん
04/07/09 17:51ID:???foreach( sort{$table{$a} <=> $table{$b}}keys %table){
print "It's $_ \n";
}
何してるんだか、どっから説明すればいいんだか、
なんで何の為にこねくり回してるんだか
0901nobodyさん
04/07/09 18:03ID:???| | __,-'ニニニヽ . | |
.. | `、ヽ ヾニ二ン" / |
| ヽ\ / |
AA略
誤字は誤字であると見抜ける人でないと
(Perlのコーディングは)難しい
0902nobodyさん
04/07/09 18:55ID:???cgiを通してネット上のファイルを書き換えてレンダリング、というのをやりたいんですが、
同じサーバーのものしか扱えなくて困ってます。
0903nobodyさん
04/07/09 19:40ID:???0905nobodyさん
04/07/09 20:00ID:???どういうものを想像してるのかわかんないんですが、
ファイルを書き換えて保存するわけじゃなくて、
ファイルを読み込んで、書き換えたものをレンダリング、です。
電波ニュースとかご存じないでしょうか。あんな感じなんですが。
0907nobodyさん
04/07/09 20:43ID:???相手がhttpならLWP使って読めばいいんじゃねーの?
変数なりなんなりに中身入っちまえば後は煮るなり
焼くなり好き勝手すりゃいいわけで。
0908nobodyさん
04/07/09 21:08ID:???でも、素人はperl使っててください、お願いだからPHP使わないでね^^
レス数が900を超えています。1000を超えると表示できなくなるよ。