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

【Perl】初心者コーナー Part19

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/01/11 13:52ID:???
初めに→「perl」その物のスレです。

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

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

あとは>>2-10にまかせた。
030423903/01/21 23:16ID:???
>>303
はい。結局reverseもunshiftもリストに読み込む
tmpはリストは使わないがファイルアクセス

なんですよね。まずはファイルアクセスのほうを試してみます。
0305nobodyさん03/01/21 23:52ID:???
>>272
use Encode;
my $str = 'あいうえお';
my $utf_str = decode('EUC-JP', $str);
$utf_str =~ s/(.)/sprintf("?%d;",unpack("U",$1))/ge;
print $utf_str ,"\n";
0306nobodyさん03/01/21 23:57ID:???
>>305
sprintfの?の部分は&#。ampersandとsharpが表示されていない。
0307nobodyさん03/01/22 00:07ID:NkPjRdCp
>>262
他に必要な人がいるかもしれないから、もっと簡単な方法。もう出てるけど。
>>264の方法でも、時刻は増加するから一見問題が無いように見えるけど、
日をまたいだ場合とか、桁が変わる場合を考えると、簡単には出来ない。
はっきりいって、そんなことを気づかない人間が、質問に答えるな、と。。

time()の戻り値、UNIX時間(でいいかな?時刻なんだけど)
$start = どっかから持ってくる;
$left = $start - time;

if ($left >= 60*60*24*3) {
 $buyflag = 0;
} elsif ($left >= 60*60*1) {
 $buyflag = 1;
} else {
 $buyflag = 2;
}

>>304
追記してリバースは、>>178に書いた方法を使えば簡単。
reverseって、配列に読み込むっていう意味じゃなくて、ひっくり返して読む
っていうだけだと思う。が。(そうじゃないと異常にもったいない)

頻繁に先頭に追加が発生するなら、データ構造の設計がおかしい。
0308nobodyさん03/01/22 00:09ID:NkPjRdCp
げ、途中だった。

開始時刻も、time()の戻り値の形式でいれておくこと。
適当なモジュールを使えば作れる、と思う。
030923903/01/22 00:16ID:???
>>307
ありがとうございます。
モジュールがあるのですね。今度調べてみようとおもいます。
普通にseekすると上書きになちゃうので・・
下から読むのも行ごとによめればいいけどそうでもなかったので

チャットなので発言ごとに毎回ファイルの先頭に追加したいので、
データ構造の設計がおかしいのですね・・
0310nobodyさん03/01/22 00:36ID:NkPjRdCp
>>309
チャットなら、保存する量を制限する、だろうから、単純な追記では良くないね。
おそらく、50行くらいなら、メモリーに入れて処理したほうが速いと思う。(ベンチマークしてみよう!)
具体的には、@lines = <IN>; unshift(@line, 新しい行); pop(@line);
0311nobodyさん03/01/22 00:38ID:NkPjRdCp
少し間違ってるけどわかる。だろう。・・
ベンチマークは、Benchmarkっていうモジュールが標準で付いてるから、
それをつかってやればいい
0312nobodyさん03/01/22 02:35ID:???
>>262
sub get_time {
my ($sec, $min, $hours, $mday, $mon, $year) = @_;
my @monthly_days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
my $days, $i, $time;
$days = 0;

$days = ($year - 1) * 365 + int (($year - 1) / 4) - int (($year - 1) / 100) + int (($year - 1) / 400);

for ($i = 1; $i < $mon; ++$i) {
$days = $days + $monthly_days[$i - 1] + ($i == 2 and $year % 4 == 0 and ($year % 400 == 0 or $year % 100 != 0));}

$days = $days + $mday;

$time = ($days - 719163) * 86400 + ($hours - 9) * 3600 + $min * 60 + $sec;

$time;}
0313za03/01/22 03:21ID:???
>>305

をを、うまく行きました!

