トップページ⇒php
1001コメント315KB

Perl コーディング初心者質問コーナー Part25

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/06/28 01:18ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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:???
[] は perl でもなんでもないんだけどな…。正規表現スレ行けば?
0653山崎 渉03/07/15 11:05ID:???

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
0654nobodyさん03/07/15 12:25ID:BbnXwsym
age
0655nobodyさん03/07/15 14:08ID:???
メモリが256MBのマシンで500MBくらいのcsvデータを先頭の数字に
よって行単位でソートをかけるときはどういうやり方がありますか?
0656nobodyさん03/07/15 14:21ID:???
普通に
0657nobodyさん03/07/15 14:35ID:???
>>656
データが10GBだったらどうでしょ?
0658nobodyさん03/07/15 14:40ID:???
500MBのCSVデータっていうのが、もはや現実的じゃないな……
そういうデータは他のソフトでも普通に処理できるのだろうか。
0659nobodyさん03/07/15 14:47ID:???
500MBもあったらローカルPC上でアプリでやっても果たして・・・
0660nobodyさん03/07/15 15:08ID:???
Excelなんかはさっくり死にそうだな。
とりあえずRDBか何かに置き換えることをお勧めするよ。

そうじゃなくて、このCSVファイルを処理すること自体が目的だとしたら……
先頭要素、ファイルポインタ、行サイズあたりを記録していって2パスで処理とか?
0661nobodyさん03/07/15 16:02ID:???
>>655
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>;
}
0662atom03/07/15 17:12ID:3ahZXwjC
HTMLのタグを削除したいんですが、上手くいきません。
$tag =~ s/\<.*>$//g
で置換すると
あああ<B>いいい</B>が
あああになります。
これを
あああいいいと変換したいのです。
0663nobodyさん03/07/15 17:14ID:???
>662
>>4のPerlメモ読め
0664atom03/07/15 17:20ID:???
>>663
ゴメソ。見てくる
0665nobodyさん03/07/15 17:57ID:???
Jcode.pmを使い配列内の値全ての文字コードを一回で変換するには
どうすれば良いのでしょうか。

Jcode::convert(\@file,'utf8');
とかやったのですがやっぱりダメなようで…。
0666nobodyさん03/07/15 18:34ID:???
Jcode::convert(\$_,'utf8') foreach @file;
0667nobodyさん03/07/15 18:41ID:???
Jcode::convert( *file, 'utf8' );
0668nobodyさん03/07/15 20:16ID:???
>>662
$tag =~ s/\<.*?>$//g
0669nobodyさん03/07/15 20:22ID:???
>>668
まぁ細かいこと言うと、

<IMG SRC="xx" ALT=">">

で失敗するけどね。
0670nobodyさん03/07/15 21:18ID:???
>>669
そういう使い方あり?
0671nobodyさん03/07/15 21:40ID:???
>>670
前にHTML4.01見て、アリなのを確認した記憶がある。
3.2は多分アリだろうし。
ちょっとうろ覚えだけど。
0672nobodyさん03/07/15 22:34ID:???
>670
<IMG SRC="xx.gif" ALT="がんばった!o(>_<)o">
これなら納得いくか?
0673nobodyさん03/07/15 23:20ID:???
>>671-672
まぁ、htmlspecialchar しとくのが無難だよ
067467303/07/15 23:21ID:???
あ、なにいってんだ自分、
htmlspecialchar ってPHPの関数だったw
0675あぼーんNGNG
あぼーん
0676あぼーんNGNG
あぼーん
0677nobodyさん03/07/16 00:08ID:???
>>671-672
スレ違いだが一応突っ込んでおくか。

<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:???
>677
プログラマは、ユーザーが「想定外」の操作をする事も念頭においてプログラミングをしなければならない。
これ、プログラムの基礎。
0679nobodyさん03/07/16 00:28ID:???
ユーザはプログラマがどんなに対策しても想定した以外の操作をする
0680nobodyさん03/07/16 00:54ID:GrzUswHS
質問です
Perlで動かすCGIの掲示板みたいな物を参考書片手に作ってるのですが

