トップページ⇒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
061160803/07/14 04:50ID:???
>>610
Windowsって開発に使ったことないけど、Windows版のperlってperldoc同梱されてないん?
0612nobodyさん03/07/14 05:37ID:???
>>611
もちろん同根されてますよ
0613nobodyさん03/07/14 09:58ID:???
>>612
話題出たついでに。これの日本語版って無いの?
0614nobodyさん03/07/14 10:11ID:???
4ac - b**2 = 0
0615nobodyさん03/07/14 11:20ID:???
みんなlinux使ってるの?
0616nobodyさん03/07/14 11:31ID:???
ターゲットはUNIX系が多いけど、開発は大抵Windowsでやってるよ。

で、Windows版にもperldocはある。
というかインスコしたディレクトリのbin見れ。色々入ってるから。
あとhtml以下もな。
0617nobodyさん03/07/14 11:48ID:???
>>616
だから、それの日本語版が欲しいんだが
0618nobodyさん03/07/14 11:50ID:???
判らなくなったらいつもとほほに繋いでるな
0619nobodyさん03/07/14 12:24ID:???
perlからunixコマンドを呼び出せない環境なので、
unlink<./tmp/*>が使えないのですが、
別の手段(opendir?)で、

./tmp/* にあるファイルを削除する方法はないでしょうか?
0620 ◆hMJAPH9PWA 03/07/14 12:46ID:???
>>617
perldocの日本語版はないけど、有志で翻訳しようというプロジェクトがあるよ。
http://perldocjp.sourceforge.jp/

>>619
標準モジュールのFile::Pathを使う。
0621nobodyさん03/07/14 12:55ID:???
unix使ってる人多いのかなぁ。
0622nobodyさん03/07/14 14:11ID:???
>>615
端末はWindows。FreeBSDにtelnetで繋いでviで書いてる。
0623nobodyさん03/07/14 14:41ID:???
レンタルサーバの引越しをしたのですが。
SSIの動作が異なっているために実行されません。。

SSI実行時のカレントディレクトリが異なっているようです。

サーバ側の設定などで修正は可能ですか?
ファイルの修正は多すぎて大変なので・・・。

解決策をご存知の方教えてください。
0624nobodyさん03/07/14 14:54ID:???
>>623
CGI: Common Gateway Interface part 11
http://pc2.2ch.net/test/read.cgi/php/1055597189/l50
0625nobodyさん03/07/14 15:08ID:???
@tmp = sort { (${ORG[$a]->{adanaid}} <=> ${ORG[$b]->{adanaid}}) } 0 .. $#ORG;
foreach (@tmp) {
    print 'person='. $ORG[$_]->{person}. "\n";
    print 'adana='. $ORG[$_]->{adana}. "\n";
    print 'adanaid='. $ORG[$_]->{adanaid}. "\n";
}

で、
なぜ、sortのときには
${ORG[$a]->{adanaid}}
なのに、printのときは、
$ORG[$_]->{adanaid}
のようになるのでしょうか?

つまり、なぜ
@tmp = sort { ($ORG[$a]->{adanaid} <=> $ORG[$b]->{adanaid}) } 0 .. $#ORG;
ではダメなんでしょう?

このときの{}にはどんな意味があるのでしょうか?
0626nobodyさん03/07/14 16:31ID:hPGUS4Ez
if文で、$a,$b,$c,$d,$e の中に
0の数字が4つ入っていた場合と
指定したいんですが、
どうやれば良いのか、教えて下さい。
0627nobodyさん03/07/14 17:06ID:???
if(&{sub{my $count=0;foreach(($a,$b,$c,$d)){if(m/0/){$count++;}}return $count==4;}}){
    #..
}
0628nobodyさん03/07/14 17:12ID:???
>>626
>>561
0629 ◆hMJAPH9PWA 03/07/14 17:20ID:???
>>625
${ARRAY[$index]->{$key}} は $ARRAY[$index]->{$key} と同じ。
だからダメな理由なんて何も無い。
疑問に思ったら自分で確かめてみようね。

ちなみにその{}はデリファンレンスの為の構文。
リファレンスは便利だから、ちゃんと知ったっておいたほうがいいよ。

# というか、そんな奇怪な構文があったなんて知らなかった…

>>626
なんか二行目から三行目への文の流れがおかしいよ。意味がわからない。
投稿する前に文を見直したほうがいいよ。
0630nobodyさん03/07/14 17:31ID:???
>>627 どういう結果期待してるの?

・4つの 0 が入っている変数を全て知りたい
・どれでもいいから、入っているかどうか知りたい

@poo = ( $a, $b, $c, $d );
foreach ( @poo ) {
print "Found.\n" if ( /0{4,4}/ ) ;
}
0631nobodyさん03/07/14 17:33ID:???
print grep( /0{4,4}/, ( $a, $b, $c, $d ) );

これでもいけるだろ。
0632nobodyさん03/07/14 17:37ID:???
質問者の日本語がおかしすぎる

>>1 の

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:こんなエラーが出て上手く行かなかった。

これを示してくれ。最低でも




      1: 自 分 は こ う 言 う 事 が し た い。




って事をはっきりと解りやすく書いてくれ
0633nobodyさん03/07/14 17:49ID:???
1: 自分はこのスレをかき回したい
2: それで意味不明な質問を書き込んでみたが、
3: スルーされてうまくいかなかった
0634nobodyさん 03/07/14 20:20ID:???
>>625

@tmp = sort { (${ORG[$a]->{adanaid}} <=> ${ORG[$b]->{adanaid}}) } 0 .. $#ORG;

ここ

@tmp = sort { $_[$a]->{'adanaid'} <=> $_[$b]->{'adanaid'} } @ORG;

のほうがよかないか?
063563403/07/14 20:49ID:???
>>625
あと、続きもこうなるな・・・

foreach (@tmp) {
    print 'person='. $_->{person}. "\n";
    print 'adana='. $_->{adana}. "\n";
    print 'adanaid='. $_->{adanaid}. "\n";
}

取敢えず、リファレンスの使い方がおかしいということで・・・
0636nobodyさん03/07/14 21:28ID:???
sortの書き方からして、ド素人のコード。
0637nobodyさん03/07/14 21:45ID:???
何もやらずにツッコミだけして去る方が恥ずかしいと思うけどな
0638nobodyさん03/07/14 22:01ID:???
なんでそんなこと書くのかなぁ…

って思ってたら間違いに気づいた。
@tmp = sort { $a->{adanaid} <=> $b->{adanaid} } @ORG;

それと、
${ARRAY[$index]->{$key}}
についてだけど。これは、${hogehoge}の発展形で、
文字列をデリファレンスした時のことを言うソフトリファレンスだとも言えるけど、
Perlのマニュアルには、曖昧さをなくすためのものです。って書いてあるから、
その、デリファレンスという言い方は少しおかしい。
0639 ◆hMJAPH9PWA 03/07/14 22:07ID:???
う〜ん。確かにその式では{}はデリファレンスと直接は関係ないね。
他に適当な言葉が思いつかなかったからさ。

それにしても
${ARRAY[$index]->{$key}}
ってよく使われるんだろうか?
一瞬なにやってるのか分からなかったよ。
0640nobodyさん03/07/14 22:12ID:???
そうせざるを得ない時しか括らないなぁ。
0641nobodyさん03/07/14 22:13ID:???
全部推測で書いたんだけど、、、
そもそも、その書き方は正しいのだろうか…
0642nobodyさん03/07/14 22:15ID:???
あ。OKだった。
0643nobodyさん03/07/14 23:18ID:???
>>636 スレタイすら読めないヴァカ
0644nobodyさん03/07/15 00:09ID:???
粘着か...
0645nobodyさん03/07/15 00:43ID:???
>>639
こういう時は使う。
http://pc2.2ch.net/test/read.cgi/tech/1053053082/146-148n

私ゃ普段からデリファレンスは常に %{$hash_ref} みたく冗長に書くなぁ。
その方が入れ子になった時でも統一感が出る。

ソフトリファレンスを使う時は no strict 'refs' が入るし
%{"$hash_name"} みたくダブルクォートや . 演算子使って明示。
0646nobodyさん03/07/15 01:22ID:m9/vaFbn
粘着としかいえないヴァカはけーん
早くも夏房の季節ですか(プゲラ
0647nobodyさん03/07/15 02:57ID:???
アクセス者のプロバイダ名を取得しようとしています。

if ($ENV{REMOTE_HOST} eq $ENV{REMOTE_ADDR} or $ENV{REMOTE_HOST} eq '') {
$HOST
= gethostbyaddr(pack('C4',split(/\./,$ENV{REMOTE_ADDR})),2)
or $ENV{REMOTE_ADDR};
} else {
$HOST = $ENV{REMOTE_HOST};
}
という感じで、$ENV{'REMOTE_HOST'}に相当する文字列を抜き出す所までは
できるようになったのですが、そこからドメイン名のみを抜き出す方法が
思いつかず、困っています。

上の文の直後に
if ($HOST !~ /jp$/i) {
&jpigai();
}
といった分岐を入れたので、$HOSTに代入される文字列は全て"*.xxxx.??.jp"
といった形式だと思ってください。
その"*.xxxx.??.jp"の、xxxxの部分のみを取得して、別の変数に入れて
おきたいということです。

後方6文字目のピリオドから、次のピリオドまでの範囲を抜き出すことになるので
後方一致の$を使えば、なんとかなるのではないか?、という所までは
今の所思いついているんですが、そこから先がどうにも……。

perlを触って、まだ間もない者ですが、宜しくお願いします。
0648nobodyさん03/07/15 04:04ID:???
($a, $b) = $HOST =~ /\.([^.]+)\.([^.]+)\.jp$/;
064964703/07/15 06:37ID:???
>>648
おおお……しかもご親切なことに、$bの中には!

([^.]+)の部分、1週間近く悩んでも、自分で書けなかったんです。
正規表現の勉強が、まだ全然足りていないようです。
今も、書いて下さった部分を、首っ引きで調べています。

2つの()でグループ化しておいて、$a, $bで参照しているんだな、という
所まではわかりました。$1や$2でなくても大丈夫なんですね。
[^.]+は…任意の一文字以外の文字列の、一回以上の繰り返し…でしょうか(自信なし)。

ともあれ、ここから先は、自力で調べることにします。
本当にありがとうございます。
0650nobodyさん03/07/15 08:21ID:???
>>649
> [^.]+は…任意の一文字以外の文字列の、一回以上の繰り返し…でしょうか(自信なし)。
ちょとちがう。

がんがれ。
0651nobodyさん03/07/15 10:13ID:???
オレも某超有名入門サイトで覚えたから、最初、[ ](文字クラス)いまいち理解できなかったなぁ。
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:???
そうかい?メモリは消費するし遅くなるしあまりいいとは思えないが
■ このスレッドは過去ログ倉庫に格納されています