本当にありがとうございます。(_ _ )
0314nobodyさん03/01/22 04:14ID:spwoH+AM
jperl用に書かれたperl のソースコードを、Jcode.pmのみを使って書き換えるにはどうしたらよいでしょうか?
日本語を処理する部分のみを、Jcode::eucなどを使って書き換えてあげればそれだけですむのでしょうか。

もともとかかれたソースコードは、jperl -Leucのオプションを使って起動させるものです。よろしくお願いいたします。
0315nobodyさん03/01/22 06:11ID:???
あるパターンで囲まれたテキストだけ、サブルーチンにかけて処理を施す
ような事は、どのようにすれば良いのでしょうか?

例えば、

「aaa bbb ccc [change]ddd[/change] eee fff」

というテキストがブラウザから送られて、この

[change]…[/change]

に囲まれた部分だけに &kaeru() という処理を施す。そして全文を返す。

もし&kaeruがescape sequenceに変換する処理なら、

「aaa bbb ccc ??? eee fff」

というテキストを返したいのです。
0316訂正03/01/22 06:13ID:???
最後の???は
「aaa bbb ccc &#224;&#224;&#224; eee fff」
です
0317nobodyさん03/01/22 07:28ID:???
>>314
今はPerl5.8を使った方がより少ない手間でjperl用のscriptを書き換えて
使うことができる。MS-Windows or LinuxならActivePerl build804.
まず、perlをインストールしたディレクトリのhtml/index.htmlを開いて
Encodeとencoding pragmasを読め。以下は例。
---^ test.txt
あいうえお
---$
use Encode;
use encoding "Shift_JIS";

open my $file, "<:encoding(Shift_JIS)", "test.txt";
while (<$file>) {
print;
chomp;
my @check = split //;
for my $s (@check) {
$s =~ s/う/ウ/;
print $s,"\n";
}
}
close $file;
0318nobodyさん03/01/22 07:55ID:q2TbMzAT
SSIで表示させようと以下のようなものを入れたのですが、なぜか表示されませんでした・・・

<!--#config timefmt="%m/%d" -->

他のSSI(カウンター)は動くのですがこれだけダメでした。

<!--#echo var="DOCUMENT_NAME"-->

これはちゃんと表示しました。

もし解られる方がいらっしゃいましたらよろしくお願い致します
0319nobodyさん03/01/22 08:00ID:???
>>318
echo以外対応しないとか言うさーばも。
0320nobodyさん03/01/22 08:45ID:???
私は、
フォームなどで入力された文字をまず
eucにして処理(ファイルに保存や正規表現にかけるなど)
そしてクライアントに返す寸前にeucをsjisなどに変換して
printしているのですが、
この場合、半角カナが送られてくると文字化けが起こってしまいます。
jcode.plにz2hなどの関数があるのですが、
半角は半角、全角は全角のままあつかいたいので、
なにかよい方法はありませんでしょうか?
0321nobodyさん03/01/22 09:01ID:???
>>320
全部UTF8にする。
0322bloom03/01/22 09:06ID:pcyTRh0d
http://www.agemasukudasai.com/bloom/
0323nobodyさん03/01/22 09:16ID:???
>>320
入力された文字列で漢字コードを判別している限り無理。
Shift_JISの半角カタカナ2個はeuc-jpの漢字と判別される。

>>321
わけが分かっていないなら回答しないこと。
理由は上に書いた通り、utf-8に変換しようにも元の文字列の
漢字コードがわからない限り無理。euc-jpにも半角カタカナは
一応用意されている。
0324nobodyさん03/01/22 09:22ID:???
>>323
>入力された文字列で漢字コードを判別している限り無理。

ある程度の長さの文字列を読んでインテリジェントに文字コードを判別する文字コード変換ライブラリもそう珍しくはないが。

ShiftJIS文字255個にEUC漢字1個。これをEUCと判断するバカはいないわけで。
0325nobodyさん03/01/22 09:33ID:2Hn1813R
acitiveperl dev kit をアンインストしたらデバッガが起動しなくなりました

C:\>perl -d -e '0'
Unable to connect to remote host: 127.0.0.1:2000
Compilation failed in require.
main::BEGIN() called at C:/Perl/lib/perl5db.pl line 0
eval {...} called at C:/Perl/lib/perl5db.pl line 0
BEGIN failed--compilation aborted.

