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

【Perl】初心者コーナー Part17

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆Go4ZKngPGE 02/10/14 17:24ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0577nobodyさん02/11/05 19:25ID:???
>>575
改行コードは\rと\nが混在してるから両方取り除くって事だろ?
057857502/11/05 19:42ID:???
>>576さん、577さんありがとうございました。
なんかややこしく考えてたみたい。助かりました。
0579nobodyさん02/11/05 19:44ID:???
一時間おきにCGIを実行する方法ってありますか?
0580nobodyさん02/11/05 19:48ID:???
>>568
perl はモジュールのパスを @INC という配列で覚えている。
ここにお望みのパスが登録されていなければ、スクリプト上で
モジュールを読み込む前に、パスを加えてやればいい。

BEGIN { unshift @INC, 'C:/JPL5005/LIB/PERL5' }
use IO::Select;

これと同じ事は

use lib 'C:/JPL5005/LIB/PERL5';

でもできるが、当然 lib.pm が見つからなければエラーになる。

>>571
require もファイル名だけ指定すれば @INC から探してくれる。

require 'jcode.pl'; # パスを明示しない

ファイル B や C がライブラリかモジュールなのなら、
@INC に登録されているディレクトリに置くか、
上述のようにパスを示してやればいい。単に設定ファイルを
ロードするような目的なら、絶対パス指定を薦める。
058157002/11/05 20:16ID:???


私にもレスください


0582nobodyさん02/11/05 20:22ID:???
>>570


わかりません

0583rubyist@カラアゲうまうま02/11/05 20:28ID:???
$/="-------------------";
正規表現は指定できない。awkならできる。
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> awk >>> perl
0584nobodyさん02/11/05 20:34ID:???
あとでsplitじゃだめなのか?
0585名無しさん02/11/05 21:41ID:Bk/NbLLY
ruby最強ruby最強ruby最強ruby最強ruby最強ruby最強ruby最強
ruby最強ruby最強ruby最強ruby最強ruby最強ruby最強ruby最強
ruby最強ruby最強ruby最強ruby最強ruby最強ruby最強ruby最強
ruby最強ruby最強ruby最強ruby最強ruby最強ruby最強ruby最強
ruby最強ruby最強ruby最強ruby最強ruby最強ruby最強ruby最強
0586nobodyさん02/11/05 22:13ID:???
rubyって何?
0587nobodyさん02/11/05 22:18ID:???
ruby最強、でいいんだけど、根拠がないとね。
対応するソースとか機能の紹介してくれれば
比較のやりようもあるんだけど、全然教えてくれないし。
0588nobodyさん02/11/05 22:20ID:???
rubyってそんなにいいの?
興味はあるんだけどなかなか気がすすまない
0589nobodyさん02/11/05 22:33ID:FHcnSReB
教えてください
他のサーバーにあるライブラリをcgiに読みこませたいんですけど、
単に
require "http://www.〜省略〜/test.pl";
と書いても読めません。

読みこめる方法はないでしょうか?
よろしくお願いします。
0590鮎川02/11/05 22:35ID:???
1995 AA倶楽部
1995 BB軍
1995 CCを考える会
1998 DDの協力会
1999 EE観察の会
1999 FFに親しむ会
1999 GGを守る会
2000 HHを探る会
2000 IIネットワーク
-------------------
を下のようにしたい。
-------------------
1995 AA倶楽部,BB軍,CCを考える会
1998 DDの協力会
1999 EE観察の会,FFに親しむ会,GGを守る会
2000 HHを探る会,IIネットワーク
-------------------
そこで、イメージとしては

for $i (1995 1998 1999 2000){

@year=$i;
push @year $_;

}
print @year;

のようなリズムで書きたいですが、これ以上、手が動きません。

だれか私を助けてください。

0591 ◆hMJAPH9PWA 02/11/05 22:41ID:???
>>589
HTTPなりFTPなりで取ってこないと無理だよ。
素直にコピーしてください。

