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

Perlコーディング初心者質問スレ Part 38

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/10/07 23:23:08ID:kiEzDCJF
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0269nobodyさん04/10/21 16:33:29ID:???
>>225で言ってるのがヒントのヨカン
0270nobodyさん04/10/21 16:52:10ID:???
すいません、色々見てて気になったんだけど、
for (@配列) { 〜 }
って、これって
foreach (@配列) { 〜 }
と繰り返す回数って違うの?
0271nobodyさん04/10/21 16:57:06ID:???
何 で や っ て か ら 聞 か な い ?
027222104/10/21 17:56:10ID:???
>>267氏、これで正常に動きました。感謝します。

が、肝心の s{ 以下の処理の部分が何をしているかが不明なので、ちょっとまだ導入できないです・・・
? と : が if else って事くらいしかわからない上に、色々と省略された書き方をされているようなので、
理解には時間がかかりそうです。
一文字ずつ分解して、[\x00-\x7F]以外のものはordで数値変換してsprintfで16進数に書き出しているということですよね。
splitを消すと\x5Cがおかしくなるようですが、何の処理をしているかもまだ理解の範疇にはないようです。

省略した書き方とかしたこと無いんで、冗長なコーディングしか出来ない自分が悲しい・・・
あと、省略できるものも極力省略しないという書き方をしているので(自分が理解できなくなると困るので)、
このソースをもとに何とか書き換えて実装してみようと思います。
0273nobodyさん04/10/21 20:11:32ID:a34sr5QL
作業に若干時間がかかるスクリプトを単体で起動させると問題ないのですが、
サブルーチンとして起動させると、作業を終える前に次のコードに移ってしまいます。
これはどうやって防げばいいでしょうか?
0274nobodyさん04/10/21 20:52:06ID:???
何も考えないで書くけど、
そのサブルーチンの最後に何かフラグを立てて、
それが立ってなければ待つってのは?
0275nobodyさん04/10/21 21:15:46ID:???
話がよく見えないのだが、
サブルーチンという言葉の使い方が間違っているように思えてならない。
ひょっとして「子プロセス」とかそういうモノを指しているのか?
027627304/10/21 21:40:12ID:a34sr5QL
すいません、正しくはモジュールかもしれません。
いわゆる.plファイルです。
aというモジュールがあります。
b(.pl)というモジュールからaをuseしてます。
.cgi からbモジュールをrequireすると、aモジュールの作業を完了しないまま、
bモジュールの次のコードに移ってしまいます。
.cgiにから直接aモジュールをuseしたら、問題は
発生しませんでした。
0277nobodyさん04/10/21 22:08:58ID:???
ますます混迷の度合いが深まってきた気がする...
0278nobodyさん04/10/21 22:14:52ID:???
>>276
ああわかった。それはあれだ。

use したファイルはコンパイル時に読み込まれて実行されるが、
require したファイルはコード実行時に読み込まれて実行される。

b が require された時点ではコンパイルがとっくに終っているので
b の中で use した a が実行される機会は永遠に巡ってこない。
027927304/10/21 22:21:30ID:a34sr5QL
>>277
ちょとわらた
>>278
改善策ありますか?
028027804/10/21 22:31:20ID:???
b から a を use でなく require(+import) すれば良いんでないかと思うが試してない
028127304/10/21 22:51:54ID:???
require してみますたが、変わらずでした。
require、use云々ではないかもしれません。
wait;ってのが気になってるのですが、
これはどうやって使えばいいのでしょうか?
ググッテも情報量がひっじょーに少ないとです。
ヒロシです
0282nobodyさん04/10/21 23:06:49ID:???
use や require は同一プロセス内での呼び出しだが、
wait は子プロセスの終了を待つ関数なので、使えない
0283nobodyさん04/10/22 10:48:37ID:???
Cだと入力がCtrl+D(windowsはCtrl+Z)だとプログラム終了ってのを
if (nyuryoku == '\0') {exit(0);}
て書けるけど、perlだとどう書きますか。以下の何入れても
quer!が出ちゃうんです。
$var=<STDIN>;
chomp($var);
if ($var eq "\0") {
exit(0);
} else {
print "quer!\n";
}
0284nobodyさん04/10/22 10:50:06ID:cSoqDRBP
上げておきますね^^
0285nobodyさん04/10/22 11:17:20ID:???
>>283
行入力演算子(<>)はEOFでは未定義値を返すので、

if (!defined $var) {
028628304/10/22 11:23:46ID:???
>>285
どうもだす。それで行けますた。
0287nobodyさん04/10/22 11:42:34ID:Y4MW0wLE
DBI.pm には Mysql.pm にあった fetchcol() メソッドがないみたいですが
自分で実装するしかないのでしょうか?
0288nobodyさん04/10/22 11:55:42ID:+fQGbTx6
例えば "掲示板" という文字、UTF-8でエンコードすると

"E6%8E%B2%E7%A4%BA%E6%9D%BF"
となると思います。

そして本来UTF-8のコードである "E6%8E%B2%E7%A4%BA%E6%9D%BF" を誤って
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/ge;
でデコードすると

"牙ず? "

となってしまいます。
この "牙ず? " を元のUTF-8のコード "E6%8E%B2%E7%A4%BA%E6%9D%BF" に戻すには
どのように処理したらいいのでしょうか?
どなたか教えて下さい。


0289nobodyさん04/10/22 12:20:13ID:???
>>288
バイト列としてはちゃんとデコードできているが、utf8として解釈すべき
バイト列をEUCだと思って見てるから変に見えるだけじゃない?

EUCで表示したければ適当にutf8→eucに変換すればいい。

use Jcode;

$str = "%E6%8E%B2%E7%A4%BA%E6%9D%BF";
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/ge;

print Jcode->new($str)->euc,"\n";
0290nobodyさん04/10/22 12:45:55ID:pO/k5T0Y
すみません、教えて下さい。

手持ちのマニュアルで16進定数の記述方法が

$a='/abcd';

となっていたので携帯用絵文字を定義しようとしたのですが、

print $a;

をやると、/abcdと出てしまいます。

' を " に変えたり色々してみたのですが上手くできません。
正しい16進定数の代入の仕方を教えて下さい。m(__)m
0291nobodyさん04/10/22 13:17:36ID:???
バックスラッシュの間違えじゃないのか
0292nobodyさん04/10/22 13:17:37ID:???
$a= 0xabcd;
0293nobodyさん04/10/22 13:33:16ID:???
教則本だと\がバックスラッシュとかになるから気をつけれ
0294nobodyさん04/10/22 14:27:39ID:pO/k5T0Y
>>291-293さま
ありがとうございます。
今からやってみます。(;;
0295nobodyさん04/10/22 15:33:52ID:pO/k5T0Y
できましたー。
ありがとうございました!!!!!
0296nobodyさん04/10/22 17:38:09ID:gkwMnLH6
web上のファイル(複数)をperlを使って圧縮・サーバー上に保存、することはできますか?
よろしくお願いします。

環境:FreeBSD 4.7 UNIX O/S
perl5.6.1
029729604/10/22 17:45:28ID:gkwMnLH6
web上、サーバー上と表記しましたが、両方とも同じ自分がレンタルしているwebサーバーのことです。
下手くそな文章で申し訳ありませんが、よろしくお願いします。
0298nobodyさん04/10/22 17:54:42ID:???
ttp://homepage3.nifty.com/hippo2000/perltips/perllha.htm
0299nobodyさん04/10/22 18:01:00ID:???
>>298
それは笑う所ですか?
0300nobodyさん04/10/22 18:02:41ID:???
>>296-297
http://perldoc.com/perl5.8.4/pod/func/system.html
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=tar&dir=jpman-4.7.0%2Fman§=1
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq8.html#How_can_I_capture_STDERR_from_an
030130004/10/22 18:07:22ID:???
むぅ。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=tar&dir=jpman-4.7.0%2Fman&;sect=1
030229604/10/22 18:39:07ID:???
>>298
>>300
ありがとうございます。
これから見に行って勉強してみます。
0303nobodyさん04/10/22 19:26:58ID:???
print qq|<TITLE>テスト</TITLE>|;
としたら、
apacheのエラーログにUnrecognized characterというエラーが表示されました。
どうも、テストという日本語に問題があるようですが、
この場合、どうすれば日本語を利用できるようになるでしょうか?
phpを以前ちょっといじっていて、htmlの組み込み安さに感動したんですが、
perlは結構面倒なんですかね?
0304nobodyさん04/10/22 19:31:59ID:kB/Ig1ML
age
0305nobodyさん04/10/22 19:32:44ID:PwMLf+Ap
use CGI;
$data=new CGI;
$name=$data->param('name');
$mail=$mail->param('mail');
$message=$message->param('message');

こうやって取り出したデータの中の文字は、
URLエンコードされたままではなく元に戻されているのでしょうか?
0306nobodyさん04/10/22 19:41:09ID:???
>>305
プリントしてみりゃいいだろ
030730504/10/22 19:50:08ID:PwMLf+Ap
>>306
プリントしてみたら元に戻っていたので、あれ?と思ったんです。
今までずっと$name=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
やってたんですけど。
実は要らなかったのかなと思いまして。

実際どうなんでしょう?
ついでに、文字コードなんかはどうなっているのでしょうか?
0308nobodyさん04/10/22 19:58:14ID:???
(´-`).。oO(なんで自分で確かめられないんだろう)
0309nobodyさん04/10/22 20:02:09ID:???
>>303
エスケープ文字について勉強しなおすことをすすめる
0310nobodyさん04/10/22 20:03:26ID:???
>>309
qqについて勉強しなおすことをすすめる
0311nobodyさん04/10/22 20:05:07ID:???
何にでも「自分でやってみて確かめろ」と返す人は多いが
漏れは敢えて「やってみなきゃわからんのは頭悪過ぎ。まず man を読め」と言うことにする
0312nobodyさん04/10/22 20:07:35ID:???
>>311
チラシの裏にでも書いてろ
0313nobodyさん04/10/22 20:56:34ID:???
最近のチラシは両面印刷です
0314nobodyさん04/10/22 20:57:46ID:???
>>313
プリントの裏にでも書いてろ
031530304/10/22 21:00:19ID:???
調べましたが、やぱーりわかりません。
だれかヘルプみー
0316nobodyさん04/10/22 21:01:36ID:???
>>312-313
すまん、ワロタw
0317nobodyさん04/10/22 22:03:02ID:???
>>315
全角スペースでも入ってるんじゃないのか?
0318nobodyさん04/10/23 15:43:12ID:EsL8XLQN
すいません、質問です。
perlには、Cにおけるfprintfのような関数はないのでしょうか?

print FILE hogehoge;

というのが何行も続いてしまい、違和感を感じるのですが。
0319nobodyさん04/10/23 16:40:33ID:???
>>318
Perlは元々レポート作成用言語ディスよ?

fprintfに限らず、テキストの、文字入出力、ファイル入出力においての利便性は
Cとは比較にならんて。

ヒアドキュメントでも、format でも sprintf でも好きなもので対処すれば?
0320nobodyさん04/10/23 16:41:54ID:???
if(hoge||hogehoge){

の「||」の意味が分かりません。
だれか教えてくださいませ
0321nobodyさん04/10/23 16:43:05ID:???
>>320
or と ほぼ同じ。 or よりも優先順位が高いので or と書いておいたほうが
意図どおり動くことが多いはずだよ。
0322nobodyさん04/10/23 16:43:06ID:???
>>320
演算子
0323nobodyさん04/10/23 16:53:18ID:???
>>320
()だらけでウザイ時に良く使う。
0324nobodyさん04/10/23 17:39:11ID:???
>>319
318は printf FILE ほげほげ と書けることを知らないに一票。
0325nobodyさん04/10/23 17:42:48ID:???
>>319

sprintfで解決しました。

printする文字列を関数呼び出しで作成するというのは考えが及びませんでした。
どうもありがとうございました。
0326nobodyさん04/10/23 19:41:00ID:???
mkdir使うみたいに sudo mkdir を
perlで利用することは不可能でしょうか?
権限ないディレクトリにはディレクトリ作成できなかったので、
sudoで特定のユーザにmkdirの権限与えたのはいいものの、
perlで使おうとしても使えないんですね。
telnet経由しかむりぽなのでしょうか?
0327nobodyさん04/10/23 19:55:17ID:???

コーディング 【coding】

プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
(e-Wordsより)

自分の質問がPerlに関することなのか、
それともPerlではなくCGIやHTMLについてなのかを切り分けした上で、
質問して下さい。
0328nobodyさん04/10/23 19:55:48ID:???
>>326
いや、普通にできると思うけど。具体的にどうやってるか示されてない
のでこれ以上はなんともいえんがな。

でもmkdirのような引数しだいでどこにでもディレクトリ作れるコマンドを
sudoで許可するのはあまり感心しないな。
032932604/10/23 20:20:45ID:???
perl で my $makedir = `sudo mkdir $user_dir/new`;
としています。
aユーザからbユーザのディレクトリに newというディレクトリ
を作成するようにしていますが、
上記ではうまくいきません。
bユーザディレクトリの権限をaユーザのものにし、
my $makedir = `mkdir $user_dir/new`;
とした場合は問題なく作成されます。

宜しくお願いします
0330nobodyさん04/10/23 22:28:08ID:???
池沼には、それがコーディングの問題じゃないということがわからないのだろうか?
0331nobodyさん04/10/23 23:18:04ID:???
もういいよこの類に触るのはやめやめ
次の質問よろ
0332nobodyさん04/10/24 10:16:22ID:???
hogeほげって何ですか?
何か意味があるんですか?
0333nobodyさん04/10/24 10:38:56ID:???
>>332
perlコーディングには関係ないと思うんですが...
サザエさんの、来週もまた見てくださいねぇ〜、hogehugu が起源です。
0334nobodyさん04/10/24 12:22:59ID:???
サザエさんはfugafuguだろ。うそ教えるなよhage
0335nobodyさん04/10/24 13:34:27ID:???
>>332
ttp://kmaebashi.com/programmer/hoge.html
0336nobodyさん04/10/24 19:38:54ID:5pufjC0P
http://www.harukaze.net/~mishima/perl/module/upload_by_CGI_pm.html

こちらを参考に、アップロードのCGIを作成しているのですが、
アップロードを行うと、同フォルダにゴミファイルのようなものが出来てしまいます。
これを、消す事は出来ないのでしょうか?
0337nobodyさん04/10/24 19:40:35ID:???
消せばいいんじゃない?
0338nobodyさん04/10/24 20:14:53ID:5pufjC0P
すいません、消すと言うか、もとから作成されなくするって事は出来ないでしょうか?
0339nobodyさん04/10/24 20:36:57ID:???
>>338
ごみファイルってCGITemp?????とか言うやつ?
0340nobodyさん04/10/24 20:38:56ID:5pufjC0P
>>339
はい、そうです。
0341nobodyさん04/10/24 20:40:37ID:???
>>340
print(OUT $file);
close(OUT);

この間に一工夫いる。
CGITempでぐぐるといいよ。
0342nobodyさん04/10/24 20:47:25ID:5pufjC0P
print(OUT $file);
close($filename);
close(OUT);

としたら、作成されないようになりました!(これで、大丈夫ですよね)
大変ありがとうございました。
034333604/10/24 21:57:58ID:B/djfAD8
アップロードに関して、もう一件質問させてください。

アップロードしたファイルの名前を変更したいのですが、

print(OUT $file);
rename("$filename", "123456.xls");
close($filename);
close(OUT);

と、したのですが、これでは駄目なのでしょうか?
試してみたところ、上手くいきませんでした。
0344nobodyさん04/10/24 22:08:01ID:???
ファイルの名前変えるのはファイル閉じてから。
0345nobodyさん04/10/24 22:18:07ID:???
>>343
ハンドル持ってると操作が限定されるよ。
試しにopenしてから何秒かsleepさせて、その間に削除しようとしてみ。
034633604/10/24 23:10:44ID:B/djfAD8
>>344
renameの位置を変えて、色々といじったら、うまくいきました。

>>345
アドバイス、ありがとうございます!

度々申し訳ありません、もうひとつ質問させてください。
このコードでは、HTML部分でWinとMacを最初に入力するようにしていますが、
Winを使用しているのにMacを選択してしまった・・・と言う場合に、
何か不都合が発生するのでしょうか?
自分で試したところ、どちらでも特に問題なくアップできましたので・・・

できれば、この入力部分は省きたいと思っておりますので、
必要無い、との事でしたら削除しようと思っております。
0347nobodyさん04/10/24 23:33:53ID:???
3度続くと流石に答えてもらえなくなる。
0348nobodyさん04/10/25 11:29:41ID:???
>>345
それwindowsの話かな? unix系だとopen直後にunlinkしてプロセス終了時に
一緒になくなる一時ファイル作るってわりとありがちな手なんだけどね。
0349nobodyさん04/10/27 07:17:45ID:???
UTF-8 の判別、EUC へ変換などをしたので Jcode を利用したいのですが、
Jcode.pm をスクリプトに同梱して配布したとしても
サーバ側でインストールがされていないと使えないものなんでしょうか?
この辺の仕組みがよくわかりません……。
0350nobodyさん04/10/27 07:53:40ID:???
色々漁ってたらなんとなくわかってきました。
とりあえずインストールしてなくても動かすことはできるみたいですね。
スレ汚しすみません。
0351nobodyさん04/10/27 09:59:20ID:???
すみません、質問させてくださいませ。
とあるドメインから、別のドメインのディレクトリ一覧、及びファイルの読み込みを行いたいのですが、
下記のようにするとオープンエラーになります。
(改行が多いと言われたので、次に書きます)

別ドメインのディレクトリ内容やファイルの取得は出来ないのでしょうか?
もし可能でしたら方法を知りたいのですが、お教えいただけませんでしょうか?

0352nobodyさん04/10/27 09:59:56ID:???
--------------------------------------------

# ディレクトリの一覧を取得

if( !opendir(DIR,"CGIを設置しているところとは別のドメインのディレクトリ") ){
print"OpenErr";
}else{
foreach $file( readdir(DIR) ){
print "$file<BR>\n";
}
closedir(DIR) ;
}

--------------------------------------------

# ファイルの中身を取得

if (!open(IN,"CGIを設置しているところとは別のドメインのファイル") ){
print"OpenErr";
}else{
@data = <IN> ;
foreach $file(@data){
print "$file<BR>\n";
}
close(IN) ;
}

--------------------------------------------
0353nobodyさん04/10/27 11:42:36ID:???
>>351
openで失敗してるんだろ、$!参照(print"OpenErr:$! at ",__LINE__; )
たぶん、権限ナシと予想するが

つーか、別のドメインってリモートじゃないよな
0354nobodyさん04/10/27 12:15:49ID:???
>353さん
えーと、見当違いなレスだったらすみません。
使用したいドメイン名は書けませんが、要は
○○○.com にあるファイルを ×××.net で読み取る…と言う事をしたいのです。
リモートではないです。

権限の方、確認してみます。
035535104/10/27 12:32:51ID:???
連続ですみませんです。

>353さん
もちろんオープンで失敗していますので、エラーのメッセージとなります。
なので、オープン成功するにはどうしたら良いのかなーと。

そもそも無理なのでしたら仕方ないのですが、BLOG等では他の日記データとかを取り込んで
表示する仕組みとか有るみたいなので、どうにか方法はあると思うのですが…

もしPerl側の工夫で出来るなら、どうすればよいかヒントを頂けると助かります。
権限(ファイル置いているサーバ側の設定?)とかの変更が必要でしたら、
管理者に作業してもらおうと思います。
0356nobodyさん04/10/27 13:13:09ID:???
>>351=354-355
バーチャルホストか?
どうもそうじゃないように見えるんだけどな・・・

VHでやってるなら権限次第だな
そうじゃないなら質問内容をもうちょっと的確に書けるくらい勉強しよう

あと最低限>>1は必ず目を通そうな
035735104/10/27 13:37:48ID:???
>>353さん
>>356さん
お手間おかけしましてすみませんでした…
もう少し勉強してきて、それでいて判らなければまたよろしくお願いします。
どうも有難う御座いました。

ちなみにバーチャルホストではなく完全に別ドメインのサーバで、
例えて言うと、”google.co.jp内の特定のファイル”を読むCGIを、
yahoo.co.jp内に設置したいのでした。
(読み込みたいファイルの名称やURLは固定のものです)
0358nobodyさん04/10/27 14:57:41ID:???
>>357
LWP::Simple(モジュール)とかプロトコルについて勉強すると幸せになれるかも
0359nobodyさん04/10/27 17:10:04ID:???
>>351
うざい
質問するレベル以前
つーか、open失敗する理由が、$!にセットされるから、先ずそれを表示させてみろ

まさか、open(IN,"http://www.yahoo.com/hoge")とかやってないだろうな?
0360nobodyさん04/10/27 18:11:49ID:???
質問文をちゃんと読めよ
0361nobodyさん04/10/27 20:31:12ID:???
(´-`).。oO(LWP を open に override してくれる神の光臨待ち。。。)
0362nobodyさん04/10/27 20:56:50ID:???
>>361
そういうライブラリはあればあったで便利かもしれんな。
0363nobodyさん04/10/27 21:59:06ID:???
package LWP::Open;

use base 'EXPORTER';
use LWP::Simple;
our @EXPORT = ('open');

sub open{

}
ここまで書いた後は頼んだ>>364
0364 ◆7CWqH7Oesg 04/10/27 22:34:08ID:???
use LWP::Simple;
use subs qw(open);
*open= sub { get($_[0]); };
$url="http://www.hogehoge/";
$data= open($url);
0365nobodyさん04/10/28 01:47:21ID:GkfPSbvy
たびたび申し訳ないが、ちょっと教えて下さい

ハッシュのリストを作ってはみたものの
どうやってサブルーチンから出せばいいのかわからなくなりました。

sub XXX{

push @{ HoA{key_name} }, "value1", "value2";

return (??????);
}

このような場合ってどうやってリターンすれば宜しいでしょうか??
0366nobodyさん04/10/28 02:07:20ID:GkfPSbvy
というか、リストのハッシュと言ったほうがよさそうだ。
0367nobodyさん04/10/28 08:40:21ID:???
>>365
先にサブルーチンへリファレンスを渡してからゴリゴリするのが常套かと。
0368nobodyさん04/10/28 08:42:07ID:???
push @{$HoA{key_name} }, "value1", "value2";

こう?

return \%Hoa;

で、

$refHoA->{key_name}->[0]
■ このスレッドは過去ログ倉庫に格納されています