たすけてやってください
0326nobodyさん03/01/22 09:52ID:???
>>315
$hoge =~ s/\[change\](.+)\[\/change\]/&kaeru($1)/eg;

これでどう?
032732303/01/22 10:47ID:???
>>324
そうでしたか・・・
jcodeには euc2sjisとか
sjis2eucという的確なものもありますよね?
あれでやってもだめでしょうか?

以前は失敗したようなきがするけど、思い違いかなぁ
0328nobodyさん03/01/22 11:56ID:???
>>327
フォームから送られてくることが前提なら、hiddenでチェック用の文字を一つ送って、
判別するとかね。昔よくやったよ。
最近のブラウザは、フォームのページの文字コードで送ってくるから、
明示的に文字コード指定しても大丈夫だと思う。
あと、最近はFORMタグでも送信する文字コード指定できるようだ。
0329nobodyさん03/01/22 11:58ID:???
>>326
(.+?)の方がよさげ
0330nobodyさん03/01/22 12:27ID:9ZZh+FcB



          __END__          
0331nobodyさん03/01/22 13:15ID:mr7EqnYJ
chomp($value) = $array[$i];
こういうやり方はダメですか?
0332nobodyさん03/01/22 13:49ID:???
$hoge = "abcd123456798\n123456789\123456789";

で $hoge に cd12 があればその列の\nまでを $hogeに入れたいのですが

$hoge =~ s/.*(cd12.*)\n[.\n]*/$1/;
こうするしかないのでしょうか?
0333nobodyさん03/01/22 13:53ID:???
>>331
何がしたいの?
0334nobodyさん03/01/22 14:36ID:???
>>331
そもそもそれ動くんですか?
0335nobodyさん03/01/22 14:37ID:???
>>326 >>329
ありがとうございました。
これで試してみます。
0336nobodyさん03/01/22 14:39ID:???
$hoge =~ s/^.*(cd12[^\n]*)/$1/;
033733603/01/22 14:43ID:???
$hoge =~ s/(cd12[^\n]*)/$1/;
で十分か。

cd12と聞くと、LINNの240万円のCDプレーヤーが頭に浮かぶわけだが
0338nobodyさん03/01/22 14:49ID:???
>>331
Can't modify scalar chop in scalar assignment
033933603/01/22 14:58ID:???
$hoge = $hoge =~ /^.*(cd12[^\n]*)/ ? $1 : $hoge;
あーこうか
034033603/01/22 15:00ID:???
$hoge = $1 if $hoge =~ /(cd12[^\n]*)/;
何度も失礼...
0341nobodyさん03/01/22 15:03ID:???
>>336
サンクス そういう書き方ができるんですね。
0342nobodyさん03/01/22 17:04ID:0PCOHlDz
オブジェクトのハッシュ値にファイルを読み込むには、
$this=shift;
$this->{fdata}=<パッケージ名::IN>;
でいいの?

$this->{fdata}[$nline]

みたいにしてアクセスしたいんだけど・・・
これだとハッシュ値しか戻ってこない。
0343nobodyさん03/01/22 17:04ID:???
おっと、パッケージ名::INはファイルハンドルね。
034424603/01/22 18:17ID:STZ5+DSp
>>269のスクリプトを使ってみましたが
shiftjis "\x87" does not map to Unicode at test.pl line 3, <$file> line 920.
や
shiftjis "\xFA" does not map to Unicode at test.pl line 3, <$file> line 154.
のようなエラーが出てしまいます。これはどういった意味なのでしょうか?
0345nobodyさん03/01/22 18:23ID:???
perl1行でgrepと同じ事する方法キボンヌ。

/(^.*key.*$)/$1/
じゃダメポ。