>>590
年をキーにしてハッシュを使うといいよ。
0592鮎川02/11/05 23:16ID:???
イメージとしてはこんな感じでしょーか?

while (<>){
($name,$year)=split /:/;
$years{$year}=$name;
}


for $year (keys %years){
print "$year",$years{$year},"\n";
}
0593nobodyさん02/11/05 23:35ID:???
わかった、Rubyは最強、AWKも良い。
さぁPerlの話に戻そうか。
0594nobodyさん02/11/05 23:46ID:+eUS3bf8
すいません、Perlにおける無名参照というのは、やっぱりプログラム終了までにundefで開放しなければいけないのでしょうか。

$ref=[];
$ref=1; <-何かで上書きして参照を抹殺
↓
メモリリーク?
0595nobodyさん02/11/05 23:50ID:???
>>594
Perlにメモリリークなんてあるのか?
そもそもCのようにメモリを操作することはできないんじゃ・・・
0596 ◆hMJAPH9PWA 02/11/06 00:22ID:???
>>592
イメージ的にはそうだね。あと一歩、あと1byteあればとりあえず動きそう。

>>594
ガベージコレクションがあるから問題ないよ。それがPerlのいい所。
059759402/11/06 01:50ID:???
ありがとうございます!安心しました。
とりあえず、”ガベージコレクション”を検索してキマッス!(;゚Д゚)
0598nobodyさん02/11/06 09:17ID:???



CPANってなんて読むのですか?




0599nobodyさん02/11/06 09:22ID:???
「こっぺぱん」
0600nobodyさん02/11/06 10:03ID:???
grepコマンドではなくて、
ワンライナーでperlのgrep関数を使いたい時って、どんな時ですか?





0601nobodyさん02/11/06 11:47ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0602nobodyさん02/11/06 12:11ID:???
しーぱん。
0603nobodyさん02/11/06 13:59ID:3zAQzaHu
すいません、突然ですが質問させてください。

$eigyou_jikan{'土'} = "09:00-13:00";
$eigyou_jikan{'月火水木'} = "09:00-19:00";
$eigyou_jikan{'金'} = "09:00-21:00";

こういった連想配列のkeyを曜日順にソートして
書き出すにはどうしたらよいでしょうか?

曜日順ソートルーチンを作ったほうがよいのでしょうか?
0604nobodyさん02/11/06 14:33ID:???
sendmailでメールを送ります。
宛先が存在しないとfromに設定したアドレスに failure notice とかいう
メールが自動で来ますよね。
こういう風にアドレスが存在しない時cgi側で判断するにはどうしたらいいんですか?
0605nobodyさん02/11/06 14:38ID:???
何行目かのどっかにあるファイルポインタを
行頭に持ってくるワザってないですかね。
0606nobodyさん02/11/06 14:42ID:???
>>603
曜日は数字のままにしておいて出力する時に文字に変換するとか
0607nobodyさん02/11/06 14:48ID:???
>>604
送ってみなくちゃ分からない。
よって不可能。
0608nobodyさん02/11/06 15:18ID:???
>>607
いえ、えっと、送ってみて、
エラーメールが来たかどうかを知る動作を知りたいのです。
0609nobodyさん02/11/06 15:33ID:???
複数のチェックボックスで、チェックしたモノの値は変数にどのように格納されてきますか?
0610nobodyさん02/11/06 15:39ID:???
>>609
実際に出力してみれば…
0611nobodyさん02/11/06 15:42ID:???
>>609
チェックボックスはそれぞれバリュー値が違うと思いますが。
0612莫迦02/11/06 15:49ID:???
>>610
してみました。&で繋がれて出てきました。

