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

【Perl】初心者コーナー Part19

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

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

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

あとは>>2-10にまかせた。
0233おながいします。03/01/19 23:56ID:tLwHArOB
初心者の私めに諸先輩方の御教授願います。
localhostではちゃんと起動するのですが、niftyのサーバに上げると
自分がスクリプト内で指定したメッセージ、
「現在投稿ができない状態になっております。」
が出ます。絶対パス($targetfile=以下) の書き方が悪いのでしょうか?
この箇所は考えられ得る色々な書き方(URLにするとか)で書き替えて
試しましたがダメでした。
問題点を教えて頂ければ幸いです。
ちなみにhomepageというのはniftyのホームページ設置ディレクトリ名です。
下のスクリプトはもちろん関係箇所だけですがその途中も省略しています。

#!/usr/local/bin/perl

$|=1;
require "cgi-lib.pl";
$date = localtime;
$workdir = "/temp/";
$targetfile = "/homepage/messageboard/1.html"; #絶対パス
$guestbookurl ="http://homepage2.nifty.com/aaabbbccc/messageboard/1.html";

$body = $in{'body'};
$name = $in{'name'};
$mail = $in{'mail'};
(略)

open WORKF, ">$tempfile"
or &CgiDie("現在投稿ができない状態になっております。");
open GUESTBOOK, "<$targetfile"
or &CgiDie("現在サーバが投稿を受け付けません。");

0234nobodyさん03/01/20 00:04ID:???
>>230
wakwakのページをみると、imageファイルはpublic_htmlの下に置くようにって書いてあるね。
htmlでもいけそうな気がするけど、もし画像ファイルしかCGIから読み出せないってことなら
そのhtmlを画像ファイルの拡張子に変えてみたら?
それでダメだったら問題は他にあるってこと。

>>233
ちゃんとソースみてないけど、ディレクトリのパーミッションの問題じゃない?
0235おながいします。03/01/20 00:26ID:???
234さん、お返事ありがとうございます。
ディレクトリのパーミッションも変更してみましたが、以前同じ
エラーメッセージが出てしまいます。
あ、ちなみにさっき書いたスクリプトで省略してしまった所があるの
ですが、それは
$tempfile = $targetfile;
$tempfile =~ s/[:\/\\]/_/g;
$tempfile = $workdir .$tempfile . $$ . ".tmp";
です。宜しくお願い致します。<(_ _)>
0236nobodyさん03/01/20 01:00ID:???
ファイル名が14バイト制限を受けているとか。
それはないか…。
0237nobodyさん03/01/20 01:07ID:???
niftyってルートに独自ディレクトリ作って
OKでしたっけ?

$workdir = "./";
にしてみるとか。
0238nobodyさん03/01/20 01:46ID:???
>>233
$tempfile の最終形をみてみる。

すたぁと。
$targetfile = "/homepage/messageboard/1.html"; #絶対パス
$workdir = "/temp/";

$tempfile = $targetfile;
#$tempfile = "/homepage/messageboard/1.html";

$tempfile =~ s/[:\/\\]/_/g;
#$tempfile = "_homepage_messageboard_1.html";

$tempfile = $workdir .$tempfile . $$ . ".tmp";
#$tempfile = "/temp/_homepage_messageboard_1.htmlPID.tmp";
#PIDはプロセス番号