というのも、とあるテキスト書換えソフトでgrep出来たらいいなと。
0346nobodyさん03/01/22 18:28ID:???
>>345
なにがダメなのかわからん。
マルチポストもやめてくれ。
0347nobodyさん03/01/22 18:30ID:???
>>342
ハッシュ変数に配列をそのまま格納する事はできません。
配列変数のリファレンスを格納するか
その都度、無名配列を作成し、そのリファレンスからアクセスしてください。
0348kazu03/01/22 19:04ID:dkolKxk/
教えてください。
携帯サイトをやっているのですが、
index.cgiとhtaccessで機種の特定を行い、それにあったトップページに自動転送するというシステムをやっております。
i-modeで接続した場合に、「サイトが移動しました」という表示が出ます。
これを解決する方法はないのでしょうか?
0349nobodyさん03/01/22 19:06ID:???
>>348
index.cgiで出力結果をかえるとか。
0350kazu03/01/22 19:09ID:dkolKxk/
全然わからないんですが、どうやって出力結果をかえるんですか?
0351nobodyさん03/01/22 19:16ID:???
>>349が言ってるのは、
index.cgi内で携帯ごとに違うページを表示するんじゃないかな。
index.cgi -> UA判別 -> UAに対応したページを出力。

>>348がやってる方法は、
携帯ごとにディレクトリを別にして、index.cgiでそれぞれのディレクトリに飛ばしてるんじゃないかな。

自分で書いたヤツじゃないとか中身を理解していないなら、そのCGIの配布元のURLを出した方がいいよ。
0352nobodyさん03/01/22 19:23ID:???
てか、そのリダイレクト先の指定の仕方がマズイらしいな。
PCのブラウザだと http://〜/dirname ってすると http://〜/dirname/ になって
結果的に http://〜/dirname/index.htm に辿りつけるんだが、
携帯だとしてくれねえヤツもあるらしいぞ。
振り分け先の設定をチェック汁
0353質問です。03/01/22 19:51ID:H1d15TWe
すみません質問です。いま、携帯をキャリアごとに振り分けるcgiをつくってる
んですが、うまくいきません。
httpヘッダで振り分けるスクリプトを組んで、PCでそのcgiにアクセスしてきた
ときは「テスト」表示するように作ったのですが、エラー文も出てきてしまいます。
以下がブラウザに出てきた結果なのですが、どういうことでしょうか?

 CGI Error
 The specified CGI application misbehaved by not returning
 a complete set of HTTP headers. The headers it did return are:

 テスト


ソース自体が間違ってるのでしょうか? どなたか教えてください。
0354nobodyさん03/01/22 19:54ID:???
>>353
print("Content-Type: text/html\r\n\r\n");
0355nobodyさん03/01/22 20:04ID:NW1Un2Sy
>>348
機種にあったトップページに転送するんじゃなかったのですか?
なんでそうなるんですか?
0356質問です。03/01/22 20:35ID:H1d15TWe
>>354
ありがとうございます。
うまくいきました。\nとか\rとかの意味がいまだにわかりませんが、
調べたほうがいいのでしょうね。
とにかく助かりました。ありがとう!
0357nobodyさん03/01/22 21:14ID:TWTRYmp3
あの、クソ初心者なんですけど、、、
CGIって拡張子のファイル(web上の)を他人が見ることってできないのですか?
HTMLでもTXTでもJPGでも何でも普通ファイルの中身が返されますよね。
CGIの場合は実行結果しか絶対に返ってこないの?
0358nobodyさん03/01/22 21:18ID:???
>>357
httpサーバの設定に激しく依存。
0359nobodyさん03/01/22 21:23ID:TWTRYmp3
>>358
えっと、具体的にはどういう設定だとどうなるのですか?
0360nobodyさん03/01/22 21:35ID:???
>>359
CGI専用のディレクトリに入れていたり、CGIスクリプトとして実行するように設定された拡張子をつけていれば実行結果しか返されない。
それでもウェブサーバーを介さないでアクセスされたら覗かれるけどネ
0361nobodyさん03/01/22 21:35ID:???
Options +ExecCGI
AddHandler cgi-script .cgi
0362nobodyさん03/01/22 21:35ID:???
>>360
>CGI専用のディレクトリに入れていたり
そのディレクトリに画像ファイルなんて入れたら大騒ぎだな。
0363nobodyさん03/01/22 21:36ID:???
>>361
Apacheの場合。と書かないと語弊があるぞ。
0364nobodyさん03/01/22 21:37ID:???
>>362
ForbiddenかInternal Server Error(実行権を与えていた場合)になるだけだろ。
0365nobodyさん03/01/22 21:43ID:TWTRYmp3
どの拡張子がCGIスクリプトとして実行すると決めておくのがサーバー設定ってことですか?
WEBサーバーを通さないってことはFTPでってことですか?
かなり初心者なんですいません。
0366nobodyさん03/01/22 21:45ID:???
>>365
>WEBサーバーを通さないってことはFTPでってことですか?
など、そのサーバのファイルシステムに然るべき権限でアクセス出来るプログラムがあればいい。
0367nobodyさん03/01/22 21:46ID:???
>>365
> どの拡張子がCGIスクリプトとして実行すると決めておくのがサーバー設定ってことですか?