プログラム自身が新しくディレクトリーやファイルを作る方法を探してます。
色々頑張ってディレクトリーは

mkdir $setdir,$setpm;

で作れるのですが
その作ったディレクトリーの中にプログラム自身でファイルを作成する方法が
よく判らないのです。

検索してみた所【touch】なるコマンドが出てきたのですがうまく作動してくれません

根本的に間違ってるのか、困り果ててます。
なにかヒントだけでもお願いします。
0681nobodyさん03/07/16 00:59ID:???
open(FILE, '> ./hoge/fuga');

0682nobodyさん03/07/16 01:07ID:???
>>678
プログラマ=ユーザーの場合でもですか?
0683nobodyさん03/07/16 01:09ID:???
>682
100%入力ミスをしない自信があるんならいいんじゃない?
0684nobodyさん03/07/16 01:12ID:???
<B>が消えねー!
って文句いうユーザー入るんだろうな・・・
0685nobodyさん03/07/16 04:19ID:???
>>678-679
マーフィーだな
0686nobodyさん03/07/16 09:19ID:???
何か質問しろ
0687nobodyさん03/07/16 09:28ID:???
>>686
openでファイルを開いた後に書き込む方法を教えてください。
0688nobodyさん03/07/16 09:34ID:???
>>687
print
0689nobodyさん03/07/16 11:13ID:???
>>687
write
0690nobodyさん03/07/16 11:16ID:???
>>687
カキコ
069165503/07/16 11:26ID:???
>>661
ありがとう。きれいなコードですね。
実際の処理は>>655で書いたのと違い、
ちょっとごたついているんですが、
ファイルポジションを確保するやり方を使うことにします。
比較対象フィールド(複数)の保持だけなら
今回はメモリの制約にかからないので。

これは個人的な質問ではありませんが、
もし比較対象フィールドを確保しようとするだけで
メモリの制約にかかる場合は、どういうやり方が考えられるでしょう?
>>686さん
0692nobodyさん03/07/16 11:47ID:iP2fRAb3
自作CGIをwebで使用したいのですが
プロバイダはCGIの動作を見てから
使用許可を出すと言っています。
それで自宅サーバー構築を思い立ったのですが
自宅ではテスト環境が出来たんですが
先方に見せる事が出来ないんでしょうか。

CATVでプライベートIPアドレスとやらなので、
自宅サーバーを公開できない様ですが、本当ですか?

CGIテスト環境を貸してくれる所とかあるんでしょうか?

結構行き詰まってます。宜しく...。
0693nobodyさん03/07/16 11:49ID:???
自力でメモリマップドファイルみたいなもんを構築してそこで処理するとか。
0694nobodyさん03/07/16 11:52ID:???
>>693は>>691へのレスね。

>>692
動作確認する必要があるというなら、向こうでやってくれるんじゃないの?
どっかに置いてあるのを外から見ただけじゃ何もわからんと思うんだが。
0695nobodyさん03/07/16 11:55ID:???
>>692
そんなことはプロバイダと打ち合わせしてくれ
それにスレ違い
0696nobodyさん03/07/16 11:58ID:???
>>692
このスレで”CGI”という単語を書けるはずが無い。一回死んで来い。
069769203/07/16 12:32ID:iP2fRAb3
>>694
ありがとうございました。

>>695 >>696
逝ってきます。