>>237 氏の仰有るとおりにしると、
#$tempfile = "./_homepage_messageboard_1.htmlPID.tmp";
♥
とりあえず。
0239nobodyさん03/01/20 15:53ID:emhs1xha
初歩的な質問かもしれませんが、よろしくお願いします。
あるファイルoutput.txtの内容が次のようだったとします。
02あいうえお
01あかさたな
00かきくけこ
このファイルの先頭に1行つけたして、
03たちつてと
02あいうえお
01あかさたな
00かきくけこ
としたいのですが、どうすればいいでしょうか?
ファイルの末尾に付け足すのはかんたんなのですが・・
seek(OUT,0,0);をやて書き込んでも、一部、上書きになって
消える部分があるし 困っています。
0240nobodyさん03/01/20 16:00ID:???
>>239
unshift
024123903/01/20 16:05ID:emhs1xha
>>240
ありがとうございます unshiftを調べたところ
配列を扱うもののようです。いったん配列に取り込まないと
いけないということでしょうか?そうだとすれば
while(<IN>) {
$mes .= $_;
}
print OUT $newmes . $mes;
とするのと同じで、メモリをくってしまいますので、
だめっぽいです。
0242nobodyさん03/01/20 16:39ID:???
>>241
$txt = 'output.txt';
$tmp = 'output.tmp';

open TXT, '<' . $txt or die $!;
open TMP, '>' . $tmp or die $!;
print TMP $new_line;
print TMP $_ while <TXT>;
close TMP;
close TXT;
rename $tmp => $txt or die $!;
0243nobodyさん03/01/20 16:39ID:???
>>239
この質問は過去に何度か出ていた気がする。
その時の回答は確か
*書きこむ時は普通に追記して、読み出すときにreverseかける
*テンポラリファイルを作ってリネームする
の二つ。
前者は読み出す時に配列に入れなきゃならないし、
後者は排他制御が面倒な予感。
もっと良い方法があるなら俺も知りたい。
0244nobodyさん03/01/20 16:39ID:???
>>239
output.txt.tmp を新規作成する。
output.txt.tmp に新たな1行のみ書きこむ。
output.txt を読み込む。
output.txt.tmp に追加書き込みする。
output.txt を削除する。
output.txt.tmp を output.txt に名前変更する。

ただし、output.txt.tmp がすでに存在するときは上記の操作を行わない。

で、どうだ!?
0245nobodyさん03/01/20 19:16ID:gSzazTge
>>244
少し間違ってるなぁ。
削除する必要はない。削除するとファイルが存在しない時間が少し発生するから良くない。

それから、存在チェックと書き込みは同時には行われないから、
O_EXCLを書いてopenするといいかもしれない。ファイルが存在したら失敗とする。

この方法の問題点は、中途半端な状態で残ったoutput.txt.tmpをどう扱うか、にある。
0246nobodyさん03/01/20 19:43ID:8rfuT7oA
ファイル中の文字数を数えようと思い、次のように書きましたが、全角が2文字部としてカウントしてしまいます
半角全角問わずに一文字ずつ数えたいのですがどうしたらいいでしょうか
foreach(<LOG>){
@str1 = split //,;
$total += @str1;
}
0247劉邦03/01/20 20:09ID:QoYi51kG
良いperlの入門サイト教えてください。
0248nobodyさん03/01/20 20:10ID:???
>>247
ここ。
0249nobodyさん03/01/20 20:53ID:???
>247
検索して探せ。
いいか悪いかは自分で見て判断するしかない。
他人にいいサイトが自分にいいとは限らない。

>248
入門は別のところでしてほしいぞ。
HellowWorld!から教える気か?
0250劉邦03/01/20 20:54ID:QoYi51kG
http://www.wakhok.ac.jp/~kida/program/perl/node81.html
のサイトの問6.2はどうやるんですかね・・?address.txt.つくって
実行してみたんですけど、アドレスが表示されないんですよね・・・
我慢できなくなって、解答を参照したところそう違いはなく、その
解答をコピーしてやってみたんですが、それもうまくいきません。
何が原因だと思いますか?
0251nobodyさん03/01/20 21:29ID:???
>>250
とりあえず藻前の書いたスクリプト書いてみ。
ちなみに解答そのままだと、address.txtからは読めないぞ。
0252nobodyさん03/01/20 21:48ID:???
>>250
解答が1つしかないのが気にいらないなぁ・・・
無駄でももっといろんな解法があると思うのに。
0253nobodyさん03/01/20 21:56ID:???
>>250
解答ではaddress.txtを標準入力から読み込むようになってるから、
単体で動作させたいときはファイルから入力するように修正しないといけないよ。
0254劉邦03/01/20 22:12ID:QoYi51kG
入力といったら<STDIN>しか、知らないのですが・・・
例えばどんなものがあるのですか?
0255劉邦03/01/20 22:20ID:QoYi51kG
標準入力から直接入力した場合はちゃんと機能するようですが・・・
025625103/01/20 22:27ID:???
>>255
ファイルオープンしてごにょごにょ。そのページだと9かね。
ま、一通り読んでみ。
0257劉邦03/01/20 22:30ID:QoYi51kG
9すか・・?!
入門者に対するイジメじゃないですかね・・・(^-^;A
0258nobodyさん03/01/20 22:31ID:qfdWUXSE
  ∋8ノノハ.∩
   川o・-・)ノ <先生!こんなのがありました!