そう

> WEBサーバーを通さないってことはFTPでってことですか?

別に何でもいい。FTPじゃ無理だと思うが。
たとえばis○ebのようにセキュリティの甘いところはCGIスクリプトを使って他人のファイルを覗ける
0368nobodyさん03/01/22 21:58ID:???
>>367
アホか。
0369nobodyさん03/01/22 22:00ID:???
>>368
なんか間違った?(^_^;)
0370nobodyさん03/01/22 22:08ID:NkPjRdCp
>>368
お前には課題だ。調べておけ。

suEXEC setuid ファイルの所有者 パーミッション
0371nobodyさん03/01/22 22:11ID:???
>>370
>>367の間違い?
それくらい知っているけど(^_^;)
共用サーバにも関わらずそれをやっていないからis○ebはセキュリティが甘いと言ったんだけど。
0372nobodyさん03/01/22 22:17ID:???
>>328
submitタグのvalueに漢字を使う手も。
0373nobodyさん03/01/22 22:32ID:???
>>357
CGIのみの話題はスレ違い
0374nobodyさん03/01/22 22:42ID:TWTRYmp3
みなさん、ありがとうございました。

>>373
そうなんですか?それすらもよくわからなくて。
ごめんなさい。
0375nobodyさん03/01/23 00:46ID:???
本とかにはopenではよく or dieと組み合わせてありますが、
私の場合openが失敗したからといってスクリプトを終了させるわけ
には行かないので
if(open(IN,"temp.txt")){
opend lines
} else {
canto open lines
}
のようにしているのですが、
こういうことはしないのでしょうか?大丈夫でしょうか?
0376nobodyさん03/01/23 00:48ID:???
>>375
open(IN, "temp.txt") or { cannot open file }
0377nobodyさん03/01/23 00:49ID:???
>>375
じゃ、warnを使えば?
037837503/01/23 00:56ID:???
ありがとうございます
376の方法もいいなとおもいました
0379nobodyさん03/01/23 01:15ID:IkRppvEj
ただ単にファイルをアップロードだけのCGIありませんか?
クライアントからのデータをサーバに保存できさえすれば良いんですが。
0380nobodyさん03/01/23 01:20ID:???
半角文字、ダメです・・・シフトjisとeucだと確定していうるので
送られてくる→&jcode'sjis2euc(\$mes)→内部処理
内部処理→&jcode'euc2sjis(\$mes)→送り返す
としても、半角はおかしくなってしまいます。

なにか解決方法はないでしょうか><
0381nobodyさん03/01/23 01:22ID:???
>>380
\→*
とか。
0382nobodyさん03/01/23 01:56ID:8ePVO3RC
ファイルを開いて内容を配列に収めて配列要素を追加するなり並べ替えるなりしてまたファイルに書き出したら、次に開いたときに各要素の頭(単純にファイルを開いた場合は各行の先頭)に半角スペースが付いてるの。
2回同じことやれば半角スペースが2つ、3回なら3つって具合にどんどん増えてしまう。
なんで?
どうやったら回避できるの? 
何か根本的なこと間違ってる?
0383nobodyさん03/01/23 02:04ID:???
>>380
そもそも「半角カナは文字化けするから使わないように」っていうのがネットの常識じゃなかったか?
2chみたいに、半角カナが堂々と使える掲示板のほうが特殊なのかもしれないぞ。

