Perlコーディング初心者質問スレ Part 51
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/07/27(木) 17:04:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0058nobodyさん
2006/07/28(金) 17:54:13ID:???myなり何なりしておくのはよさげ。
0059nobodyさん
2006/07/28(金) 17:55:59ID:???はい、その通りです。
0061nobodyさん
2006/07/28(金) 18:04:01ID:???0063nobodyさん
2006/07/29(土) 23:54:33ID:???local は既存の変数の値だけを一時的に差し替えて利用するためのアレですから。
0064nobodyさん
2006/07/30(日) 08:37:54ID:kTzF8iv+この配列のキーはqw/1 2 3 4 5.../のようになってます。
でもqw/1 3 4 5 6 10.../のようにトビトビになってる場合もあります。
key %hashのキーを参照して、まだ存在してないキーの中から一番数字が若いものが(0以下除外)
いくつになるかを調べるにはどうすればいいでしょうか?
forとexistsを使う方法を自分で考えましたが、ちょっとforを使いたくありません。
0065nobodyさん
2006/07/30(日) 09:19:54ID:???$key = (sort { $a <=> $b } grep ($_ > 0, keys %hash))[0];
0066nobodyさん
2006/07/30(日) 09:21:13ID:???0067nobodyさん
2006/07/30(日) 09:37:19ID:???006864
2006/07/30(日) 09:37:20ID:kTzF8iv+>>65
せっかくなのにすいません。
普通に安全なforだったことに気付いたのでいいやってことで。
変わりに別の質問がしたいのですが、CGIで一番面倒なことはエスケープだと最近思うのですが。
チャット、掲示板、〜ファイル、〜ファイル、〜ファイル・・・・
何をやるにも表示の時にはエスケープ。
書き込む前には内容のチェック。
mysqlを思い出しまして。まあmysqlを使うほどではないときの法が多くて。
でもそんな時に例えば相手が送ってきた文字列のデータ型が何かをチェックしてくれるボジュールとかあれbなと。
@form{qw/name count ip address tel memo time/};
これら全て自分で毎度「これには何が入っていてはいけなくて・・・」とか書くのがめんどうってことです。
妄想モジュールのオブジェクト->data型(数字のみ,@form{qw/count tel time/})
みたいにするとチェックできるとか。数字のみであるかどうかをチェックみたいな。
006967
2006/07/30(日) 09:39:53ID:???0071nobodyさん
2006/07/30(日) 09:53:02ID:???すでに解決したかもしれんが。
my $ret = 0;
$ret = ++$_ while exists $hash{$ret};
0072nobodyさん
2006/07/30(日) 09:57:59ID:???こういう処理で for とか while とかのループ使わないって条件だったらひどいことになるなーw
grep でやろうと考えたけど煩雑でやめた。
0073nobodyさん
2006/07/30(日) 09:59:34ID:???こうすると$testの中にリファレンスが入るけどどうもスカラー型なんだよね。それも$test{d}の中身が入る。
my $test = [@test{qw/a b c d/}];
こうすればちゃんと配列リファレンスではいる。
どういう理屈だろこれ。
0075nobodyさん
2006/07/30(日) 10:03:43ID:???前者は、
my $test = \( @test{qw/a b c d/} );
になるんじゃないかな。
my $val = ( list ... );
で最後の値が代入される。
後者は無名配列へのリファレンス。
007673
2006/07/30(日) 10:15:01ID:???なるほど〜。
でも
\@testは\(@test)解釈されないのを聞くのは・・・無粋だよね。
そういう仕様なんだもんね。
タンキウス!
0077nobodyさん
2006/07/30(日) 10:26:02ID:rQ64iO4Qすいません3つあるんですが
$a = 3/4; という例で・・
1.分数の分子と分母をそれぞれ取り出す方法はありますか?
$?? = 3; $?? = 4; みたいに・・・
2.分数の逆数を求める方法はありますか?
$?? = 4/3: みたいに・・・
3.分子を1にして通分する方法はありますか?
$a = 3/4; $?? = 1/1.3333・・・
0079nobodyさん
2006/07/30(日) 10:58:53ID:???お前がリストと配列の違いを理解できてないことのどこが無粋?
>>77
前スレより条件減ってるけどそんなんでいいの?
>1.(2/3)*(2/3) の解を 4/9 にするにはどうすればいいですか?
0080nobodyさん
2006/07/30(日) 13:28:14ID:???use bigrat; # or use Math::BigRat;
$a = 3/4; # or $a = Math::BigRat->new(3/4);
my($n, $d) = $a->as_parts(); # 1. 分母分子の取り出し
$i = 1/$a; # 2. 逆数
3. だけ分からん。自分で考えてくれ。
BigRatでは、分母を小数にはできないかも。
ちなみに (2/3)*(2/3) を 4/9 にするには
use bigrat;
print 2/3 * 2/3;
0081nobodyさん
2006/07/30(日) 14:15:52ID:???ifを使って文字列の中にaとbとcがあったときに真を返すようにするにはどうすればよいのでしょうか。
例えば「crab」とか、「arabic」とかなら真を返す、見たいな感じです。
0082nobodyさん
2006/07/30(日) 14:23:24ID:???>>64,>>72
my @data = sort { $a <=> $b } keys %hash ;
( join ',', @data ) =~ /(¥d+),(?!(??{$1 + 1}))/;
print $1 + 1 , "¥n" ;
# sort は使わざるを得ない。
>>81
if ( $str =~ /a/ and $str =~/b/ and $str =~/c/ ) { print 'true' . "¥n" ; }
0085nobodyさん
2006/07/30(日) 19:12:17ID:???自己レス
すまん、分母分子の切り出しだけメソッド名間違ってた。
my($n, $d) = $a->parts();
0086nobodyさん
2006/07/30(日) 19:20:45ID:NH/5yRqcダブルクォート文字列で&を表示させたいのですが
どうすれば良いのでしょうか?
何度やってもエラーが出てしまいます。
0087nobodyさん
2006/07/30(日) 19:24:21ID:???0088nobodyさん
2006/07/30(日) 19:26:36ID:???でも問題なく表示されるなぁ。何が違うんだろう。
0089nobodyさん
2006/07/30(日) 19:37:55ID:???$RSS_ITEM_URI = "http://www.google.com/url?sa=D"."\&"."q=".
$RSS_SCRIPT_URI."?DT=".$dateY.$dateM.$dateD.$dateSUB."#".$dateY.$dateM.$dateD.$dateSUB;
では、どうもエラーが出てしまいました。
$RSS_ITEM_URI = "http://www.google.com/url?sa=D"."\x?"."q=".
$RSS_SCRIPT_URI."?DT=".$dateY.$dateM.$dateD.$dateSUB."#".$dateY.$dateM.$dateD.$dateSUB;
こういう感じの事も試してみたのですが上手く行きませんでした。
0091nobodyさん
2006/07/30(日) 19:52:11ID:???で無事行けました!
xhtmlでは&amp; なのですね…(汗) 勉強なりました。
0092nobodyさん
2006/07/30(日) 21:33:25ID:???HTML は人による閲覧が主だから多少間違ってても読み手が補完するだろう
と IE なり NN なり FF が適当に表示してくれるだけ。
XML だとそれが通用しない。
0094nobodyさん
2006/07/31(月) 00:56:13ID:yxBpgbMaと
if (!$hoge){$hogeが無いぉ}
ってどっちがいい?
0095nobodyさん
2006/07/31(月) 01:18:45ID:???casebycase
ってか下で迷うのは if ($hoge) じゃないのかよw
if ($hoge ne "") ← これは $hoge が undef のときに警告がでる
if ($hoge) ← これは $hoge が "0" のときにも FALSE になるのが注意
0098nobodyさん
2006/07/31(月) 07:17:33ID:YjkkI8MZどうすればよろしいの?
記事の投稿があったその都度に、その内容で新規HTMLを生成するスクリプトを考えてます
0099nobodyさん
2006/07/31(月) 08:59:40ID:???うん、まぁ、とりあえず、perldocではdeclaration(宣言)と書かれてしまっているんだ。
(5.8ではmyとourしか扱ってないから、古いperldocをあたってくれ。)
0100nobodyさん
2006/07/31(月) 10:49:13ID:???2006年07月31日 elf 気づいてるのかな.mixi.pne.pjは本当にmixi.jpからファイルをmixiからコピーしてるんですよ? 他とはレベルが違う
(2006-07-31T09:45:59+09:00)
0101nobodyさん
2006/07/31(月) 10:50:52ID:???0102nobodyさん
2006/07/31(月) 11:17:46ID:???何を言ってるのか分からない。
(変数名).htmlというファイルを作りたいのか、
変数名を反映させた内容のhtmlファイルを作りたいのか、
>記事の投稿があったその都度に、その内容で新規HTMLを生成するスクリプトを考えてます
コレなんかは単に掲示板の出力をファイルにすればイイだけでは・・?
0103nobodyさん
2006/07/31(月) 11:20:43ID:???趣味の範囲の話しだけど
$hogeにはいる値の候補が文字列なら$hoge ne""とした方が読みやすいと思う。
0104nobodyさん
2006/07/31(月) 11:29:14ID:???0105nobodyさん
2006/07/31(月) 11:35:59ID:???なんかラベルなんていらねって書いてあるけど、CGIでは結構使いところあるけどなぁ。
初めから設計通りに作るとかじゃなく、その場その場でどんどん機能が追加されていく場合に
数行処理をふっ飛ばしたいとか、多分多くの人がifとか$error = 1とかでやるところも
gotoでもっと簡単にできるのにって思った。
詳しい人にすっごい突っ込まれそう。
怖いがちょっと突っ込まれてみたいかも
0106nobodyさん
2006/07/31(月) 11:37:47ID:???というか、数値が入ったり文字列が入ったりするような変数があるコードは設計がおかしい。
そして、数値が入ってるか文字列が入ってるか分からないような状態でif文にかけるようなコードは
明らかに設計がおかしい。
http://pc8.2ch.net/test/read.cgi/tech/1153312202/
0107nobodyさん
2006/07/31(月) 11:39:46ID:???0109nobodyさん
2006/07/31(月) 11:42:32ID:???>数行処理をふっ飛ばしたいとか、多分多くの人がifとか$error = 1とかでやるところも
たぶんそういうところは関数定義で何とかする
0110nobodyさん
2006/07/31(月) 11:55:33ID:???if('0'ne''){print 3}
if(0){print 5}
if('0'){print 7}
>>23
0111105
2006/07/31(月) 11:58:13ID:???そこらへんがスリコミなんですかね。
目的も知らずに、「テーブルレイアウトはダメだ」と言うのに近い。
実際自分もgoto使うの気が引ける。
でもね。それで目的が果たせるのになぜ気が引けるのか。
で、スリコミだなぁって。
いやいや、スリコミじゃないだろって否定してもらいたいってのもあるんですけど。
0112nobodyさん
2006/07/31(月) 12:24:48ID:???少々疑問があったため、質問させていただきます。
「投稿フォーム → 確認画面」 に行くとき、改行等を
$value =~ s/\r\n/<br>/g;
$value =~ s/\r/<br>/g;
$value =~ s/\n/<br>/g;
で、デコードするんですが、
もし「投稿フォーム → 確認画面 → 投稿フォーム」 にと、戻ったとき改行は
$hoge =~ s/<br>/\n/ig;
で、処理してよろしいのでしょうか?ちょっと自信がありません・・・。
0114nobodyさん
2006/07/31(月) 12:30:33ID:???エスケープちゃんとしてるか?
タグを埋め込まれてアボーンしても知らないよ?
んでな。普通はHTML表示部分のところだけ<br>と置換するが、
その置換結果を別の変数に入れるんだよ。大本をなくしたら困る時も出てくるからね。
<修正点があるので修正をする>とかのボタンで前のページに飛ばす時は
input type="hidden"1"に置換してない方の文字列を埋め込むのよ。
でもその時もエスケープは必要だから。
とりあえず動作確認してみなさい。
できないならローカル環境整えなさ稲。
0115nobodyさん
2006/07/31(月) 12:32:00ID:???確認画面で相手が書き込んだ内容を相手に見せる時はHTMLエスケープね。
ダレラ
0116nobodyさん
2006/07/31(月) 12:32:31ID:???使うと手に負えないから表では使用禁止といっとくぐらいがちょうどいい。
0117nobodyさん
2006/07/31(月) 12:35:40ID:???0118nobodyさん
2006/07/31(月) 13:09:04ID:oRCGT1rhuse Time::Local;
&timelocal(・・・
先日まで問題なく動いてたんですが、本日使用しているPGM全てで
落ちるようになりました。
とりあえず回避するコードを書いたんですが、原因って何がかんがえられますか?
0120nobodyさん
2006/07/31(月) 13:32:35ID:???原因ねえ。おまいの頭が悪いってあたりが一番怪しいんじゃないか?
とりあえずそこらへんから検討してみてはいかが?
0122nobodyさん
2006/07/31(月) 13:41:15ID:???0123nobodyさん
2006/07/31(月) 13:46:29ID:???画像掲示板の画像が出なくなって驚いた記憶がある。
0125nobodyさん
2006/07/31(月) 15:50:18ID:???絶対パスは$ENV{DOCUMENT_ROOT}から取得したらいいよ。
後、バッククォート演算子でpwdしたり、Cwdモジュールで取得したりするのもいいかも
0126nobodyさん
2006/07/31(月) 16:00:06ID:???うそやん(´・ω・`)
hidden で %ef%80%80 とか書くと普通に % が %25 になるお。
012798
2006/07/31(月) 16:45:36ID:YjkkI8MZレスありがとうございます。
スマソです。
(変数名).htmlのファイルを生成したいのです。
ひな形としての.htmlファイルは予め用意されていてるけど、
内容の一部も変数を反映させるけどこれはなんとかなりそうなんです。
最初はrenameを使うのかと思ったんですけど、これだとダメですね。
0128nobodyさん
2006/07/31(月) 17:12:27ID:???通信技術はハードよりの話題みたいなので・・・
0129nobodyさん
2006/07/31(月) 17:19:09ID:???ム板でもいいけど
0132nobodyさん
2006/07/31(月) 21:03:01ID:???書きの例だと「abc」を取得したいと思っています。
perl -e "@file=('abc.txt');print split (/\./, $file[0])[0];"
perl -e "@file=('abc.txt');print (split (/\./, $file[0]))[0];"
以上の2例でもsyntax erorが出ます。
splitは配列を返すので、その配列の[0]を参照するという書き方でいいと思うのですが、
どのようにしたら正常に表示できるのでしょうか。
perl -e "@file=('abc.txt');print scalar (split (/\./, $file[0]));"
このように記述すると2が表示されるので、splitの結果は配列になって帰ってきているとは思うのですが。
0134nobodyさん
2006/07/31(月) 21:22:36ID:???0135nobodyさん
2006/07/31(月) 23:02:34ID:???>>134 氏みたく丁寧に () を書いて、 print に正しく情報を与えるか、
perl -e '@file=("abc.txt");print [ split /¥./, $file[0] ]->[0] . "¥n";'
の様にリファレンスで出力するか。
133のことも忘れないでね♪
0138nobodyさん
2006/07/31(月) 23:34:13ID:???わたひの受けた衝撃の高さを物語っています。orz..
013998
2006/07/31(月) 23:34:40ID:YjkkI8MZなにこれ?
きっと板違いだね
0140nobodyさん
2006/07/31(月) 23:36:06ID:???まじで分からん。
0141nobodyさん
2006/07/31(月) 23:37:42ID:???perl -e '@file=("abc.txt");print + ( split /¥./, $file[0] )[0] , "¥n" ;'
0142nobodyさん
2006/07/31(月) 23:47:51ID:???sub html_escape{
my @value = @_;
for (my$i=0;$i<@value;$i++){
$value[$i] =~ s/&/&/g;
$value[$i] =~ s/</</g;
$value[$i] =~ s/>/>/g;
$value[$i] =~ s/"/"/g;
$value[$i] =~ s/'/?/g;
}
return @value==1 ? $value[0]:@value;
}
my $test = "a <br> b <br> c <br>";
my @test = (qw/a <br> b <br> c <br>/);
my %test = (qw/a <br> b <br> c <br>/);
my $test_html = &html_escape($test);
my @test_html = &html_escape(@test);
my %test_html = map{$_,&html_escape($test{$_})}keys %test;
#@test_html{sort keys %test} = &html_escape(sort values %test);
print $test_html,"<br><br>",@test_html,"<br><br>",%test_html;
簡単に作ろうと思いました。これで動作しますが、実はマグレでどこか穴などありますか?
できれば
my %test_html = &html_escape(%test);
が理想だったのですが。
014398
2006/07/31(月) 23:51:40ID:YjkkI8MZもぅ一度質問して良いですか?
つまりsn uploaderとかそれ系のperlアプリでありがちな処理として
投稿された動画データの変数$1234などを元に閲覧用の外部htmlファイルを生成出来るように
したいんです。
ソースを眺めてもいまいち理解しずらいので勉強がてら一から組んでみようと思ってるんです。
どなたかヒント頂けませんか?
makehtmlという関数らしき記述があるけど。
自作の関数を組み込んでるんでしょうね。
かなり敷居の高いテクニックなんでしょうか。。
0145142
2006/07/31(月) 23:55:45ID:???014698
2006/08/01(火) 00:12:44ID:t9If8ozv誰か教えて!
0147nobodyさん
2006/08/01(火) 00:36:58ID:???3行目以降を+の話に入れ替えるくらい基本。
>>143
確かSn Uploaderは静的htmlを出してる。それがmakehtmlだったかな。
負荷対策だろうけど、動的にファイルインデックス作るのとコードは似たようなもん。
で、説明下手だからどんな状況からどんなhtml作りたいのか書いて。1レスに収まるように。
0148135
2006/08/01(火) 00:54:07ID:???どう考えても [LIST]->[] の方が邪道でした。
0149nobodyさん
2006/08/01(火) 00:58:53ID:???の
s/&/&/
などは、配布スクリプトで汚染チェックとか書いてあるのですが、何か意味はあるのでしょうか?
0150nobodyさん
2006/08/01(火) 01:04:28ID:???015198
2006/08/01(火) 01:17:50ID:t9If8ozvありがとうございます!
元のスクリプトはKentWebさんのclip_bordなんです。
それに拡張子のwmvを追加し投稿されたwmvデータを$xxx.wmv.htmlで出力出来るようにしました。
(ここまでは簡単)
実は当面必要と思われるだけの1.wmv.html 2.wmv.html...と作ってディレクトリに突っ込んでやろうかとも思いましたが。。
あまりにバカっぽいのでやめました(笑
ひな形となるwmvプレーヤを組み込んだhtmlファイルをperlスクリプト内に置くか外部に置くかはまだ
決めてませんが、その雛形html内に$xxxを渡しつつその変数でのhtml作成を考えています。
# 添付データを書き込み
#.wmvに.htmlを追加。
if ($tail eq ".wmv") {$tail .= ".html" ;
#.wmv.htmlファイルの自動生成この辺り。
}
$imgfile = "$ImgDir$no$tail";
if (!open(OUT,"> $imgfile")) {
if ($clip_err) { &error("画像のアップロードに失敗しました"); }
}
binmode(OUT);
binmode(STDOUT);
print OUT $upfile;
close(OUT);
chmod(0666,$imgfile);
#の部分に雛形htmlファイルと生成の為のスクリプトを組み込めないものかと考えています。
思いっきり見当違いかも知れませんしこれじゃ伝わらないかもですが。。
勉強しようと思います。
よろしくお願いします。
015298
2006/08/01(火) 01:29:44ID:t9If8ozvhttp://irom.sytes.net/clip_img/n2/253.zip
これが現状でのスクリプトです。
0153nobodyさん
2006/08/01(火) 01:38:38ID:???要するにアップロードされたファイル1個1個に対して間接DL/再生ページを吐き出したいわけね。
$xxxにファイルの番号が入ってるのかな?
そのhtmlの雛型あるじゃん。その中でファイルごとに変動させたい部分を探すの。そこを変数にしといて
$htmlcontents =<<<"EOH"; # この構文はヒアドキュメント
<html>略
<title>$xxxの再生ページ</title>略
<... src="$xxx.wmv">略
EOH
とでもhtml化してあとはこの$htmlcontentsを"$xxx.wmv.html"といったファイル名で出力すればいいよ。
$tail .= ".html";するのはファイル出力直前のが良さそう。
015498
2006/08/01(火) 01:48:22ID:t9If8ozvその通りの事なんです。
それは理解出来そうです。ありがとうございます。
で、その>$xxx.wmv.html"といったファイル名で出力すればいいよ。
との事だけど、その出力関数?つまりUnixで言う所のmk...コマンドのような、
どういう記述でファイルを新規出力させれば良いのだろうかと。
perlのファイル周り関数を見てもそれに当たるものが見当たらないようだし。
どうでしょ?
$tail...の部分も含めてアドバイス、本当にありがとうございます。
0155nobodyさん
2006/08/01(火) 02:00:28ID:???普通にファイルオープンしてhtmlを書き込むんだよ。
検索すれば山ほど出るから調べてね。使うアクセスモードは">"になるよ。
015698
2006/08/01(火) 02:06:04ID:t9If8ozvファイルオープンで良いんだ。。
超基本ですね。きっと。
それでググって更に納得です!
ありがとう。
俺も数年後ぐらいには、ここで初心者(超)の質問に答えてあげられるぐらいになりたいですよ。
がんばろ。
感謝。
0157nobodyさん
2006/08/01(火) 02:28:05ID:k536PVpv0158nobodyさん
2006/08/01(火) 02:31:26ID:???■ このスレッドは過去ログ倉庫に格納されています