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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0412nobodyさん04/12/20 22:28:11ID:???
ここはperlコーディングスレです。
041340904/12/20 23:10:03ID:???
>>410
さんきゅーです。
0414nobodyさん04/12/21 00:58:35ID:???
>>411
自分のPCからFTPクライアントが使えないのか、shからもFTP出来ないのか、
>>412って事だから、この際PerlでFTPクライアント組んじゃえ。
そしたら自分でFTPサーバ立てれば(もしくはどっかにUP)、shから落とせるな。
Net::FTP使えば、ワンライナー程度でも十分いけそうな感じ?
ま、別にFTPにこだわる理由は無いのだが・・・
041541104/12/21 01:59:02ID:???
>414

レス有難うです。
とりあえず入力補完があるらしいemacsで頑張ります。
非武装サーバにログインして、そこからssh経由で開発サーバに接続
という2段構えになっていて、どっちのサーバも設定触れないので・・。

スレ違い申し訳ない。平にご容赦を。
0416nobodyさん04/12/21 06:35:50ID:???
>>415
scpとか。
コピペでviに流し込むとか(teratermだと無理かな?)。

Unix板の方が適切なレスもらえると思うけど。
0417nobodyさん04/12/21 20:22:36ID:???
perl/tkはここでいいですか?
0418nobodyさん04/12/21 22:20:45ID:???
Web関係ないなら
Perlについての質問箱 14箱目
http://pc5.2ch.net/test/read.cgi/tech/1101649274/
0419nobodyさん04/12/22 01:13:08ID:???
kermitなりxmodemで転送できない?
0420nobodyさん04/12/22 02:02:21ID:???
sshつかえるならscp使えるだろ?
Windows上からアップしたいならWinScp使えば?
0421nobodyさん04/12/22 19:14:08ID:PL97VF7o
「;」区切りのCSVファイル(10行あったとします)があったとして、それを1行ずつ読み込んで、それぞれ別々の
配列に格納したいのですが、なかなか上手くいきません・・。
全部グローバル変数とかでやるなら、
open FH '<', "data.csv";
$i = 0;
while(<FH>){
chomp;
$count = sprintf("data%03d", $i);
@$count = split(/;/);
$i++;
}
close(FH);
と記述して一応は出来たのですが、最近use strict;なるものを知ってからは全く手が出なくなってしまいました。
どういった記述をすれば別々の配列に格納することが出来るのでしょうか?
まだuse strict;について全然理解していない段階で聞くのもどうかと思ったんですが、思い切って書いてみました。
説明も上手く出来なくて申し訳ありませんが、何かご指導お願いできないでしょうか。
よろしくお願いいたします。
0422nobodyさん04/12/22 19:23:36ID:???
>open FH '<', "data.csv";
何これ???
0423nobodyさん04/12/22 19:52:33ID:???
>>422
きっと参考にしたプログラムの"data.csv"の部分が
"$file"とかになっててその名残であろう。
0424nobodyさん04/12/22 19:56:26ID:???
>>421
エラー嫁。
strictの意味は調べりゃ出てくんだろ。
0425nobodyさん04/12/22 20:06:11ID:???
>「;」区切りのCSVファイル

ワラタ
0426nobodyさん04/12/22 20:16:19ID:???
>>421
strictすると変数名を勝手に使えなくなるんだよ!
だからこれ以上質問を続けないでね!
0427nobodyさん04/12/22 20:45:13ID:???
>>421
配列の配列を使う。

my @count;
open(FH, '<', "data.csv") or die $!;
while(<FH>){
chomp;
push(@count, [ split(/;/) ]);

# これはこんな意味
# my @dummy = split(/;/);
# push(@count, \@dummy);

}
close(FH);

アクセスするには?
$count[$i]->[$attr]; # 明快
$count[$i][$attr]; # 同じ意味だけど、私は嫌い

例えば$count[1]->[1]とは?
$count[1]に配列のリファレンスが入っているので、
それを->[1]を使いデリファレンスする
ということ。