>>382
ソースきぼんぬ
038438003/01/23 02:19ID:/gwtZ2Vt
>>381
ありがとうございます!
\$ を * にしたらなりました
昔は*を使っていたのですが、\$のほうがいいとか、同義だと
かおもっていて、結果が違うとはおもいませんでした。
*$とうのもあるのですか?
私もまだまだ勉強不足ですね・・
ありがとうございました。
038538003/01/23 02:28ID:???
なんか、ポートがどうとかいわれて書き込めなかった。。
今度は大丈夫かな

>>383
そうなんです。私も半角はいやなのですが、
携帯電話のチャットを作っているので、きってもきれない
関係なんです・・

掲示板で使えるところがあるので、どうにかがんばればできるんだろうなぁ
とか思ってやってました。
文字コードを変換しなければ問題はおこりにくいのかな
0386nobodyさん03/01/23 02:37ID:???
2chは書き込みボタンのキャプションの文字コードを調べて
SJIS以外なら、エラーを返して書き込めないようにしている。
結果として、文字コードの変換処理を省略している。
PC向けならこれで、問題ないように思える。

基本的に、フォームページの文字コードでデータがPOSTされれば
変換処理はいらないと思う。

携帯の場合はどうなんだろう。。ちと気になる。。
0387nobodyさん03/01/23 02:42ID:???
>>385
携帯ならShiftJISだけで処理すればいいんでない?
半角カナOKな掲示板も、内部ではShiftJISだけで処理してるのがほとんどだよ。
0388nobodyさん03/01/23 02:46ID:j5CbC/3T
>>383
382です。ソースはかいつまむと

#!/usr/local/bin/perl

print "Content-type: text/html\n";
print "\n";
print "<HTML>\n";

open(FILE,"<data.txt");
@data=<FILE>;
close(FILE);

open(FILE,">data.txt");
print FILE "@data\n";
close(FILE);

print "処理終了\n";

exit;

こんなんです。
これだけでもどんどんスペースが増えていきます。
なんででしょう?
038938003/01/23 02:49ID:???
みなさん、ありがとうございます。

本来はshiftjisだけで処理したほうがよかったかもですね。
私の場合は、メッセージにIDや名前や発言があるので
それを切り分けたりとか、サーバー側がつくったメッセージを
くみあわせたりとかがあるので、つい、
サーバー側(UNIX+Apache)ではEUCで扱うようにクセがついています。

半角文字に関しては今のところうまく動いているので、
もしある程度出来上がったらiappliのお金がかかりにくいように
作ったチャットをここで公開しますね
0390nobodyさん03/01/23 02:52ID:???
>>389
かいつまみすぎてわからん。それだけ見れば異常はないけど、
配列の最初の要素にどういうものをいれているんだ?
print "$data[0]syori syuuryou";
とかでみてみた?
0391nobodyさん03/01/23 03:17ID:j5CbC/3T
>>390
えっと私(382=388)へのレスということでいいですよね。
データの内容は会員リスト(氏名だとか住所だとか電話番号をカンマ区切りにしているもの)です。
拡張子はtxtですがためしにcsvとかでやっても同じでした。
data.txtのファイルをブラウザで見ると2つ目以降のデータの頭にどんどん半角スペースがくっついていくんです。
csvにした場合は2行目以降の1列目の各データの頭にスペースが付いていきます。
本当は配列に入れた後、追加だとか並べ替えだとかやりたいんですけどそれ以前の段階でつまづきました。
039239003/01/23 03:28ID:???
>>391
改行コードの違いとかはだいじょうぶ
ファイルをどうやってみてるのかとかわかんないしなぁ

やまだ,東京345,99311
のだ,宮556,552211

