Perl コーディング初心者質問コーナー Part25
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/06/28 01:18ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
関連スレ
【Perl上級者コーナーPart01】
http://pc2.2ch.net/test/read.cgi/php/1024741312/
CGI: Common Gateway Interface part 11
http://pc2.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0708nobodyさん
03/07/17 13:11ID:???さらにもう一声
@arrayRef = (['あ', 'い'], ['か', 'き']);
とサブルーチンをとっぱらってみるとか…
0709nobodyさん
03/07/17 13:12ID:???0710nobodyさん
03/07/17 13:29ID:???0711nobodyさん
03/07/17 13:35ID:AZTCTrFH使い捨ての書き捨てコードだったら俺もグローバル使いまくるけど、
大きいソースになったらバグが出やすいし保守しにくくなるよ。
0712あぼーん
NGNG0713
03/07/17 16:50ID:MTBsKFuL#!/cygwin/bin/perl
print <<end;
content-type: text/html
<html>
<body>
こんにちは<br>
私の名前は太郎です<br>
</body>
</html>
end
と入力し、IEで見てみると、『ページを表示できません』と出ました。どうすれば表示できるのでしょうか?
初心者で申し訳ないです<(_ _)>
0714nobodyさん
03/07/17 17:03ID:???あなたの環境は?
> と入力し、
どこにどうやって入力したのか?
> IEで見てみると
どこを見たのか?
あまりに情報不足で答えようがありません
0715nobodyさん
03/07/17 17:41ID:???この辺おかしい気がするんだが?
0716nobodyさん
03/07/17 17:50ID:???0717nobodyさん
03/07/17 18:00ID:???0718nobodyさん
03/07/17 18:01ID:???0721nobodyさん
03/07/17 18:50ID:m6zrRyqWPerl、それもバージョン5.80以下で、
モジュールを使わずに、つまりライブラリで、
eucからUTF-8への変換をするにはどうしたら良いでしょうか?
0723nobodyさん
03/07/17 19:23ID:???0724nobodyさん
03/07/17 19:24ID:???あれか、標準ライブラリと言いたいのか?
0727nobodyさん
03/07/17 20:06ID:???ヒアドキュメントで2個分の改行が入ってるから無問題だろ
とかマジレスしてみる
0728nobodyさん
03/07/17 20:25ID:???0729座敷荒氏
03/07/17 20:27ID:???パラメータファイルに書かれたファイルを削除するものです。
ファイル名*に対応できなかったので下記のように書き直して
テストでは問題なく成功したのですが
本番機ではなぜか一部のファイルを削除できずに
1を返して異常終了してしまいました。
原因や修正箇所を教えていただけませんか?
#! /usr/bin/perl
while (<>){
($cmd_para) = split;#パラメータファイルより確認対象取得
unless(unlink< $cmd_para >){#ファイルの削除
exit(100);#ファイルが削除できなければ異常終了
}
}
exit(0);#上記以外正常終了
0731座敷荒氏
03/07/17 20:38ID:???即レスありがとうございます。
そうですね!
シェルから実行していてログみると
1で終了してるんですけど、
このスクリプトで1で抜けるってのが
ありえるのかと…
質問したのに情報欠けてますね。
もう一度調べて直して再度質問させてください。
宜しくお願いします。
0732nobodyさん
03/07/17 21:42ID:CeuxGVu00733あぼーん
NGNG0735nobodyさん
03/07/17 21:56ID:CeuxGVu0お前ほどの無知は初めて見たよ
0737nobodyさん
03/07/17 22:07ID:???「>725の間違いでした」とでも言っておけばよかったのに。
0738nobodyさん
03/07/17 22:08ID:CeuxGVu0うん。今日はパパンにレイプされたちゃったんです
0740nobodyさん
03/07/17 22:13ID:CeuxGVu0カレー食べました
0741nobodyさん
03/07/17 22:30ID:???0742nobodyさん
03/07/17 23:00ID:???0743nobodyさん
03/07/17 23:16ID:FCw7NcrOあだkdsんdlsdなksんだlんdさldあんだ
だdささ
藻前らアフォすぎ
0744あぼーん
NGNG0745nobodyさん
03/07/18 03:23ID:???という中身の配列データを、
a(改行)
b(改行)
c(改行)
d(改行)
e(改行)
となるようにファイルに書き込ませたいのですが
if(!open(OUT,">$file")){print "ファイルが開けません";}
print OUT @hoge;
close(OUT);
としても、ファイルには「abcde」と改行無しで一行にまとめて書き込まれてしまいます(´・ω・`)ショボンリ
そこで、
if(!open(OUT,">$file")){print "ファイルが開けません";}
print OUT "";
close(OUT);
と、一回中身空っぽにして
if(!open(OUT,">>$file")){print "ファイルが開けません";}
foreach(@hoge){
$value = $_ ."\n";
print OUT $value;
}
close(OUT);
と、追加書きさせるようにしてるんですが、はっきりいって無様な感じがします(´・ω・`)
こういう手段しか無いのでしょうか・・・
0746745
03/07/18 03:27ID:???CGIのゲームのデータを記録するファイルなので、前のデータを残しておけないからです。
なにかいい方法があったら教えてください。よろしくおながいします。
0747nobodyさん
03/07/18 03:33ID:NVnSzVH0if(!open(OUT,">$file")){print "ファイルが開けません";}
print OUT join("\n", @hoge, "");
close(OUT);
こうか?
0749nobodyさん
03/07/18 04:04ID:???それの注意点としては一番最後の行には改行がつかない点。
最後に改行つけたければ
print OUT join("\n", @hoge, "")."\n";
とか
foreach(@hoge){print "$_\n" ;}
0750745
03/07/18 04:26ID:???そうでしたか。
でも、もう一度ソースを見直したところ、
最後の行には改行なくても大丈夫だということがわかりましたので
今回は>>747を使わせていただきます。
重々(ー人ー)多謝
0751nobodyさん
03/07/18 11:17ID:7SO5ZUkTqq||; こういう書き方なんていうんですか。
0752nobodyさん
03/07/18 11:28ID:NVnSzVH0> それの注意点としては一番最後の行には改行がつかない点。
つくよ。それはちゃんと考えてある。
> print OUT join("\n", @hoge, "")
そのために配列に空要素を加えてるわけで・・・。
0753nobodyさん
03/07/18 11:29ID:gzS3zVXD0755あぼーん
NGNG0756nobodyさん
03/07/18 12:15ID:NVnSzVH0Generalized quote.
0757nobodyさん
03/07/18 12:36ID:???解決したのはいいんだが、
自分で考えた案の方は、何故一度空にしてから追記で改めて書き込むような
処理になっているのかが気になる。
0759nobodyさん
03/07/18 13:20ID:???何も書き込まないから内容が前のままになると勘違いしていた、と推測してみる。
と思ったけどそれならforeachの前にprint OUT ""挟むか。
やはりわからん。
と思ったら>>746に書いてあったw
やはり↑の推測でよかったのか。
#ちなみに>$fileで開いた時点でファイルは空になる。
0760nobodyさん
03/07/18 13:53ID:50GDA6Bl俺も、それでいろいろとまどったこともあった
0761745
03/07/18 18:44ID:???a1
b1
c1
d1
e1
と書き込まれているとして、これを
a2
b2
c2
d2
e2
と書き直したいんです。
if(!open(USER,">>$user_dir$FORM{'id'}.dat")){print "ユーザーファイルが開けません";}
foreach(@user){
$value = $_ ."\n";
print USER $value;
}
close(USER);
とするだけだと
a1
(略
e1
a2
(略
となってしまうので、いったん空っぽにしてた訳です。(´・ω・`)ナンカ ヘン?
0762745
03/07/18 18:48ID:???foreach(@user){
$value = $_ ."\n";
print USER $value;
}
close(USER);
ぐはっ、これでも逝けたのか… (o_ _)o
ヽ(゚∀゚) アヒャヒャヒャヒャ ドンマイドンマイ
0763nobodyさん
03/07/18 20:19ID:Y8wtPXEB1 50 10 60
2 60 80 140
3 10 60 70
これを各項目別にソートしたいです。
思いついたのは
$d[0][0]→1 $d[1][0]→0:50 $d[2][0]→0:10 $d[3][0]→0:60
$d[0][1]→2 $d[1][1]→1:60 $d[2][1]→1:80 $d[3][1]→1:140
$d[0][2]→3 $d[1][2]→2:10 $d[2][2]→2:60 $d[3][2]→2:70
多次元配列に入れる
歴史の順でソートする場合
sort(@d[1])←ここは自信ないです(d[1]の中をソートしたいんです)
foreach(@d[1]){
($num,$data) = split(/:/);
print "$d[0][$num]","$_","$d[2][$num]","$d[3][$num]";
}
と言う方法です。各要素に、はじめの添え字を記録して、それをsplitで分解して、それを添え字にする、とい方法ですが、
これは、かなり無駄な気がします・・・
もうすこしきれいなのはありませんか?
0764nobodyさん
03/07/18 20:29ID:Y8wtPXEB×0:50
○50:0
こうかえないと、ソートできませんね
0765nobodyさん
03/07/18 20:33ID:???0766nobodyさん
03/07/18 20:35ID:Y8wtPXEBえと、それだったら
バブルソート使わないとだめっぽくないですか??
というか、ハッシュがソートされると、添え字がどうなるとかわからないんですけど・・・
値を比べて、添え字と値が対でソートされるんですか?
0767nobodyさん
03/07/18 20:49ID:???0768nobodyさん
03/07/18 21:02ID:???0769nobodyさん
03/07/18 21:31ID:bi1QsuUD$test =~ m/$pataann/;
こんな感じで正規表現パターンを変数化することなんて
無理ですよね?
0771nobodyさん
03/07/18 21:51ID:???やってみりゃいいだろ。
つーか、もう余計な部分まで答えてやる。出来る。
そして$patternの中身がそのまま正規表現パターンとして使われるから注意な。
$pattern = "a.";
なら"aa"や"ab"にもヒットする。
これを文字通り"a."にヒットさせたい場合は
$pattern = "a\\.";
としてやる。
さもなくば
$pattern = quotemeta($patter);
としておくとか、
$test =~ m/\Q$pattern\E/;
などとしろ。
いいか、pataannじゃなくてpatternだぞ!
0773nobodyさん
03/07/18 22:06ID:???open USER, '+<' . "$user_dir$FORM{'id'}.dat"
or error('ユーザーファイルが開けません');
my %data;
while (<USER>) {
/^(.)(.)$/;
$data{$1} = $2;
}
foreach my $key (keys %data) {
$data{$key} += 1; # a1 を a2 へ
}
delete $data{'e'}; # データを元より短くする実験
seek USER, 0, 0;
print USER "$_$data{$_}\n" for sort keys %data;
truncate USER, tell USER;
close USER;
0774nobodyさん
03/07/18 22:23ID:???my %column = ('歴史' => 1, '世界史' => 2, '合計' => 3);
my @score = (
[ 1, 50, 10, 60 ],
[ 2, 60, 80, 140 ],
[ 3, 10, 60, 70 ],
);
my $column = $column{'歴史'};
print join ' ',
map $_->[0],
sort { $b->[$column] <=> $a->[$column] }
@score;
0776nobodyさん
03/07/18 22:54ID:???( )
( )
/ノノ"\ヽ )
从*゚ー゚从 〜
/゙゙゙lll`y─┛
ノ. ノノ |
. `〜rrrrー′
. |_i|_(_
落ち着け。
0777nobodyさん
03/07/18 23:11ID:???あまり関係ないけど、おいらならこんなデータ構造にしますな。
@score = (
1 => {
'歴史' => 10,
'世界史' => 50,
},
);
合計は計算する。
0778nobodyさん
03/07/19 00:22ID:???There's more than one way to do it.
0779nobodyさん
03/07/19 00:31ID:???1 50 10 60
2 60 80 140
3 10 60 70
随分と成績の悪いやつばかりですね
0780nobodyさん
03/07/19 00:52ID:???4 90 85 5 190
0781nobodyさん
03/07/19 01:07ID:???「これ(・・・コードの羅列・・・)って出来るんですか?」
って聞くやつってどういう思考回路してるんだ?
俺様がわざわざ試すのは面倒だから下々の暇そうな2chの
馬鹿どもにやらせておこうって考えなのかな?
0782nobodyさん
03/07/19 01:12ID:???0784nobodyさん
03/07/19 01:39ID:???0788nobodyさん
03/07/19 02:23ID:???0789nobodyさん
03/07/19 02:39ID:xDnFfAsdあったら教えてください。素人質問で
申し訳ありませんが。
0790nobodyさん
03/07/19 02:56ID:???http://www.din.or.jp/~ohzaki/regex.htm
0792nobodyさん
03/07/19 03:42ID:xDnFfAsd有難うございました。
ただ良く理解できません。
例として、3と4は含むけど5は含まない
というのを教えていただける人がいれば、
よろしくお願いします。
0793nobodyさん
03/07/19 04:01ID:???http://www.geocities.jp/leeobasan/mokuji-kokugo.htm
0794nobodyさん
03/07/19 04:09ID:xDnFfAsd分からないなら分からないって言ってね。
0796nobodyさん
03/07/19 04:18ID:???-> 3と4を含み、かつ5は含まない
-> 3を含み、かつ4を含み、かつ5を含まない
実際にperlで表現する方法は>>790で既出なので略。
上の仕組みが分からない時は「集合」の勉強をしちゃってください。
「論理和 論理積」でググればいっぱいヒットします。
こんだけ丁寧に書けばもう問題ないでしょう。てことで次の質問者の方どうぞ。
0797nobodyさん
03/07/19 05:16ID:???やーだからね、仮にそういう質問の意図だったとして、
それが配列の要素に対しての話なのか文字列の部分に対しての話なのか、
条件判定の話なのか、ついでにそもそもPerlSyntaxの中で話なのかどうかすら、
何が何だかさっぱり分からんでしょ。
そもそも>>789や>>792からそういう解釈を導き出すのも無理あるし。
というわけで次の質問者どうぞ。
0798nobodyさん
03/07/19 09:24ID:???それみたら、そのスクリプト(もちperl)が、
商品を管理者画面から登録する際、
インデックスファイルみたいなものに、連番と商品名だけCSVで持たせて、
商品の詳しい内容は、
別のフォルダ「商品名」(もち日本語)っていうファイルを作らせて、
(たとえば、「ThinkPad1200特売品」とかいうファイル名)
で、「ThinkPad1200特売品」っていうファイルの中に、「<>」区切りで、
商品名の詳細がかいてあるんです・・・
自分、仕事としてperlをやりはじめたのがまだ1ヶ月だから、
わからないんだけど、こういう組み方って、アリなんですか?
それとも異常?
perlお仕事歴長いかた、教えてください。
0799798
03/07/19 09:25ID:???>別のフォルダ「商品名」(もち日本語)っていうファイルを作らせて、
じゃなく
別のフォルダの中に「商品名」(もち日本語)っていうファイルを作らせて、
0800nobodyさん
03/07/19 09:33ID:???0801nobodyさん
03/07/19 09:45ID:???0803nobodyさん
03/07/19 11:34ID:???ネットショッピングかな?
商品登録だけじゃなくて、販売とか在庫管理まで考慮して
ファイルを設計する必要がある。
他の部分がどうなってるのか分からないけど、
商品詳細情報を個別のファイルにしておくと、
商品番号から詳細情報を表示するリクエストがあったときに
「全商品詳細情報ファイル」を読んで検索して表示するより速い。
内容に不備・誤記があったときの訂正も楽。
完売したらインデックスファイルの該当個所だけ変更すればよい。
目的に合わせてファイルを分けるのは異常ではなく当然。
Perl というよりデータベース設計の問題だと思われる。
0804798
03/07/19 17:38ID:???なるほどー、そういう利点があるんですね。
それは、すごく初耳だったので、勉強になりますた。
>販売とか在庫管理まで考慮してファイルを設計する必要がある。
これをつくった人は、
そこまでは、なにも考えてないみたいです。
ショッピングカート経由で注文があったらメールがいくだけみたいな。
>完売したらインデックスファイルの該当個所だけ変更すればよい。
っていう機能を管理者画面につけてないみたいですしね。
0805nobodyさん
03/07/19 19:07ID:???将来的な機能追加を見越した設計だったのかもしれない。
メールを送るだけだからファイル管理だけで充分だけど、
単一ファイルじゃ拡張しにくくて気持ち悪いとか。
ある程度の規模や機能に達すればファイルでなくて本格的な
データベースを導入することになるんだろうけど。
>そこまでは、なにも考えてないみたいです。
在庫管理するかどうかのプログラマに決定権があったとは思いにくいなぁ。
単に初回作成時は、依頼主の予算やショッピングサイトの来客数の見込みから
簡単に済ましただけかも知れない。
実店舗がある個人商店の片手間なショッピングサイトとかなら、大枚はたいて初っ端から
大掛かりなシステムは依頼できないっしょ。
0806795
03/07/19 19:53ID:???0808nobodyさん
03/07/19 21:54ID:???http://ime.nu/pc2.2ch.net/やhttp://cgiboy.com/pc2.2ch.net/のようなアドレスで
動的にページを出力するにはどうしたらいいんでしょうか?
PATH_INFOを使用するにしても、スクリプトの名前が入ると思うのですが・・・
■ このスレッドは過去ログ倉庫に格納されています