>>611
はい。同グループのチェックボックスの値はどうやって取り出すのかなーと思って・・・。
0613nobodyさん02/11/06 15:58ID:???
1グループに対して一個しか受け取れんのか?
データは届いてるんだから考えれば出来ることだろ。
何でもかんでも人に頼ろうとするな!
0614nobodyさん02/11/06 16:00ID:???
↑ここは初心者が人に頼りに来るスレですけど。
>>612
&でsplitして=でsplitしてハッシュに突っ込んでkeyで取り出す。
0615莫迦02/11/06 16:00ID:???
えーっと、それで、どうやって取り出しますか?
ひとつ考えたのは、データの受け取り時にname(=$key)が前の$keyと同じだったらなんかやって取り出す、
みなさんどうしますか?

>>613
そんな怒らないでくださいよ。最良の方法はなにかなーと思ってるだけですよ。
0616nobodyさん02/11/06 16:26ID:???
foreach $pair (@pairs){
 ($key,$value) = split(/=/,$pair);
 $value =~ tr/+/ /;
 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 $value =~ s/"/"/g;
 $value =~ s/</</g;
 $value =~ s/>/>/g;
 $value =~ s/\r\n|\r|\n//g;
 $value =~ s/\,/,/g;

 if($key eq "チェックボックスのname"){
   push(@checkbox_name,$value);
 }else{
   $FORM{$key} = $value;
 }
}
こうだったっけな、とにかくそれだけは取得する時にnameを見て別の配列に入れればよかったんだと思う。
0617nobodyさん02/11/06 16:34ID:???
つーか普通checkboxのnameはバラバラにする。同じにするのはradio。
同じグループ(複数回答可の選択式質問など)だとしてもnameをq1-1とか付ければ良いだろ。