見たいな感じなの?
0393nobodyさん03/01/23 03:31ID:???
>>391
こうすると直るよ。

print FILE "@data\n";
    ↓
print FILE @data;
0394nobodyさん03/01/23 03:37ID:j5CbC/3T
>>392
えっと、そんな感じです。

>>393
えっ、ちょっとやってみます。
0395nobodyさん03/01/23 03:42ID:j5CbC/3T
わ、わ、わわわ!
本当だ!
ありがとうございます。(^^)
凄い晴れやかな気分。半日苦しんだから。
でもなんだか恥ずかしくなってきた。
受け売りって言うかよそから拾ってきたものを見本に猿まねで訳もわからず作ってたから。
ところで何でこうなるんですか?
(by 382)
039639303/01/23 04:10ID:???
>>395
調べてみたんだが、ダブルクォート中にリスト変数を記述すると、リストの中身が
展開されるそうな。そのとき区切り文字として特殊変数 $" が使われるんだけど、
この中身はデフォルトでは半角スペース。

例えば、各行が「うんこ」「ウンコ」「unko」のテキストファイルを読み込む。

@data = <FILE>;

すると、$data[0] は「うんこ\n」、$data[1] は「ウンコ\n」 などとなる。

これを間違ってた方法で書き出すと

print FILE "@data\n";

リストが展開され、「うんこ\n ウンコ\n unko\n\n」となる。

結果、2行目以降の先頭にスペースがついてしまったというわけ。
(@dataの後ろの\nが実は末尾にしか付いていないことにも注目)
リストの出力は print FILE @data; のようにダブルクォートせずに書こう。
039739003/01/23 04:12ID:???
>>396
そうそう。おれはそれが言いたかった。
変わりにかいてもらってスマソ
0398nobodyさん03/01/23 10:21ID:???
CGIでメール送信プログラムを組んでおります。

require "mimew.pl";
require "jcode.pl";

(略)
$subject = mimeencode (jcode'jis($subject));
$body = jcode'jis($body);

open(MAIL ,"|/usr/sbin/sendmail -t -i");
print MAIL "From: $MailAddress\n";
print MAIL "Subject: $subject\n";
print MAIL "To: $mailaddress1\n";
print MAIL "\n";
print MAIL "$body\n";

close(MAIL);

で、コマンドラインから実行した場合は正常にメール送信されるのですが、
ブラウザ経由で実行した場合、mimeencodeが実行されません。
(エラーにもなりません。)
mimew.plおよびjcode.plはプログラムと同階層においてあります。
また、ファイルの属性は755です。

八方塞がりの状況です。教えていただけませんでしょうか。
0399nobodyさん03/01/23 11:09ID:???
>>398
.plのパーミッションは普通 644 or 604 だよ。それはOK?
0400nobodyさん03/01/23 11:13ID:xJWtHdWY
sub hoge{
my %aaa;
my @bbb;
# それぞれになんか値を入れる動作する
return(%aaa,@bbb);
}
(%AAA,@BBB) = &hoge;
こうすると@BBBに値が入ってないんですけど、なぜでしょうか。
040139803/01/23 11:19ID:???
>>399
mimew.plのパーミッションは644です。
apacheのログを見たところ、

Undefined subroutine &mimew::mimeencode

と表示されていました。
mimew.plにはmimeencodeが存在しています。
(コマンドラインからは実行されますし)
何か他にチェックするべき点はあるでしょうか。よろしくお願いします。
0402nobodyさん03/01/23 11:21ID:???
>>398
もしも、mimew.plが読み込まれていないと心配なら
eval ( require "mimew.pl" );
で、きちんと読み込まれているかチェックしてみたら
どうでせう?

>>399
0755にしなきゃいけないファイルを0644にしていたら問題だけど、
普通0644にするべきファイルを0755にしていても、問題じゃない
でそ?
0403nobodyさん03/01/23 11:35ID:E5MYBiOX
>>400
my @AAA=&hoge;
%AAA=$AAA[0];
@BBB=$AAA[1];
■ このスレッドは過去ログ倉庫に格納されています