http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldsc.html#LISTS_OF_LISTS
0428nobodyさん04/12/22 21:11:51ID:???
>>427
おーい…
0429nobodyさん04/12/22 22:48:45ID:???
use strict下では、シンボリックリファレンスが使えない。
>>427の通りで出来ると思うけど、こっちもついでに >
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html
0430nobodyさん04/12/22 22:56:49ID:???
>>421の希望は「別々の配列に格納」だぞ。
ま、なんとなくそういう前提で書こうとしてるだけの気はするけどな。
どうしてもそうしなければならない理由はいくら考えても思いつかないし。
0431nobodyさん04/12/23 00:32:14ID:???
お教え願います。
use strictを記述すると 変数名に型宣言をしないとエラーが表示される
ということで、早速以下のようにコードを書いて試してみたのですが
エラーがまったく出ずに
ブラウザには「test : 0」と通常通り表示されるのみです。
何故エラーが出ないのでしょうか。

#!/usr/bin/perl -w
use strict;
$a = 0;
print "Content-type: text/html\n\n";
print "test : " . $a;
0432nobodyさん04/12/23 00:37:33ID:???
$aだから出ないのですよ。
0433nobodyさん04/12/23 00:40:02ID:???
>>431
キャッシュを見ている。
043443104/12/23 00:45:14ID:???
お教えの通り
$aでなく$abcにしたら見事エラーがでてページが表示されませんでした。
知りませんでした…
ありがとうございました。
0435nobodyさん04/12/23 00:49:46ID:???
ちなみに$bも出ない。
つーかperldocに思いっきり書いてあるから。
0436nobodyさん04/12/23 00:52:21ID:???
>>435
これですね。
Because of their special use by sort(),
the variables $a and $b are exempted from this check.
0437nobodyさん04/12/23 01:25:35ID:???
>>434
多分、なんでそうなるのかを考えなければプログラム技術はのびない。
0438nobodyさん04/12/23 01:48:55ID:???
正論だとは思うが。
となると本当に極めるにはPerlのソース読むが一番と。
ま、確かにそうだな。
0439nobodyさん04/12/23 09:45:17ID:???
>>436
俺も知らなかった。一文字変数は$iしか使わないしなぁ。
0440nobodyさん04/12/23 14:15:05ID:???
4.999〜と9を15回続けると5未満の判定が出るのはもちろんだが、
9を16回(4.9999999999999999)繰り返すとなんで5以上の判定なんだ。

print "数値を入力: ";
$value = <stdin>;
chomp ($value);

if ($value >= 5)
{
print "5以上\n";
}
else
{
print "5未満\n";
}
0441nobodyさん04/12/23 14:49:47ID:???
釣り?
0442nobodyさん04/12/23 15:00:41ID:???
>>440
0を足してみれば分かるかも。
$value = 4.9999999999999999;
print(0+$value);

Perlの内部で値を正しく表現できないと表現誤差が出る。

そういうときは、
use bignum;
を宣言する。
0443nobodyさん04/12/23 15:37:47ID:???
なるほど
0444nobodyさん04/12/23 23:37:19ID:a8M2UJvQ
レンタルサーバーで
使いたいモジュールが入ってるか調べたいのですがどうやって調べられますか?
0445nobodyさん04/12/23 23:41:49ID:???
PHP::Perlinfo
0446nobodyさん04/12/23 23:59:18ID:???
CookieをIE6に食わせることが出来ません。
expires値も食わせてるし、IEの設定をヤワにしても駄目。
Firefox1.0はちゃんと食ってるんですが…。
IEに独特な制約とかって、ありましたっけ。
0447nobodyさん04/12/24 00:21:09ID:???
>>446
ここはコーディングスレですが?
ま、間違ってりゃなんだってうまくいきませんけど。
0448nobodyさん04/12/24 00:37:53ID:???
>>447
ん、IEに食わせるのに必要なコーディングが
あるのかと思ったんですけども。
なんか変なこと訊いてますかね…。
0449nobodyさん04/12/24 00:41:28ID:???
>>448
じゃあ