・・だって初心者質問ってタイトルだったしー。(;.;)
0698nobodyさん03/07/16 12:43ID:???
初心者質問と書いてあれば、何でも受け付けるとでも思ってるのか。
そのうちお菓子作りの質問とかも来そうだな。
0699nobodyさん03/07/16 13:12ID:???
>>697
初心者板へGo!
0700nobodyさん03/07/16 13:13ID:???
>697
お前は初心者質問と書いてあったら、「801初心者質問スレ」でもCGIの質問をできるのか?
寝言は寝て言え。
0701nobodyさん03/07/16 15:23ID:F4EDEscp
push(@hoge,[@array]);
こうしたら、@hogeには@arrayのリファレンスが入ったんですけど、
[@array]って書き方は一体なんでしょうか。
0702nobodyさん03/07/16 17:06ID:???
>>701
[ ] は無名配列生成子。
@array のリファレンスを返しているのではなく、
(@array) というリストを生成し、そのリファレンスを返す。
0703nobodyさん03/07/16 20:47ID:???
[ ]
{ }
sub { }
070470103/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:AZTCTrFH
> あと、変数は基本的に局所化しようぜぃ。

use strict; すれば良いかと。これやって大域変数の使用を極力抑えれば
バグの入る余地をかなり減らせると思う。
0708nobodyさん03/07/17 13:11ID:???
>>706
さらにもう一声
@arrayRef = (['あ', 'い'], ['か', 'き']);
とサブルーチンをとっぱらってみるとか…
0709nobodyさん03/07/17 13:12ID:???
グローバル変数が気軽に使えるのがperlの利点なのに
0710nobodyさん03/07/17 13:29ID:???
そうかい?メモリは消費するし遅くなるしあまりいいとは思えないが
0711nobodyさん03/07/17 13:35ID:AZTCTrFH
>>709
使い捨ての書き捨てコードだったら俺もグローバル使いまくるけど、
大きいソースになったらバグが出やすいし保守しにくくなるよ。
0712あぼーんNGNG
あぼーん
0713 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:???
>>713
あなたの環境は?

> と入力し、
どこにどうやって入力したのか?

> IEで見てみると
どこを見たのか?

あまりに情報不足で答えようがありません
0715nobodyさん03/07/17 17:41ID:???
> #!/cygwin/bin/perl