__/ /    /   
\(_ノ ̄ ̄ ̄\
||ヽ|| ̄ ̄ ̄ ̄||
 ...|| ̄ ̄ ̄ ̄||
http://saitama.gasuki.com/hiroyuki/
0259劉邦03/01/20 22:39ID:QoYi51kG
入門サイトかえることにしますた。
0260nobodyさん03/01/20 23:43ID:???
しかし、このページって著作権とか大丈夫なんかねぇ?
初めてのperl第一版そのままっぽいんだけど翻訳元とか全く書いてないし
訳されたと言う日付の時点で既に第二版すら出版されてるわけだが。

というわけで、サイトの中身そのものはそう悪くないぞ。
れっきとした書籍のほとんどそのままだからな(笑)
ま、当然本屋で本物を買ってきた方が良いけど。三千円ね。
0261nobodyさん03/01/21 00:39ID:???
>>260
てか、今更Perl4もねえだろ。使ってる鯖が古いならともかくさ。
本気でやろうと思ったら、最新の駱駝を買うのが一番だろ。
0262nobodyさん03/01/21 01:23ID:S5Xqr2nK
質問があります。
お答えしてくれるとうれしいです。

開催日に合わせて発売するというものを作ってまして
時間チェックでわからなくなってしまいました。
発売前・中・締切と時間でフラグを立てて制限したいのですが
頭がこんがらがってなかなかできません。
$buyflag [0:発売前] [1:発売中] [2:締切]

現在の時刻をそれぞれ
[分:$min] [時:$hour] [日:$mday] [月:$mon] [年:$year]
とし、開催日時のデータを@daydataという配列に
それぞれ年[0]、月[1]、日[2]、時[3]、分[4]として入れています。

開催日時のちょうど3日前に発売開始[1:発売中]でそれより前は
[0:発売前]、開催日時の1時間前に[2:締切]としたいのです。

どなたか教えてくださいませんか?
0263nobodyさん03/01/21 02:02ID:???
>262
わからなくなったら、紙に書いて整理しな。
頭の中だけでやろうとするからわからなくなる。

ここで質問したいなら、ソースくらい出しなさい。
0264nobodyさん03/01/21 02:09ID:???
>>262
日時は2桁で揃えられていると仮定して、

$opoentime = join("", @daydata);
$nowtime = "$year$mon$mday$hour$min";

if($opentime - $nowtime < 100){ $buyflag = 2;}
elsif($opentime - $nowtime < 30000){ $buyflag = 1;}
else{ $buyflag = 2;}


んーむ、感覚的に殴り書きヽ( ´ー`)ノ



0265nobodyさん03/01/21 02:11ID:???
あ、変数名一部間違えてますな
失礼しました。

$opoentime = join("", @daydata); → $opentime = join("", @daydata);
0266nobodyさん03/01/21 02:12ID:???
http://pc.2ch.net/test/read.cgi/php/1042260745/
の 1042260745 ってなんて言うんだっけ?>time();
これ使ったらなんも考えることないっしょ

開催日時 $tt = timegm(hoge);
発売開始 $tt - 60 * 60 * 24 *3
0267nobodyさん03/01/21 02:23ID:???
>>246
JPerl使わないとムリじゃない?
0268nobodyさん03/01/21 02:43ID:???
      ,一-、
     / ̄ l |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ■■-っ < >>267 んな こたァない
    ´∀`/    \__________
   __/|Y/\.
 Ё|__ | /  |
     | У..  |
0269nobodyさん03/01/21 05:29ID:???
>>246
Perl ver5.8をインストールする。ActivePerlならbuild804.
以下は漢字コードをShift_JISとした例。
---^ t.txt
123456
---$
my $count;
open my $file, "<:encoding(Shift_JIS)", "t.txt";
while (<$file>) {
chomp;
my @char = split//;
$count += scalar(@char);
}
print $count,"\n";
0270nobodyさん03/01/21 07:25ID:???
質問です
if($a =~ /(aaa|bbb)/){⊂}
と同じように
if($a eq /(aaa|bbb)/){⊂}
という書き方はOKでしょうか?
0271nobodyさん03/01/21 07:35ID:???
>>270
NG。
正規表現の部分が、上は $a を評価するのに対して、下は $_ に対して評価した値と
$a を文字列として比較するので、わけわからん結果になる。
0272za03/01/21 10:02ID:???

EUCの日本語を、Unicodeの数値参照コード(???????;)に変換する
モジュールは無いでしょうか? それともUnicode-Japaneseで可能でしょうか?
0273za03/01/21 10:05ID:???
>数値参照コード(???????;)

失礼。「&#??????;」です。(^^;
0274nobodyさん03/01/21 12:45ID:f7zzet+E
本(BBS RE-DESIGN BOOK)にのっていたとおりに
掲示板を作ったつもりなのですが、設置できても文字化けしてしまいます。
ブラウザで自動判別をしてもEUCを判別してもらえず、
手動でEUCにエンコードしないと書き込みが見えません。
本当に初心者なので、どこが悪いのかもわかりません。
書き込みが文字化けせずに見える方法はありますか?
作成したソースは
http://mc6800.dyn.dhs.org/UP_LOADER/UPFTP/IMG/MC6800P_253.txt
にあります。よろしくお願いします。
0275herm03/01/21 13:07ID:???
>>274
そのスクリプトが入ってるdirectoryに
「AddDefaultCharset EUC-JP」と書いた「.htaccess」を入れるとか。
027627403/01/21 13:13ID:f7zzet+E
>275
いれてみたら出来ました!本当にありがとうございました!
027724603/01/21 14:09ID:NhrI/baV
>>269
できました!!
jcode使ったりいろいろ悩んだのですがこれで解決しました。ありがとうございました。
0278nobodyさん03/01/21 15:01ID:???
>>274
ファイルを保存するときに文字コードを間違っているだけだろ。
027926203/01/21 15:03ID:???
こんな感じでできるようになりました
ありがとうです。

$nowtime = sprintf("%d%02d%02d%02d%02d",$year,$mon+1,$mday,$hour,$min);
$opentime = join("", @daydata);

if($opentime - $nowtime < 100){ $buyflag = 2; }
elsif($opentime - $nowtime <= 30000){ $buyflag = 1; }
elsif($opentime - $nowtime > 30000){ $buyflag = 0; }
else{ $buyflag = 2; }
0280nobodyさん03/01/21 15:21ID:???
>>279
恐ろしい計算方法だね。。
0281nobodyさん03/01/21 15:27ID:???
>>279
>>264はアフォだって気づかなかったんだな(w
0282nobodyさん03/01/21 15:55ID:???
でも多分当分戻ってこないよ。
0283nobodyさん03/01/21 16:16ID:???
264ともどもにずっともどってくんな!
0284nobodyさん03/01/21 18:40ID:???
質問です。
自分も初心者ですが>274のスクリプトが気になったんで
設置してみたんですが、記事を投稿はできても記事の削除をすると
500 Internal Server Errorが出てしまいます。
どうすれば削除することができますか?
0285nobodyさん03/01/21 19:34ID:???
>>284
暇なんで試してみたが・・・おいおい、そのスクリプト作りかけ何じゃねーのかYO!
お○○チンが・・・ねえ!!

sub read_data
{
    open(READ,"$datafile") || &error ('ファイルオープンエラー');
    @data = <READ>;
    close(READ);
}

sub write_data
{
    open(WRITE,">$datafile") || &error('ファイルオープンエラー');
    print WRITE @data;
    close(WRITE);
}

でも追加しとけ!
後はしらねーーー
0286nobodyさん03/01/21 19:57ID:owIuUjTB
Perlを作るテキストソフトは秀丸で十分でしょうか?
028728603/01/21 19:59ID:owIuUjTB
それともう一つ質問なのですが、
ネット上にある講座などの知識だけで上達できますか?
参考書がないと歯が立たないものなんですか?
0288nobodyさん03/01/21 20:03ID:???
>>286
あやしい言葉づかいだねぇ。
秀丸を使いこなしているのなら、もちろん十分でしょう。。

>>287
もちろんネット上のテキストだけで上達できる!
色々プログラミングしまくってくれ!!
0289nobodyさん03/01/21 20:25ID:???
>>287
でも、一冊辞書みたいな本があると能率が上がるのも確か。
紙って発明品は偉大だよ。
0290nobodyさん03/01/21 20:57ID:???
>>289
よい辞書をおしえてください
0291nobodyさん03/01/21 21:22ID:???
>290
参考書籍スレに逝ってください。
0292nobodyさん03/01/21 21:25ID:???
紙降臨
0293nobodyさん03/01/21 21:35ID:???
寒いスレだな・・・
0294nobodyさん03/01/21 21:44ID:???
そういえばPerlの本って一度も読んだこと無いな。漏れ。。
029523903/01/21 22:02ID:???
ファイルの先頭に追加の件ですが、ありがとうございました。
根本的な解決法はなかったのですね・・・

現状ではtmpファイルをつかって行おうと思います。

作成しているものが携帯電話対応のルーム数不定の
チャットなので、高負荷なことは避けたかったのですが
どうせあんまり使う人はいないだろうからいいか っとおもいました
0296nobodyさん03/01/21 22:14ID:???
>>295
>作成しているものが携帯電話対応のルーム数不定の
>チャットなので、高負荷なことは避けたかったのですが

なんかサーバサイドとクライアントサイドの区別が未だに付いてない予感。
0297nobodyさん03/01/21 22:19ID:???
>>296
アフォキタ━━━━(゚∀゚)━━━━!!!!!!
0298nobodyさん03/01/21 22:20ID:???
歴代のこのスレで「ファイルの先頭に追記したい」という質問はよく出てきた。
そういった時の返答は大体決まってる。

ファイルの先頭に追記するのではなく、ファイルの末尾に追記して、読み込みの時にreverseしろ。
0299nobodyさん03/01/21 22:22ID:???
>>297
アフォキタ━━━━(゚∀゚)━━━━!!!!!!
0300nobodyさん03/01/21 22:26ID:???
なんだ? ホンとに阿呆がいるYO
0301nobodyさん03/01/21 22:28ID:???
みんなで阿呆ゥ!
030223903/01/21 22:49ID:???
>>296
携帯電話側はdocomoのやつなのでjavaでiアプリを作ってます。
ある程度そっちができたので、次はサーバーサイドを作っています。
本当はサーバーサイドもjavaでいこうとしていたのですが、
今までperlを使ったことがあったのと、実装の簡単さでperlのcgiに
しました。

ファイルの末尾に追記してリバースする方法と
tmpファイルを作成する方法はどちらが効率がよいでしょうか?

チャットにおいて、
サーバー側に持っておくログを50行までと決めておけば、
リバースでよいかな
0303nobodyさん03/01/21 22:52ID:???
>>302
全部配列に読み込んでunshiftと言うのは?
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/;
こうするしかないのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています