【Perl】初心者コーナー Part19
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/01/11 13:52ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
あとは>>2-10にまかせた。
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:???わからなくなったら、紙に書いて整理しな。
頭の中だけでやろうとするからわからなくなる。
ここで質問したいなら、ソースくらい出しなさい。
0264nobodyさん
03/01/21 02:09ID:???日時は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:???の 1042260745 ってなんて言うんだっけ?>time();
これ使ったらなんも考えることないっしょ
開催日時 $tt = timegm(hoge);
発売開始 $tt - 60 * 60 * 24 *3
0268nobodyさん
03/01/21 02:43ID:???/ ̄ l | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
■■-っ < >>267 んな こたァない
´∀`/ \__________
__/|Y/\.
Ё|__ | / |
| У.. |
0269nobodyさん
03/01/21 05:29ID:???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:???NG。
正規表現の部分が、上は $a を評価するのに対して、下は $_ に対して評価した値と
$a を文字列として比較するので、わけわからん結果になる。
0272za
03/01/21 10:02ID:???EUCの日本語を、Unicodeの数値参照コード(???????;)に変換する
モジュールは無いでしょうか? それともUnicode-Japaneseで可能でしょうか?
0273za
03/01/21 10:05ID:???失礼。「&#??????;」です。(^^;
0274nobodyさん
03/01/21 12:45ID:f7zzet+E掲示板を作ったつもりなのですが、設置できても文字化けしてしまいます。
ブラウザで自動判別をしてもEUCを判別してもらえず、
手動でEUCにエンコードしないと書き込みが見えません。
本当に初心者なので、どこが悪いのかもわかりません。
書き込みが文字化けせずに見える方法はありますか?
作成したソースは
http://mc6800.dyn.dhs.org/UP_LOADER/UPFTP/IMG/MC6800P_253.txt
にあります。よろしくお願いします。
0275herm
03/01/21 13:07ID:???そのスクリプトが入ってるdirectoryに
「AddDefaultCharset EUC-JP」と書いた「.htaccess」を入れるとか。
0276274
03/01/21 13:13ID:f7zzet+Eいれてみたら出来ました!本当にありがとうございました!
0277246
03/01/21 14:09ID:NhrI/baVできました!!
jcode使ったりいろいろ悩んだのですがこれで解決しました。ありがとうございました。
0279262
03/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; }
0282nobodyさん
03/01/21 15:55ID:???0283nobodyさん
03/01/21 16:16ID:???0284nobodyさん
03/01/21 18:40ID:???自分も初心者ですが>274のスクリプトが気になったんで
設置してみたんですが、記事を投稿はできても記事の削除をすると
500 Internal Server Errorが出てしまいます。
どうすれば削除することができますか?
0285nobodyさん
03/01/21 19:34ID:???暇なんで試してみたが・・・おいおい、そのスクリプト作りかけ何じゃねーのか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:owIuUjTB0287286
03/01/21 19:59ID:owIuUjTBネット上にある講座などの知識だけで上達できますか?
参考書がないと歯が立たないものなんですか?
0288nobodyさん
03/01/21 20:03ID:???あやしい言葉づかいだねぇ。
秀丸を使いこなしているのなら、もちろん十分でしょう。。
>>287
もちろんネット上のテキストだけで上達できる!
色々プログラミングしまくってくれ!!
0291nobodyさん
03/01/21 21:22ID:???参考書籍スレに逝ってください。
0292nobodyさん
03/01/21 21:25ID:???0293nobodyさん
03/01/21 21:35ID:???0294nobodyさん
03/01/21 21:44ID:???0295239
03/01/21 22:02ID:???根本的な解決法はなかったのですね・・・
現状ではtmpファイルをつかって行おうと思います。
作成しているものが携帯電話対応のルーム数不定の
チャットなので、高負荷なことは避けたかったのですが
どうせあんまり使う人はいないだろうからいいか っとおもいました
0296nobodyさん
03/01/21 22:14ID:???>作成しているものが携帯電話対応のルーム数不定の
>チャットなので、高負荷なことは避けたかったのですが
なんかサーバサイドとクライアントサイドの区別が未だに付いてない予感。
0298nobodyさん
03/01/21 22:20ID:???そういった時の返答は大体決まってる。
ファイルの先頭に追記するのではなく、ファイルの末尾に追記して、読み込みの時にreverseしろ。
0300nobodyさん
03/01/21 22:26ID:???0301nobodyさん
03/01/21 22:28ID:???0302239
03/01/21 22:49ID:???携帯電話側はdocomoのやつなのでjavaでiアプリを作ってます。
ある程度そっちができたので、次はサーバーサイドを作っています。
本当はサーバーサイドもjavaでいこうとしていたのですが、
今までperlを使ったことがあったのと、実装の簡単さでperlのcgiに
しました。
ファイルの末尾に追記してリバースする方法と
tmpファイルを作成する方法はどちらが効率がよいでしょうか?
チャットにおいて、
サーバー側に持っておくログを50行までと決めておけば、
リバースでよいかな
0304239
03/01/21 23:16ID:???はい。結局reverseもunshiftもリストに読み込む
tmpはリストは使わないがファイルアクセス
なんですよね。まずはファイルアクセスのほうを試してみます。
0305nobodyさん
03/01/21 23:52ID:???use Encode;
my $str = 'あいうえお';
my $utf_str = decode('EUC-JP', $str);
$utf_str =~ s/(.)/sprintf("?%d;",unpack("U",$1))/ge;
print $utf_str ,"\n";
0307nobodyさん
03/01/22 00:07ID:NkPjRdCp他に必要な人がいるかもしれないから、もっと簡単な方法。もう出てるけど。
>>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()の戻り値の形式でいれておくこと。
適当なモジュールを使えば作れる、と思う。
0309239
03/01/22 00:16ID:???ありがとうございます。
モジュールがあるのですね。今度調べてみようとおもいます。
普通にseekすると上書きになちゃうので・・
下から読むのも行ごとによめればいいけどそうでもなかったので
チャットなので発言ごとに毎回ファイルの先頭に追加したいので、
データ構造の設計がおかしいのですね・・
0310nobodyさん
03/01/22 00:36ID:NkPjRdCpチャットなら、保存する量を制限する、だろうから、単純な追記では良くないね。
おそらく、50行くらいなら、メモリーに入れて処理したほうが速いと思う。(ベンチマークしてみよう!)
具体的には、@lines = <IN>; unshift(@line, 新しい行); pop(@line);
0311nobodyさん
03/01/22 00:38ID:NkPjRdCpベンチマークは、Benchmarkっていうモジュールが標準で付いてるから、
それをつかってやればいい
0312nobodyさん
03/01/22 02:35ID:???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;}
0314nobodyさん
03/01/22 04:14ID:spwoH+AM日本語を処理する部分のみを、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:???今は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<!--#config timefmt="%m/%d" -->
他のSSI(カウンター)は動くのですがこれだけダメでした。
<!--#echo var="DOCUMENT_NAME"-->
これはちゃんと表示しました。
もし解られる方がいらっしゃいましたらよろしくお願い致します
0320nobodyさん
03/01/22 08:45ID:???フォームなどで入力された文字をまず
eucにして処理(ファイルに保存や正規表現にかけるなど)
そしてクライアントに返す寸前にeucをsjisなどに変換して
printしているのですが、
この場合、半角カナが送られてくると文字化けが起こってしまいます。
jcode.plにz2hなどの関数があるのですが、
半角は半角、全角は全角のままあつかいたいので、
なにかよい方法はありませんでしょうか?
0322bloom
03/01/22 09:06ID:pcyTRh0d0323nobodyさん
03/01/22 09:16ID:???入力された文字列で漢字コードを判別している限り無理。
Shift_JISの半角カタカナ2個はeuc-jpの漢字と判別される。
>>321
わけが分かっていないなら回答しないこと。
理由は上に書いた通り、utf-8に変換しようにも元の文字列の
漢字コードがわからない限り無理。euc-jpにも半角カタカナは
一応用意されている。
0324nobodyさん
03/01/22 09:22ID:???>入力された文字列で漢字コードを判別している限り無理。
ある程度の長さの文字列を読んでインテリジェントに文字コードを判別する文字コード変換ライブラリもそう珍しくはないが。
ShiftJIS文字255個にEUC漢字1個。これをEUCと判断するバカはいないわけで。
0325nobodyさん
03/01/22 09:33ID:2Hn1813RC:\>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.
たすけてやってください
0327323
03/01/22 10:47ID:???そうでしたか・・・
jcodeには euc2sjisとか
sjis2eucという的確なものもありますよね?
あれでやってもだめでしょうか?
以前は失敗したようなきがするけど、思い違いかなぁ
0328nobodyさん
03/01/22 11:56ID:???フォームから送られてくることが前提なら、hiddenでチェック用の文字を一つ送って、
判別するとかね。昔よくやったよ。
最近のブラウザは、フォームのページの文字コードで送ってくるから、
明示的に文字コード指定しても大丈夫だと思う。
あと、最近はFORMタグでも送信する文字コード指定できるようだ。
0330nobodyさん
03/01/22 12:27ID:9ZZh+FcB__END__
0331nobodyさん
03/01/22 13:15ID:mr7EqnYJこういうやり方はダメですか?
0332nobodyさん
03/01/22 13:49ID:???で $hoge に cd12 があればその列の\nまでを $hogeに入れたいのですが
$hoge =~ s/.*(cd12.*)\n[.\n]*/$1/;
こうするしかないのでしょうか?
0336nobodyさん
03/01/22 14:39ID:???0337336
03/01/22 14:43ID:???で十分か。
cd12と聞くと、LINNの240万円のCDプレーヤーが頭に浮かぶわけだが
0339336
03/01/22 14:58ID:???あーこうか
0340336
03/01/22 15:00ID:???何度も失礼...
0342nobodyさん
03/01/22 17:04ID:0PCOHlDz$this=shift;
$this->{fdata}=<パッケージ名::IN>;
でいいの?
$this->{fdata}[$nline]
みたいにしてアクセスしたいんだけど・・・
これだとハッシュ値しか戻ってこない。
0343nobodyさん
03/01/22 17:04ID:???0344246
03/01/22 18:17ID:STZ5+DSpshiftjis "\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:???/(^.*key.*$)/$1/
じゃダメポ。
というのも、とあるテキスト書換えソフトでgrep出来たらいいなと。
0347nobodyさん
03/01/22 18:30ID:???ハッシュ変数に配列をそのまま格納する事はできません。
配列変数のリファレンスを格納するか
その都度、無名配列を作成し、そのリファレンスからアクセスしてください。
0348kazu
03/01/22 19:04ID:dkolKxk/携帯サイトをやっているのですが、
index.cgiとhtaccessで機種の特定を行い、それにあったトップページに自動転送するというシステムをやっております。
i-modeで接続した場合に、「サイトが移動しました」という表示が出ます。
これを解決する方法はないのでしょうか?
0350kazu
03/01/22 19:09ID:dkolKxk/0351nobodyさん
03/01/22 19:16ID:???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んですが、うまくいきません。
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:
テスト
ソース自体が間違ってるのでしょうか? どなたか教えてください。
0355nobodyさん
03/01/22 20:04ID:NW1Un2Sy機種にあったトップページに転送するんじゃなかったのですか?
なんでそうなるんですか?
0356質問です。
03/01/22 20:35ID:H1d15TWeありがとうございます。
うまくいきました。\nとか\rとかの意味がいまだにわかりませんが、
調べたほうがいいのでしょうね。
とにかく助かりました。ありがとう!
0357nobodyさん
03/01/22 21:14ID:TWTRYmp3CGIって拡張子のファイル(web上の)を他人が見ることってできないのですか?
HTMLでもTXTでもJPGでも何でも普通ファイルの中身が返されますよね。
CGIの場合は実行結果しか絶対に返ってこないの?
0359nobodyさん
03/01/22 21:23ID:TWTRYmp3えっと、具体的にはどういう設定だとどうなるのですか?
0360nobodyさん
03/01/22 21:35ID:???CGI専用のディレクトリに入れていたり、CGIスクリプトとして実行するように設定された拡張子をつけていれば実行結果しか返されない。
それでもウェブサーバーを介さないでアクセスされたら覗かれるけどネ
■ このスレッドは過去ログ倉庫に格納されています