正しいヘッダを吐くようにコーディングすればIE6でも食ってくれます。
0450nobodyさん04/12/24 00:58:03ID:???
>>445

use PHP::Perlinfo;
perlinfo();

こうやってみましたけど、500エラーになっちゃいました。
0451nobodyさん04/12/24 01:13:46ID:???
>>450
Perlinfo.pmを入れてあるのか?
0452nobodyさん04/12/24 01:22:25ID:???
>>449
正しいヘッダですか(つーことはFf1.0は正しくなくても食うのか…)。
とりあえず、ありがとうございます。
045344604/12/24 01:47:51ID:???
>>449
正しく書いたら動きました。
というか記載できてると思ってたものが抜けてました。orz
本当にありがとうございます。
0454nobodyさん04/12/24 08:09:11ID:o66Ux/q0
画像ファイルをアップロードさせたときに、縦横のサイズを取得す方法はありますでしょうか?
やりたいことは、画像ファイルをアップしてもらったときに、その画像を表示させる際、widthとheightの指定をするために、数値が必要なのです。

表示する際に取得しても、アップされたときに取得してdatファイルに書き込んでもどちらの方法でもいいんですが、
いいやりかたがありましたらお教え下さい。
0455nobodyさん04/12/24 08:22:07ID:???
http://www.google.co.jp/search?hl=ja&q=perl+%E7%94%BB%E5%83%8F+%E3%82%B5%E3%82%A4%E3%82%BA+%E5%8F%96%E5%BE%97&lr=

Image::Magickが使えるならもっとお手軽。
045645004/12/24 10:56:48ID:tsjI5bY5
>451
だからレンタルサーバーだからわかりませんて。
0457nobodyさん04/12/24 11:24:35ID:???
>>456
別に.pm無くても調べれるし、そういうスクリプトも配布されてるけどな。
てめーのその書き方が気に入らないから教えない。
勝手に調べろ。どーせすぐ見つかる。
0458nobodyさん04/12/24 11:42:50ID:???
>456
RPM使うのが手っ取り早いんじゃ?
0459nobodyさん04/12/24 12:48:02ID:???
>>425
コンマ セパレーテッド バリュー ではなくて
コロン セパレーテッド バリュー なんだろうな。
0460nobodyさん04/12/24 13:10:40ID:???
>>456
@INCのディレクトリでも読み込んでろグズ
0461nobodyさん04/12/24 13:21:51ID:???
そもそも500エラーでエラーログ見ないのは終わってる。
0462nobodyさん04/12/24 13:30:52ID:???
おまえの次のセリフは「レンタルサーバーだから見れません」という!
0463nobodyさん04/12/24 13:36:23ID:???
「レンタルサーバーで必要なモジュールが入っているかどうか調べたい」
-> レンタル業者のサポートセンターに電話して確認汁

「500エラーになってしまいます」
-> レンタル業者のサポートセンターに電話してエラーログを教えてもらう


一番確実、簡単、早いヽ(゚∀゚ )ノ
0464nobodyさん04/12/24 13:48:24ID:???
デバッグ中はさんざんガイシュツだが

use CGI::Carp qw(fatalsToBrowser);