Perlが録に出来ないのならHTMLで工夫しろよ。
0618nobodyさん02/11/06 16:45ID:???
この程度のことで何故そこまでエラそうに出来るのか
やっと自分でもわかる質問が来たからここぞとばかりにしゃしゃりでましたって勢いだな
0619nobodyさん02/11/06 16:59ID:???
実際にCGIスクリプト書いたことがあれば、同じname使いたいことって良くある。
>>617は、Perl使ったこと無いのがばればれです。
0620nobodyさん02/11/06 17:09ID:???
>>618-619 ハイハイ, 腐れチョンは日本語の勉強してから来いや。
0621nobodyさん02/11/06 17:12ID:7IPFijFP
PerlとCGIってどう違うんですか?
062262102/11/06 17:14ID:7IPFijFP
あ、IDチョトカコイイ
0623nobodyさん02/11/06 17:15ID:???
データをカンマで区切って保存しているのですが、
ローカル側では全データ読み込めるのにサーバー側では最後の行しか読み込めません。
何が原因なのでしょうか?
0624nobodyさん02/11/06 17:18ID:???
>>623
そのスクリプト書いてみ
0625nobodyさん02/11/06 17:22ID:???
>>623
改行コードの違いと見た。
でもソース見ないことには分からんな。
0626nobodyさん02/11/06 17:26ID:???
>>620
つけあがった態度しか取れない厨房はまず日本でのコミュニケーションの仕方を学んでおいで
>>621
CGIはperlに限らない
>>623
改行コードでしょうな
0627nobodyさん02/11/06 17:28ID:???
>>626 お前がつけあがってる。
0628nobodyさん02/11/06 17:33ID:???
オマエモナー系のレスが飛びだしてる様は人種の特徴を絵に描いたようだねぇ。。
0629( ̄ー ̄)y-.。o○02/11/06 17:36ID:???
この板はさつばつとしておりやがりますねぇ。
0630nobodyさん02/11/06 17:38ID:???
>>619
初心者のみなさんはこんな真似はしないようにね。
スクリプトをちょっとだけ省略できるかもしれないけど、
チェックボックスはnameが違うことが重要な意味を
持つので、これを同じにして後で困るのは非常に
おばかさんのすることですよ。
0631nobodyさん02/11/06 17:38ID:???
【Perl】厨房コーナー Part 1
0632nobodyさん02/11/06 17:40ID:???
>>630=617?
>>617の厨房度は置いといて、>>630には同意。
0633nobodyさん02/11/06 17:59ID:???
>>608
たとえMX引いてあて先のSMTP直接たたいた場合でも、そこからさらに転送している場合などは
送ってみなけりゃわからない。
063461902/11/06 18:09ID:???
>>630
http://www.w3.org/TR/html401/interact/forms.html#checkbox
を読んでください。
英語が読めないなら
1つのFORM内で多くのcheckboxが同じcontrol nameを共有してよいと書いてあります。
0635nobodyさん02/11/06 18:09ID:???
>>630にはほぼ同意だが、同じ名前を持つこと自体は禁止されてない。
CGI::では名前がぶつかるとリストで格納していたと思ったが、今確認できる状況に無い。
063661902/11/06 18:17ID:???
1つのnameに複数のvalueを持たせるときにcheckboxを使うんであって、
1つのnameに1つのvalueだったらradiobuttonがあります。
0637nobodyさん02/11/06 18:27ID:???
「してもよい」と「するべき」は全く違うことが分からない人がいるな。
063861902/11/06 18:42ID:???
>>637
本当に複数選択の場合に一個一個、別のnameつけてるんですか。
意味がないというか、よけい無駄な処理が増えるだけのような気がするんですけど。
同じnameにした方がすっきりするので私は好きです。
0639(´ー`)y━~~02/11/06 18:54ID:???
ひとりで騒いでるPerl初学者がいるスレはここですか?
0640しつこくてスマソ02/11/06 19:00ID:???
CGI.pm のマニュアルだと、
> @turned_on = $query->param('group_name');
で、同じ name のチェックボックスの値を取れる
と書いてあります。

cgi-lib.pl だと、"\0" で区切られるんだっけ?
0641x02/11/06 19:03ID:???
普通かどうかはわからないが、name 同じにして論理和でやったほうがやりやすい

と思うな。 値を2の巾乗にしてさ。
0642nobodyさん02/11/06 19:15ID:???
>本当に複数選択の場合に一個一個、別のnameつけてるんですか。

場合による。君みたいに一方的に決め付けるのは危険すぎる。
0643nobodyさん02/11/06 19:17ID:???
HTML 4.01 勧告読んで由
0644nobodyさん02/11/06 19:24ID:???
なんかw3cが、、、HTMLの勧告が、、、とか本題からズレてるんですが。

最初の質問者は受け取り方分からないんだからname別々にすりゃいいんでねぇの?
0645nobodyさん02/11/06 19:38ID:???
別々にするか、>>616のやり方で配列に入れるか、>>640のように区切って格納するか、
いろいろありますね。
0646nobodyさん02/11/06 20:25ID:???
確かcgi-lib.plだと、\0で区切って連想配列に入れてるんだっけ?
0647nobodyさん02/11/06 20:26ID:???
>>646
って既出でした。すいません。
064859202/11/06 21:50ID:???
ぼくのナイス質問が

埋もれてしまった


064959202/11/06 22:58ID:???
配列のハッシュを使ってやろうとしてますが、
うまくいきません。何処がいけないのでしょうか?

while (<>){
($name,$year)=split /:/;
chomp $year;
$years{$year}=[ $name ];
}


for $year (keys %years){
#push(@years,$year);
print "$year",@{$years{$year}},"\n";
}
065059202/11/06 23:02ID:???
データデス。


AA倶楽部:1995
BB軍:1995
CCを考える会:1995
DDの協力会:1998
EE観察の会:1999
FFに親しむ会:1999
GGを守る会:1999
HHを探る会:2000
IIネットワーク:2000
0651 ◆hMJAPH9PWA 02/11/06 23:06ID:???
>>649
惜しいけど今ひとつ足りない
# ちなみにそれは配列のハッシュではなくハッシュの配列ね。

$years{$year} = [$name];
これは次のコードに相当するんだよ
@{$years{$year}} = ($name);
これじゃ配列に要素を追加しているとは言い難いでしょ。
065262302/11/06 23:34ID:???
指摘された通り改行コードで引っかかってました。感謝。
0653nobodyさん02/11/07 01:11ID:???
すいません、一応過去ログ見たけどなさそうなので伺いたいのですが・・・

多重起動をさせないようにする常套手段って言ったらどうするんですかね?
個人的には自分自身($0)を読み取りで開いて排他ロック
 open (LOCKMYSELF, "< $0");
 flock(LOCKMYSELF, 6) or die;
とかやってたんですけど、SolarisだとOSの都合で読み取りオープン時は
排他ロックが掛けられない(共有ロックは可)らしいし、かといって
書き込みオープン("+< $0")とかは何となくコワイし…。

あと思いつく手といったら、別のどうでもいいファイルを用意して排他ロックを
試みるとか、system関数でpsとgrep使って調べるとかくらいしかないんですけど、
何かスマートな方法ってありませんか。
#そういう目的のモジュールでもあれば手っ取り早いんですけどね。
0654nobodyさん02/11/07 01:28ID:???
>>653
> とかやってたんですけど、SolarisだとOSの都合で読み取りオープン時は
> 排他ロックが掛けられない(共有ロックは可)らしいし、

やっぱりそうなんだ。漏れは知らなくて、flock() を
コメントアウトしたまま動作してるプログラムが一つ
あるよ(w

UNIX ドメインソケットを使ってプログラムの実行を
逐次化する話は、何かで見たような気がする。ブロッ
クしちゃうかな。
0655nobodyさん02/11/07 01:30ID:???
>>653
素人意見で申し訳ないんだけど、
漏れならダミーファイル作ってそいつがあったら強制終了、なかったら通常通り起動ってするな・・・。
素人だからそれくらいしか出来ないって突っ込みな無しで・・・。
0656nobodyさん02/11/07 01:44ID:???
>>655
ダミーファイルつかまんまPIDファイルじゃないのか? それは。
/var/run/hoge.pid って。
0657nobodyさん02/11/07 02:59ID:???
ループ処理
1 while s///;
の1なんですが、
マッチしなくなるまでループを続けるらしいですが、
一体どこでマッチしないって見切りをつけてるんでしょうか?

質問の意味もよく分かりませんね・・。
0658nobodyさん02/11/07 05:18ID:???
条件式が偽になればそこが見切り
見切りをつける場所がなければ延々とループし続けてやがてマシンが落ちる
065959202/11/07 10:22ID:???
できました。でも、見栄えがよくない。
@{$years{$year}}を
,
とかスペースで分割して表示するにはどうすればいいでしょうか?

---------------------------
while (<>){
($name,$year)=split /:/;
chomp $year;
push @{ $years{$year} }, $name;
}


for $year (sort keys %years){
print "$year",@{$years{$year}},"\n";
}
0660 ◆hMJAPH9PWA 02/11/07 10:53ID:???
>>659
おめでとう。特に無駄な処理はしていないし、いいと思うよ。
強いてあげれば
($name,$year)=split /:/; は my($name, $year)=split /:/; の方が
他の場所にある(グローバルな)$nameや$yearを破壊してしまわないので望ましいね

配列要素をカンマ区切りで出力するには、一般にjoin($sep, @list)を使えばいいよ。
単にスペースで区切ればいいならダブルクォートの中に入れるだけでいいけどね。
0661nobodyさん02/11/07 11:26ID:???
配列からハッシュを作って初期化してるんですけど、

{ map { $_, 1 } @list }

は
どんな時に使いますか?

サンプルキボン
0662nobodyさん02/11/07 13:09ID:???
ファイル名の最後に塗る文字をつけるってどういう意味ですかぁ?

find . -name '*% find . -name '*.bak' -print0 | perl -n0e unlink

改行"\n"とは違って?



0663nobodyさん02/11/07 13:24ID:r3gS0+P5
スカラー変数が配列にマッチするかどうかは
どうやって調べればいいですか?
以下のように書いてもNGになっちゃって・・・

@array = ("taro", "jiro");
$name = "taro";

if (@array =~ /$name/) { print "OK\n"; }
else { print "NG\n"; }
0664nobodyさん02/11/07 13:43ID:???
if (grep(/\Q$name\E/, @array)){
0665nobodyさん02/11/07 14:06ID:???
perlの中でローカルの任意のディレクトリを指定したい時は、(例えばデスクトップのhogeフォルダ)
$hogedir = 'C:\Documents and Settings\Administrator\デスクトップ\hoge\';
こうやって、最後に\を入れるとエラーになります。

$hogedir = 'C:\Documents and Settings\Administrator\デスクトップ\hoge';
最後の\を取ると正常になります。
最後の\は付けちゃいけないルールなんでしょうか。
0666nobodyさん02/11/07 14:09ID:???
>>665
$hoge = 'aaaaaaaaa\'aaaaaaaaaaaaa';
print $hoge;

の結果を見てみれ。何故エラーになったか分かるから。
0667nobodyさん02/11/07 14:09ID:???
>>665
そのスクリプトを見ないことにはなんとも言えない
066866602/11/07 14:11ID:???
あと

$hogedir = 'C:\Documents and Settings\Administrator\デスクトップ\hoge\\';

とやればお望みの結果になるかと。
0669nobodyさん02/11/07 14:42ID:???
>>662
null文字( ´∀`)つ\0

>>663
foreach (@array) {
  if (/$name/) { OK }
  else { NG }
}
0670nobodyさん02/11/07 14:53ID:???
ttp://ha1.seikyou.ne.jp/home/ikkyu/works/perl/sample.html#TransferHANKAKU

にある
「引数の全角数字を半角数字に変換する」

って方法はかなり厨ですかぁ?

もっとスマートな方法キボン

0671nobodyさん02/11/07 15:17ID:???
素直にjcode.plかJcode.pm使えば?
0672nobodyさん02/11/07 15:32ID:???
sub start{
my @a = ("あ","い","う");
my $b = "B";
&tugi("@a","$b");
}

sub tugi{
my (@hairetu,$hensu) = @_;
}

こうすると@hairetuに渡された引数が全部入ってしまいます。
仕方なく、
my @hairetu = $_[0];
my $hensu = $_[1];
とやっていますが、引数が多くなった時は大変です。
どうすればうまく引数を受け取れますか。
067367202/11/07 15:35ID:???
すいません、
my @hairetu = $_[0];
my $hensu = $_[1];
もダメでした(汗
@hairetuに "あ い う" こういう感じで配列が一個になってしまいました。
0674nobodyさん02/11/07 15:49ID:???
sub start{
my @a = ("あ","い","う");
my $b = "B";
&tugi($b, @a);
}
sub tugi {
my ($hensu, @hairetu) = @_;
}

or

sub start{
my @a = ("あ","い","う");
my $b = "B";
&tugi(\@a, $b);
}
sub tugi {
my ($tmp, $hensu) = @_;
my @hairetu = @{$tmp};
}
0675nobodyさん02/11/07 17:47ID:???
${$foo}{bar}
が
$foo->{bar}
と書ける理由は何でしょうか?
0676nobodyさん02/11/07 17:54ID:???
$foo = \%foo; の場合
%foo と %{$foo} は同じ。
よって $foo{bar} と ${$foo}{bar} は同じ。

$foo{bar} と $foo->{bar} は同じ。

だから ${$foo}{bar} と $foo->{bar} は同じ。
■ このスレッドは過去ログ倉庫に格納されています