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
0652nobodyさん
03/07/15 10:28ID:???0653山崎 渉
03/07/15 11:05ID:???__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
0654nobodyさん
03/07/15 12:25ID:BbnXwsym0655nobodyさん
03/07/15 14:08ID:???よって行単位でソートをかけるときはどういうやり方がありますか?
0656nobodyさん
03/07/15 14:21ID:???0658nobodyさん
03/07/15 14:40ID:???そういうデータは他のソフトでも普通に処理できるのだろうか。
0659nobodyさん
03/07/15 14:47ID:???0660nobodyさん
03/07/15 15:08ID:???とりあえずRDBか何かに置き換えることをお勧めするよ。
そうじゃなくて、このCSVファイルを処理すること自体が目的だとしたら……
先頭要素、ファイルポインタ、行サイズあたりを記録していって2パスで処理とか?
0661nobodyさん
03/07/15 16:02ID:???open CSV, '<' . $file or die;
my @line;
{
my $pos = 0;
while (<CSV>) {
/^(\d+)/;
push @line, "$1\t$pos";
$pos = tell;
}
}
for (sort { $a <=> $b } @line) {
/(\d+)$/;
seek CSV, $1, 0;
print scalar <CSV>;
}
0662atom
03/07/15 17:12ID:3ahZXwjC$tag =~ s/\<.*>$//g
で置換すると
あああ<B>いいい</B>が
あああになります。
これを
あああいいいと変換したいのです。
0665nobodyさん
03/07/15 17:57ID:???どうすれば良いのでしょうか。
Jcode::convert(\@file,'utf8');
とかやったのですがやっぱりダメなようで…。
0666nobodyさん
03/07/15 18:34ID:???0667nobodyさん
03/07/15 18:41ID:???0672nobodyさん
03/07/15 22:34ID:???<IMG SRC="xx.gif" ALT="がんばった!o(>_<)o">
これなら納得いくか?
0674673
03/07/15 23:21ID:???htmlspecialchar ってPHPの関数だったw
0675あぼーん
NGNG0676あぼーん
NGNG0677nobodyさん
03/07/16 00:08ID:???スレ違いだが一応突っ込んでおくか。
<q cite="http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/charset.html#h-5.3.2">
テキスト中に「<」記号を記したい場合、著者は「&lt;」(ASCII十進60)を用い、
タグの冒頭――開始タグの開始区切り子――と誤解される可能性を回避
するべきである。同様に、テキスト中に「>」記号を記したい場合、仮に二重
引用符で囲った属性値としてであっても、著者は「>」を直接記すのではなく
「&gt;」(ASCII十進62)を用い、古いユーザエージェントがこれをタグの末尾
――タグの終了区切り子 ――と誤解してしまう問題を、回避すべきである。
</q>
0678nobodyさん
03/07/16 00:23ID:???プログラマは、ユーザーが「想定外」の操作をする事も念頭においてプログラミングをしなければならない。
これ、プログラムの基礎。
0679nobodyさん
03/07/16 00:28ID:???0680nobodyさん
03/07/16 00:54ID:GrzUswHSPerlで動かすCGIの掲示板みたいな物を参考書片手に作ってるのですが
プログラム自身が新しくディレクトリーやファイルを作る方法を探してます。
色々頑張ってディレクトリーは
mkdir $setdir,$setpm;
で作れるのですが
その作ったディレクトリーの中にプログラム自身でファイルを作成する方法が
よく判らないのです。
検索してみた所【touch】なるコマンドが出てきたのですがうまく作動してくれません
根本的に間違ってるのか、困り果ててます。
なにかヒントだけでもお願いします。
0681nobodyさん
03/07/16 00:59ID:???0683nobodyさん
03/07/16 01:09ID:???100%入力ミスをしない自信があるんならいいんじゃない?
0684nobodyさん
03/07/16 01:12ID:???って文句いうユーザー入るんだろうな・・・
0686nobodyさん
03/07/16 09:19ID:???0691655
03/07/16 11:26ID:???ありがとう。きれいなコードですね。
実際の処理は>>655で書いたのと違い、
ちょっとごたついているんですが、
ファイルポジションを確保するやり方を使うことにします。
比較対象フィールド(複数)の保持だけなら
今回はメモリの制約にかからないので。
これは個人的な質問ではありませんが、
もし比較対象フィールドを確保しようとするだけで
メモリの制約にかかる場合は、どういうやり方が考えられるでしょう?
>>686さん
0692nobodyさん
03/07/16 11:47ID:iP2fRAb3プロバイダはCGIの動作を見てから
使用許可を出すと言っています。
それで自宅サーバー構築を思い立ったのですが
自宅ではテスト環境が出来たんですが
先方に見せる事が出来ないんでしょうか。
CATVでプライベートIPアドレスとやらなので、
自宅サーバーを公開できない様ですが、本当ですか?
CGIテスト環境を貸してくれる所とかあるんでしょうか?
結構行き詰まってます。宜しく...。
0693nobodyさん
03/07/16 11:49ID:???0694nobodyさん
03/07/16 11:52ID:???>>692
動作確認する必要があるというなら、向こうでやってくれるんじゃないの?
どっかに置いてあるのを外から見ただけじゃ何もわからんと思うんだが。
0698nobodyさん
03/07/16 12:43ID:???そのうちお菓子作りの質問とかも来そうだな。
0700nobodyさん
03/07/16 13:13ID:???お前は初心者質問と書いてあったら、「801初心者質問スレ」でもCGIの質問をできるのか?
寝言は寝て言え。
0701nobodyさん
03/07/16 15:23ID:F4EDEscpこうしたら、@hogeには@arrayのリファレンスが入ったんですけど、
[@array]って書き方は一体なんでしょうか。
0702nobodyさん
03/07/16 17:06ID:???[ ] は無名配列生成子。
@array のリファレンスを返しているのではなく、
(@array) というリストを生成し、そのリファレンスを返す。
0703nobodyさん
03/07/16 20:47ID:???{ }
sub { }
0704701
03/07/17 09:21ID:VmbYvhJN配列の中に配列を入れたいのですが、
sub makeArray{
@array1 = ("あ","い");
@array2 = ("か","き");
push(@arrayRef,[@array1]);
push(@arrayRef,[@array2]);
return(@arrayRef);
}
@arrayRef = &makeArray();
for($i=0;$i<@arrayRef;$i++){
foreach (@{@arrayRef[$i]}){
print "$_\n";
}
}
これで間違いや非効率なところはありませんか?
push(@arrayRef,@array1);
push(@arrayRef,@array2);
初め、こうやったら、@arrayRefはただの1個の配列になってしまって、"あ","い","か","き"が入ってしまったので、
なんかてきとうに[]とか付けたら偶然できたんですが。
0705nobodyさん
03/07/17 10:37ID:???push(@arrayRef,[@array1]);
push(@arrayRef,[@array2]);
だと、無名配列を"生成"するプロセスが入るから、
push(@arrayRef,\@array1);
push(@arrayRef,\@array2);
としたほうが早いね。
あと、
foreach (@{@arrayRef[$i]}){
は一応動くけど
foreach (@{$arrayRef[$i]}){
が正しい。
あと、変数は基本的に局所化しようぜぃ。
特に同じ変数名引き回すなら、思わぬ動きをする可能性大。
0706nobodyさん
03/07/17 10:45ID:???sub makeArray{return (['あ','い'],['か','き']);}
とか
0707nobodyさん
03/07/17 10:46ID:AZTCTrFHuse strict; すれば良いかと。これやって大域変数の使用を極力抑えれば
バグの入る余地をかなり減らせると思う。
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||; こういう書き方なんていうんですか。
■ このスレッドは過去ログ倉庫に格納されています