を頭の方にいれとくだけでエラーメッセージが
ブラウザに出るようになるからかなりやりやすく
なると思うのだが。
0465nobodyさん04/12/24 17:25:57ID:???
だから、サーバ上でデバッグするなよと(ry
0466nobodyさん04/12/24 17:30:09ID:???
Cygwinでやってるけど、無理やりCygwinにインストールしたimagemagickが案の定まともに動いてくれなくて、
結局サーバでやるしか無い場合もちらほら。
0467nobodyさん04/12/24 20:30:06ID:???
>>466 coLinuxとか。
0468nobodyさん04/12/24 21:08:00ID:???
>>466
ActivePerl ならリポジトリに以下のサイトを加えると PPM で入るな。
http://www.bribes.org/perl/ppm
0469nobodyさん04/12/24 22:32:19ID:cTzXcA78
sendMailでメールを送信したいのですが、うまくいきません。
通常のPC宛には正常に届きますが、ドコモに送ることができません。
画面上ではエラーにはなりません。
携帯のドメイン指定受信は間違いありません。

require "jcode.pl";
$mailer = '/usr/lib/sendmail';

$mlfrom = '[email protected]';
$mlto = '[email protected]';
$mlsb = "件名";
$body = "ほげほげ";

jcode'convert(*mlsb, "jis");
jcode'convert(*mlms, "jis");
$mlhd = "From: $mlfrom" . "\n" . "To: $mlto" . "\n" . "Subject: $mlsb" . "\n\n";
$err = 0;

open(MAIL, "| $mailer -t") or $err = 1;
if ($err == 0) {
print MAIL $mlhd;
print MAIL $mlms;
print MAIL $body;
close(MAIL);
$msg = 'メール送信正常に処理しました。';
} else {
$msg = 'メール送信エラー';
}
0470nobodyさん04/12/24 23:08:26ID:???
ドコモはスパムブロッカーで送れない。
0471nobodyさん04/12/24 23:12:43ID:cTzXcA78
それはsendmailで送れないということですか?
前に、Net::SMTPとかいうの使ったら送れたんですが・・・。
0472nobodyさん04/12/24 23:13:38ID:cTzXcA78
てゆーか、携帯にメール送るシステムってどこにでもありますよね・・・?
0473nobodyさん04/12/24 23:20:03ID:???
「メール送信正常に処理しました。」なのに届かないのなら、
sendmailのログを見ろ。これ以上はperlいじってもわからない。

「メール送信エラー」になるのなら、$!を表示させるべし。

0474nobodyさん04/12/24 23:23:02ID:???
・ドコモの場合は送れても遅れることがある(数時間や数日は珍しくない)
・送信を規制しているIPアドレスがある(らしい)
・スクリプトを実行しているドメインは$mlfrom と一致しているか?
0475nobodyさん04/12/25 13:35:49ID:???
base64
0476nobodyさん04/12/25 15:46:52ID:???
>469

$bodyはjis変換しないの?
$mlmsってどっから出てきた?
MIME-VersionとかContent-typeとかのヘッダー付けないの?


ちなみにbase64使って件名を変換するならこれでいいはず・・・

use MIME::Base64;
&jcode'convert(*mlsb, 'jis');
$mlsb = encode_base64($mlsb);
$mlsb =~ s/\n//g;
$mlsb = "=?ISO-2022-JP?B?" . $mlsb . "?=";
0477nobodyさん04/12/25 16:12:32ID:???
>>476
http://www.din.or.jp/~ohzaki/perl.htm#JP_Base64
0478nobodyさん04/12/25 23:20:20ID:bFVNXg4w
あるディレクトリの全てのファイルのパーミッションを一括で変換したいのですが
chmod 0777,<*>;
単純にやるならこれで大丈夫なものの、
ディレクトリ > ディレクトリ > ファイル
のように階層が深くなると書き方が判りません。
何か定石はないでしょうか?
0479nobodyさん04/12/25 23:31:08ID:???
>>478
http://www.itmedia.co.jp/help/tips/linux/l0647.html
0480nobodyさん04/12/25 23:36:48ID:???
>>478
PerlでやりたけりゃFile::Findが楽。
048147804/12/25 23:49:48ID:bFVNXg4w
>>479
ありがとうございます。
ただ、Perlでの記法が知りたいのです。
言葉足らずで申し訳ありません。
0482nobodyさん04/12/26 00:16:31ID:???
form要素でdatファイルに書き込みをするようにしたんですが、
type="file"を使うときはenctype="multipart/form-data"にしろ、とあったので、
form要素にそれを記述したら、書き込み自身できなくなりました。
サーバーによってファイルのアップロードができない、とかそういうのはあるんでしょうか?
0483nobodyさん04/12/26 00:22:40ID:???
>>482
マルチパートに対応した方法でよまないとだめ。
0484nobodyさん04/12/26 00:32:26ID:???
>>483
そうなんですか。
その言葉をヒントに調べてみます。
048548204/12/26 01:58:00ID:???
調べて読んでみましたが、絶望的に分かりませんでした。
データの受け取り方がテキストとは違うようですね。
0486nobodyさん04/12/26 02:11:01ID:???
>>485
フォームからCGIへ値を渡す時、何を使ってデコードしてるんだい?
CGI_Lite.pmあたりを使ってりゃ、問題は無いはずだよん。
0487nobodyさん04/12/26 02:14:01ID:???
ソースはりゃいいだろ
048848204/12/26 02:24:06ID:???
>>486
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else { $buffer = $ENV{'QUERY_STRING'}; }
とやって、$bufferを散々弄繰り回しておりました。

type=fileを使うのは初めてなので緊張してます。

CGI_Lite.pmというものを探して使い方を勉強してみます。
有難う御座いました。
048948204/12/26 03:25:48ID:???
cgi_lib.plというのを使って、バイナリデータを拾うところまで出来ました。
あとは、これを画像ファイルとして生成するだけなんですが、
GIF89aから始まる文字列の中のどこに元々のファイル名が含まれてるんでしょうか。
抽出方法がありましたら教えてくださいますようお願い致します。
単純に文字列の中には見つかりませんでした。
0490nobodyさん04/12/26 03:28:57ID:???
意図的にコメントなどで埋め込まない限りファイル名なんて入ってねーよ
049148204/12/26 03:31:54ID:???
>>490
回答有難う御座います。
ということは、<input type="file">のパスを抽出出来るようにしなくちゃいけないわけですね。
なんだかいろいろ見えてきたような気がします。頑張ります。
0492nobodyさん04/12/26 04:28:34ID:???
しなちくも何も、 cgi_lib.plの中身を読めばいいだろ。
0493nobodyさん04/12/26 09:31:51ID:mhqMgdk4
教えてください。

PHPからperlをexecで実行させる処理を書いてるのですが
perlスクリプトへの引数で
エスケープが必要な文字ってなにがあるのでしょうか?

試した限りでは
" は \"
\ は \\
にして " で囲えばいいかなと思ったのですが。
0494nobodyさん04/12/26 10:04:43ID:???
"で囲まなくても、
print qq|ここに"でも\でも好きなだけ書くがよい|;|
0495nobodyさん04/12/26 10:08:15ID:???
おっと、最後の|が余分だた
049649304/12/26 10:28:19ID:???
>>494
ごめんなさい
実行スクリプトの引数の話しです

第一引数:aaa
第二引数:aa"a
第三引数:a\a

xxx.pl "aaa" "aa\"a" "a\\a"

こんな感じなのですが
0497nobodyさん04/12/26 13:04:55ID:???
それは Perl とは関係なくシェルのメタ文字をエスケープせんとならんつう話だな
PHP なら escapeshellarg 使えば済むような気がするが、スレ違い気味だ
0498nobodyさん04/12/26 13:06:01ID:RQ2dyxHH
あのさぁ、やってみりゃ答え出ることじゃん。
print join("\n", @ARGV),"\n"; とかやって確認できない?
0499nobodyさん04/12/26 22:55:50ID:???
>>497
Thx!

>>498
そうですね
0500nobodyさん04/12/26 23:47:49ID:???
つか、PHP厨なんだからPHPだけで完結するようにしてしまえばいいだろ。
PHPでPerlなんか起動するなよ。
0501nobodyさん04/12/27 00:04:29ID:???
>>500
そうです
0502nobodyさん04/12/27 08:22:06ID:???
そんなPHPを責めないで…
俺もmySQL使う時はPHP使うよ。
Perl+DBは遅いイメージがあるし、mod_perl使えないし。
誰かこのイメージ払拭させてくれませんか?(スレ違い)
0503nobodyさん04/12/27 08:58:00ID:???
>>500
はい。すみませんでした
0504nobodyさん04/12/27 14:15:25ID:Wb/eo+Or
質問させてください。
useの行で

$ ../xxx.pl
Can't locate xxx.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i386-
linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i386-linux /
usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl /usr/local/lib/
site_perl/5.6.1/i386-linux /usr/local/lib/site_perl/5.6.1 /usr/local/l
ib/site_perl .) at ../xxx.pl line 39.

