Perlコーディング初心者質問スレ Part 38
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/10/07 23:23:08ID:kiEzDCJF【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0266221
04/10/21 15:25:17ID:???「Win2000Pro ActivePerl5.6.1 AN HTTP Daemon 1.42k」という環境で実行してます。
実際に導入するのは、悪名高い@ni○tyのCGI鯖ですが。
「―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄.txt」
という、わざとらしく\x5Cを使った文字で構成されたファイル名を用意して、
このテキストファイル内の文字を検索して結果画面を出してみたところ、
<A href="%81%5C%83%5C%84%5C%87%5C%89%5C%8A%5C # 略 # .txt">―ソЫ\噂浬欺圭構 # 略 # .txt</A>
というHTMLが出力され、実際にそのリンクからファイルへアクセスできることは確認できました。
また、そのテキストファイル内に「―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄」という内容を書き、
同じく「―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄」で検索して正常に結果が表示されることから、
今のところは>>248氏の処理で半角カナを扱えない点以外での問題は無さそうです。
0267nobodyさん
04/10/21 15:43:18ID:???my @str = qw(
http://example.com/data/リンクの方法.txt
http://example.com/data/俺俺.txt
http://example.com/data/ハンカクカナA.txt
http://example.com/―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄.txt
);
s{([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])}{
my $chr = $1;
$chr =~ /^[\x00-\x7F]\z/
? $chr
: join('', map sprintf('%%%X', ord), split //, $chr)
}eg for @str;
print join "\n", @str;
# SEE ALSO: http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0268265
04/10/21 16:25:51ID:???エンコードは問題ないのにアクセスできないという不思議な現象に陥ってました
結局ANHTTPDに変更したらあっさり解決したのでApacheが悪かったようです
しかし何故Apacheじゃ見えなかったんだろう?
うーん気になるな・・・
0270nobodyさん
04/10/21 16:52:10ID:???for (@配列) { 〜 }
って、これって
foreach (@配列) { 〜 }
と繰り返す回数って違うの?
0271nobodyさん
04/10/21 16:57:06ID:???0272221
04/10/21 17:56:10ID:???が、肝心の 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:???サブルーチンという言葉の使い方が間違っているように思えてならない。
ひょっとして「子プロセス」とかそういうモノを指しているのか?
0276273
04/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:???ああわかった。それはあれだ。
use したファイルはコンパイル時に読み込まれて実行されるが、
require したファイルはコード実行時に読み込まれて実行される。
b が require された時点ではコンパイルがとっくに終っているので
b の中で use した a が実行される機会は永遠に巡ってこない。
0280278
04/10/21 22:31:20ID:???0281273
04/10/21 22:51:54ID:???require、use云々ではないかもしれません。
wait;ってのが気になってるのですが、
これはどうやって使えばいいのでしょうか?
ググッテも情報量がひっじょーに少ないとです。
ヒロシです
0282nobodyさん
04/10/21 23:06:49ID:???wait は子プロセスの終了を待つ関数なので、使えない
0283nobodyさん
04/10/22 10:48:37ID:???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:cSoqDRBP0287nobodyさん
04/10/22 11:42:34ID:Y4MW0wLE自分で実装するしかないのでしょうか?
0288nobodyさん
04/10/22 11:55:42ID:+fQGbTx6"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:???バイト列としてはちゃんとデコードできているが、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:???0293nobodyさん
04/10/22 13:33:16ID:???0294nobodyさん
04/10/22 14:27:39ID:pO/k5T0Yありがとうございます。
今からやってみます。(;;
0295nobodyさん
04/10/22 15:33:52ID:pO/k5T0Yありがとうございました!!!!!
0296nobodyさん
04/10/22 17:38:09ID:gkwMnLH6よろしくお願いします。
環境:FreeBSD 4.7 UNIX O/S
perl5.6.1
0297296
04/10/22 17:45:28ID:gkwMnLH6下手くそな文章で申し訳ありませんが、よろしくお願いします。
0298nobodyさん
04/10/22 17:54:42ID:???0300nobodyさん
04/10/22 18:02:41ID:???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
0301300
04/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
0303nobodyさん
04/10/22 19:26:58ID:???としたら、
apacheのエラーログにUnrecognized characterというエラーが表示されました。
どうも、テストという日本語に問題があるようですが、
この場合、どうすれば日本語を利用できるようになるでしょうか?
phpを以前ちょっといじっていて、htmlの組み込み安さに感動したんですが、
perlは結構面倒なんですかね?
0304nobodyさん
04/10/22 19:31:59ID:kB/Ig1ML0305nobodyさん
04/10/22 19:32:44ID:PwMLf+Ap$data=new CGI;
$name=$data->param('name');
$mail=$mail->param('mail');
$message=$message->param('message');
こうやって取り出したデータの中の文字は、
URLエンコードされたままではなく元に戻されているのでしょうか?
0307305
04/10/22 19:50:08ID:PwMLf+Apプリントしてみたら元に戻っていたので、あれ?と思ったんです。
今までずっと$name=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
やってたんですけど。
実は要らなかったのかなと思いまして。
実際どうなんでしょう?
ついでに、文字コードなんかはどうなっているのでしょうか?
0308nobodyさん
04/10/22 19:58:14ID:???0311nobodyさん
04/10/22 20:05:07ID:???漏れは敢えて「やってみなきゃわからんのは頭悪過ぎ。まず man を読め」と言うことにする
0313nobodyさん
04/10/22 20:56:34ID:???0315303
04/10/22 21:00:19ID:???だれかヘルプみー
0318nobodyさん
04/10/23 15:43:12ID:EsL8XLQNperlには、Cにおけるfprintfのような関数はないのでしょうか?
print FILE hogehoge;
というのが何行も続いてしまい、違和感を感じるのですが。
0319nobodyさん
04/10/23 16:40:33ID:???Perlは元々レポート作成用言語ディスよ?
fprintfに限らず、テキストの、文字入出力、ファイル入出力においての利便性は
Cとは比較にならんて。
ヒアドキュメントでも、format でも sprintf でも好きなもので対処すれば?
0320nobodyさん
04/10/23 16:41:54ID:???の「||」の意味が分かりません。
だれか教えてくださいませ
0321nobodyさん
04/10/23 16:43:05ID:???or と ほぼ同じ。 or よりも優先順位が高いので or と書いておいたほうが
意図どおり動くことが多いはずだよ。
0325nobodyさん
04/10/23 17:42:48ID:???sprintfで解決しました。
printする文字列を関数呼び出しで作成するというのは考えが及びませんでした。
どうもありがとうございました。
0326nobodyさん
04/10/23 19:41:00ID:???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:???いや、普通にできると思うけど。具体的にどうやってるか示されてない
のでこれ以上はなんともいえんがな。
でもmkdirのような引数しだいでどこにでもディレクトリ作れるコマンドを
sudoで許可するのはあまり感心しないな。
0329326
04/10/23 20:20:45ID:???としています。
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:???何か意味があるんですか?
0333nobodyさん
04/10/24 10:38:56ID:???perlコーディングには関係ないと思うんですが...
サザエさんの、来週もまた見てくださいねぇ〜、hogehugu が起源です。
0334nobodyさん
04/10/24 12:22:59ID:???0336nobodyさん
04/10/24 19:38:54ID:5pufjC0Pこちらを参考に、アップロードのCGIを作成しているのですが、
アップロードを行うと、同フォルダにゴミファイルのようなものが出来てしまいます。
これを、消す事は出来ないのでしょうか?
0337nobodyさん
04/10/24 19:40:35ID:???0338nobodyさん
04/10/24 20:14:53ID:5pufjC0P0340nobodyさん
04/10/24 20:38:56ID:5pufjC0Pはい、そうです。
0342nobodyさん
04/10/24 20:47:25ID:5pufjC0Pclose($filename);
close(OUT);
としたら、作成されないようになりました!(これで、大丈夫ですよね)
大変ありがとうございました。
0343336
04/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:???0346336
04/10/24 23:10:44ID:B/djfAD8renameの位置を変えて、色々といじったら、うまくいきました。
>>345
アドバイス、ありがとうございます!
度々申し訳ありません、もうひとつ質問させてください。
このコードでは、HTML部分でWinとMacを最初に入力するようにしていますが、
Winを使用しているのにMacを選択してしまった・・・と言う場合に、
何か不都合が発生するのでしょうか?
自分で試したところ、どちらでも特に問題なくアップできましたので・・・
できれば、この入力部分は省きたいと思っておりますので、
必要無い、との事でしたら削除しようと思っております。
0347nobodyさん
04/10/24 23:33:53ID:???0348nobodyさん
04/10/25 11:29:41ID:???それwindowsの話かな? unix系だとopen直後にunlinkしてプロセス終了時に
一緒になくなる一時ファイル作るってわりとありがちな手なんだけどね。
0349nobodyさん
04/10/27 07:17:45ID:???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:???openで失敗してるんだろ、$!参照(print"OpenErr:$! at ",__LINE__; )
たぶん、権限ナシと予想するが
つーか、別のドメインってリモートじゃないよな
0354nobodyさん
04/10/27 12:15:49ID:???えーと、見当違いなレスだったらすみません。
使用したいドメイン名は書けませんが、要は
○○○.com にあるファイルを ×××.net で読み取る…と言う事をしたいのです。
リモートではないです。
権限の方、確認してみます。
0355351
04/10/27 12:32:51ID:???>353さん
もちろんオープンで失敗していますので、エラーのメッセージとなります。
なので、オープン成功するにはどうしたら良いのかなーと。
そもそも無理なのでしたら仕方ないのですが、BLOG等では他の日記データとかを取り込んで
表示する仕組みとか有るみたいなので、どうにか方法はあると思うのですが…
もしPerl側の工夫で出来るなら、どうすればよいかヒントを頂けると助かります。
権限(ファイル置いているサーバ側の設定?)とかの変更が必要でしたら、
管理者に作業してもらおうと思います。
0356nobodyさん
04/10/27 13:13:09ID:???バーチャルホストか?
どうもそうじゃないように見えるんだけどな・・・
VHでやってるなら権限次第だな
そうじゃないなら質問内容をもうちょっと的確に書けるくらい勉強しよう
あと最低限>>1は必ず目を通そうな
0357351
04/10/27 13:37:48ID:???>>356さん
お手間おかけしましてすみませんでした…
もう少し勉強してきて、それでいて判らなければまたよろしくお願いします。
どうも有難う御座いました。
ちなみにバーチャルホストではなく完全に別ドメインのサーバで、
例えて言うと、”google.co.jp内の特定のファイル”を読むCGIを、
yahoo.co.jp内に設置したいのでした。
(読み込みたいファイルの名称やURLは固定のものです)
0359nobodyさん
04/10/27 17:10:04ID:???うざい
質問するレベル以前
つーか、open失敗する理由が、$!にセットされるから、先ずそれを表示させてみろ
まさか、open(IN,"http://www.yahoo.com/hoge")とかやってないだろうな?
0360nobodyさん
04/10/27 18:11:49ID:???0361nobodyさん
04/10/27 20:31:12ID:???0363nobodyさん
04/10/27 21:59:06ID:???use base 'EXPORTER';
use LWP::Simple;
our @EXPORT = ('open');
sub open{
}
ここまで書いた後は頼んだ>>364
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 (??????);
}
このような場合ってどうやってリターンすれば宜しいでしょうか??
■ このスレッドは過去ログ倉庫に格納されています