この辺おかしい気がするんだが?
0716nobodyさん03/07/17 17:50ID:???
パーミッションは?
0717nobodyさん03/07/17 18:00ID:???
cygwinってなっててパーミッションはないだろ
0718nobodyさん03/07/17 18:01ID:???
cygwinだけでhttpdを入れていないに1票
0719nobodyさん03/07/17 18:03ID:???
>>709
ありえねー
0720nobodyさん03/07/17 18:19ID:???
>>718
うわ、それだったらステキ(藁
0721nobodyさん03/07/17 18:50ID:m6zrRyqW
質問です。
Perl、それもバージョン5.80以下で、
モジュールを使わずに、つまりライブラリで、
eucからUTF-8への変換をするにはどうしたら良いでしょうか?
0722 ◆hMJAPH9PWA 03/07/17 19:06ID:???
> モジュールを使わずに、つまりライブラリで、

モジュールだってライブラリなわけだが…
0723nobodyさん03/07/17 19:23ID:???
モジュールとライブラリの集合の関係が判らない
0724nobodyさん03/07/17 19:24ID:???
ライブラリだってモジュールなわけだが……


あれか、標準ライブラリと言いたいのか?
0725nobodyさん03/07/17 20:06ID:???
>>713
content-type: text/html の後に
\n\n わすれちょる・・・
とかマジレスしてみる・・・
0726nobodyさん03/07/17 20:06ID:???
>>725
\r\n\r\nだろと。
0727nobodyさん03/07/17 20:06ID:???
>725
ヒアドキュメントで2個分の改行が入ってるから無問題だろ
とかマジレスしてみる
0728nobodyさん03/07/17 20:25ID:???
content-typeって大文字小文字とか区別しないのか?
0729座敷荒氏03/07/17 20:27ID:???
以前こちらで相談し、スクリプトを作成しました。
パラメータファイルに書かれたファイルを削除するものです。
ファイル名*に対応できなかったので下記のように書き直して
テストでは問題なく成功したのですが
本番機ではなぜか一部のファイルを削除できずに
1を返して異常終了してしまいました。
原因や修正箇所を教えていただけませんか?


#! /usr/bin/perl

while (<>){
($cmd_para) = split;#パラメータファイルより確認対象取得
unless(unlink< $cmd_para >){#ファイルの削除
exit(100);#ファイルが削除できなければ異常終了
}
}
exit(0);#上記以外正常終了
0730nobodyさん03/07/17 20:32ID:???
>>729
$!でエラー内容取れない?
エラー内容がわからんと……
0731座敷荒氏03/07/17 20:38ID:???
>>730
即レスありがとうございます。

そうですね!
シェルから実行していてログみると
1で終了してるんですけど、
このスクリプトで1で抜けるってのが
ありえるのかと…

質問したのに情報欠けてますね。
もう一度調べて直して再度質問させてください。

宜しくお願いします。
0732nobodyさん03/07/17 21:42ID:CeuxGVu0
>>726アフォ皿仕上げ
0733あぼーんNGNG
あぼーん
0734nobodyさん03/07/17 21:55ID:???
>>732
RFC読めるようになってからまた来て下さい。
0735nobodyさん03/07/17 21:56ID:CeuxGVu0
>>734
お前ほどの無知は初めて見たよ
0736nobodyさん03/07/17 22:03ID:???
>>735
なんか知らんが嫌なことでもあったのか?
0737nobodyさん03/07/17 22:07ID:???
>735
「>725の間違いでした」とでも言っておけばよかったのに。
0738nobodyさん03/07/17 22:08ID:CeuxGVu0
>>736
うん。今日はパパンにレイプされたちゃったんです
0739nobodyさん03/07/17 22:12ID:???
>>738
今夜はお赤飯だな。
0740nobodyさん03/07/17 22:13ID:CeuxGVu0
>>739
カレー食べました
0741nobodyさん03/07/17 22:30ID:???
悪乗りも程ほどに
0742nobodyさん03/07/17 23:00ID:???
しっ。本人は人気者のつもりなんだから。
0743nobodyさん03/07/17 23:16ID:FCw7NcrO
がいうdぎうあsdんbをじぇわ

あだkdsんdlsdなksんだlんdさldあんだ

だdささ



藻前らアフォすぎ
0744あぼーんNGNG
あぼーん
0745nobodyさん03/07/18 03:23ID:???
@hoge = qw(a b c d e);
という中身の配列データを、
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);
と、追加書きさせるようにしてるんですが、はっきりいって無様な感じがします(´・ω・`)
こういう手段しか無いのでしょうか・・・
074674503/07/18 03:27ID:???
あ、なぜ一度空っぽにするかというと、
CGIのゲームのデータを記録するファイルなので、前のデータを残しておけないからです。

なにかいい方法があったら教えてください。よろしくおながいします。
0747nobodyさん03/07/18 03:33ID:NVnSzVH0
>>745

if(!open(OUT,">$file")){print "ファイルが開けません";}
print OUT join("\n", @hoge, "");
close(OUT);

こうか?
074874503/07/18 03:59ID:???
>>747
うわー バッチリです
ありがとうございます
たった3行にまとまるなんて・・・ヒデキ感激(つД`)
0749nobodyさん03/07/18 04:04ID:???
>>748
それの注意点としては一番最後の行には改行がつかない点。
最後に改行つけたければ
print OUT join("\n", @hoge, "")."\n";
とか
foreach(@hoge){print "$_\n" ;}
075074503/07/18 04:26ID:???
>>749
そうでしたか。
でも、もう一度ソースを見直したところ、
最後の行には改行なくても大丈夫だということがわかりましたので
今回は>>747を使わせていただきます。
重々(ー人ー)多謝
0751nobodyさん03/07/18 11:17ID:7SO5ZUkT
$message = qq|こんにちは\n|;

qq||; こういう書き方なんていうんですか。
■ このスレッドは過去ログ倉庫に格納されています