となってしまいます。

useの行の前で
push(@INC, '/xxx/xxx/xxx');
としてxxx.pmがあるパスを指定してるのですが
それがエラーメッセージの「@INC contains」に表示されていません。

@INCに追加できていないということなのでしょうか?
0505nobodyさん04/12/27 14:18:01ID:???
use lib '/xxx/xxx/xxx';
かuseの前に
BEGIN
{
push(@INC, '/xxx/xxx/xxx');
}
050650404/12/27 14:28:57ID:???
>>505
ありがとうございます!

スクリプトを読み込むと同時にuseが処理されてたということ
だったのですね
ずっと悩んでました m(__)m
0507nobodyさん04/12/27 15:51:41ID:???
携帯コンテンツ等の、セッション管理について質問です。

私は今までずっと引数でセッションIDを引き回す方法をとって
いたのですが、とある案件でmod_perlの「PerlTransHandler」と
いうものを使うことにより、自作モジュールをプログラム読み
込み前にロードし、セッションIDをsubprocess_envというものを
使用して環境変数に埋め込むという方法を知りました。

これであれば引数を使用することはなくなりますし、静的ペー
ジでもセッションIDを保持することが出来ます。

これからこの方法を使っていこうと思ったのですが、今回の
案件がモジュールのインストール関連を許可してくれない
関係で、この方法はとれなくなってしまいました。

この他に似たような方策があれば、ご教授いただきたく思っ
ております。
宜しくお願いいたします。
0508nobodyさん04/12/27 17:19:58ID:d87nS7mB
文字コードはEUCです。

my $a = "123456789";
$a =~ s/(?:\xA3([\xB0-\xB9]))/ chr(ord($1)-0xB0+ord('0')) /eg;
print $a;
>123456789

↑自分で全角数字を半角数字に変換するコードを考えたのですが、
マルチバイト文字などの中間に誤ってマッチしてしまいます。
例→隠隠
1文字目の2バイト目が\xA3で、2文字目の1バイト目が\xB0-\xB9である組み合わせには
完全に誤作動してしまいます。

どうすればよいでしょうか?
0509nobodyさん04/12/27 20:29:10ID:???
>>508
ほとんどFAQだが、

(1) 5.8以降のユニコード機能を有効にすればtr/0−9/0-9/でいけるが
いろいろ落とし穴が(笑)

(2) Jcode.pmのtrを使う

(3) 自分で書きたければ ttp://www.din.or.jp/~ohzaki/perl.htm
あたりが参考になるだろう

0510nobodyさん04/12/27 20:32:05ID:???
>>507
Apache::ClickPath かあ。URLのパス部分にセッションIDを埋め込むやつだよね。
頑張れば mod_rewrite で似たようなことを実現できそうな気もする。
ただその場合「Perl コーディングの質問」では無くなってしまうのだけれど。
「mod_rewrite すらダメ」と言われると厳しいかも。
0511nobodyさん04/12/27 21:12:19ID:???
>>510
そうです!まさにそれでございます!
mod_rewriteでしたらできる可能性があるんですね。
ちょっと上司に使用許可を求めてみたいと思います。
■ このスレッドは過去ログ倉庫に格納されています