【Perl】初心者コーナー Part19
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
03/01/11 13:52ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
あとは>>2-10にまかせた。
0877nobodyさん
03/02/04 00:36ID:???open(OUT, '>master.tmp');
while (IN) {
if () {
print OUT 新しいもの;
} else {
print OUT $_;
}
}
rename('master.tmp', 'master');
0879nobodyさん
03/02/04 00:38ID:???マルチするほどの事じゃないだろ。どうせ見るヤツかぶってるんだし。
100行くらいならメモリに入れておいてもいいんじゃない?
メモリの量が気になるなら読み込みつつ別ファイルに書き込み。
マッチしたらその行だけ変更して最後まで読み書きする。
最後にリネームして終わりだな。
つか今度マルチしたらグーで殴るからね
0881nobodyさん
03/02/04 01:02ID:Z72oZy+O$i = 1;
print "$i+1";
で'2'と出力したのですが。
0882nobodyさん
03/02/04 01:08ID:eARYiwGA0883nobodyさん
03/02/04 01:10ID:???print "@{[ $i + 1 ]}";
0885nobodyさん
03/02/04 01:55ID:???出力してみても何だかわかんなくて。
0886nobodyさん
03/02/04 02:04ID:CHyA5DeQForbiddenと出てしまいます。どこの設定がおかしいのでしょうか?
0887nobodyさん
03/02/04 02:12ID:???最後にファイルを修正してからの日数じゃないの?
てか -Mだけじゃ分からんだろ(w perl -Mの意味かと思った。
>>886
何を参考に設定したのか知らないけど、もう一度apacheの設定の仕方を見てごらん。
まぁエラーログみれば原因分かるから、それを元に検索するのも勉強。
0888nobodyさん
03/02/04 03:42ID:VBD/sziNは、$aと$bに何か入っていたら処理するで実際OKなのですが、
unless($a and $b){ 処理 }
ですと、両方入ってなかったら処理って風にならく、
どちらか一方でも処理に行ってしまいます。
ifのまるっきり反対じゃないんですね。何か訳があるのでしょうか?
0891nobodyさん
03/02/04 04:00ID:???0892876
03/02/04 09:15ID:???マルチするつもりじゃなかったんですが、書き込みした後、リロード
して確認したら書き込まれていなかったもので、スレまちがえて再書き込みして
しまいました。ご迷惑おかけしました。
いろいろなアドバイスありがとうございました。今日、がんばってみます。
0893nobodyさん
03/02/04 09:28ID:???unlessってのは、評価の結果が偽のときに実行するという命令であって、
条件式の評価の仕方が逆になるわけではない。
慣れないうちは、if (! 式) {} を使っておいたほうがいい。
0894nobodyさん
03/02/04 12:16ID:ZSr84PG1%TEST = ('A' =>'あ', 'B' => 'い');
foreach $key(keys %TEST){
&jcode'convert(*$key, "euc");
}
このやり方では駄目なのでしょうか?
0896nobodyさん
03/02/04 13:19ID:???なんとマヌケな…
ありがとうございました!
以後気をつけます。
0897nobodyさん
03/02/04 14:28ID:???0899711
03/02/04 14:42ID:???なんかもう自分で作りたくなっちゃったよ。PERLでcgi形式で翻訳スクリプト
なんて作ったら、どうなるんだろ。無謀か。
0901nobodyさん
03/02/04 17:02ID:???1.入力フォームを作る
2.入力された文章をhttp://www.infoseek.co.jp/Honyaku?pg=honyaku_t_inout.html&svx=105420&svp=SEEK
にwgetで投げる
3.getしたhtmlから結果だけを抜き出して、整形して表示
0902nobodyさん
03/02/04 17:31ID:???ファイルを、while (<IN>) {〜}といった記述をしないで、
一行ずつ読み込んでいく方法はないものでしょうか。
@file = <IN> といったメモリにファイル全部読み込む方法は使わず、
一行ずつ読み込んで、一行ごとに違う処理をしていきたいのです。
while の中でループ回数カウントしてifで判定しろ、なんていうのはなしで。
ファイルを一行読み込む場合、
open(IN,"$logfile");
$line = <IN>;
と、やれば出きるのはどこにでも書いてあるのですが、
2度目以降 $line = <IN> としても空でした…。
Perl は一行ごとに分けるデータ構造が身についてしまってるのがダメなのかなぁ…。
seek と read 使えばよさそうなのは解ってはいるのですが、
ベースから書き換えなくてはならず、このままの構造でなんとかできないものかと。
0904nobodyさん
03/02/04 17:44ID:???変なの。
0905nobodyさん
03/02/04 17:45ID:???んなこたーない。
これを実行してみればわかる。
#!/usr/bin/perl
use strict;
our $buffer;
$buffer = <DATA>;
print $buffer;
$buffer = <DATA>;
print $buffer;
$buffer = <DATA>;
print $buffer;
__DATA__
foo
bar
baz
0906902
03/02/04 18:00ID:???どこか初歩的なミスしてそうなので探してみます。
どうもでした。
0909nobodyさん
03/02/04 20:00ID:ifLjuw1eopen F,"/bin/gzip -d temp.txt.gz |";
できません。
どうすれば良いでしょうか。
0910909
03/02/04 20:12ID:???出力先間違ってた。
失礼しました〜
0911nobodyさん
03/02/04 20:54ID:???>ファイルを、while (<IN>) {〜}といった記述をしないで、
>一行ずつ読み込んでいく方法はないものでしょうか。
意味不明
while (<IN>) は while($_ = <IN>)と同じ
要するに一行ずつ読み込んでいる。
>Perl は一行ごとに分けるデータ構造が身についてしまってるのがダメなのかなぁ…。
身についてないと思うよ。
0912711
03/02/04 21:43ID:???>翻訳スクリプト作れるくらいの英語力(?)があったら翻訳スクリプトなんて必要ない。
英語に関しては、私自身は翻訳の必要などありません。掲示板に組み込んで
多言語翻訳掲示板を作れないか、ということです。
>>901
infoseek翻訳はそういう形で利用しても大丈夫なのでしょうか?
完全にフリーのものは、殆ど日本語翻訳まではまだサポートしていないし。
http://linguaphile.sourceforge.net/
0915711
03/02/04 22:37ID:???いずれはバレてしまうんでしょうね。
上のLingaphileのように、フリーの翻訳ソフトは色々
開発されてはいるようですが。
GPLTrans http://www.translator.cx/
(こっちはCとPHP?)
0916894
03/02/05 07:12ID:???エラーの内容といいますと?
インターネットサーバーエラーって画面以外にもエラーってあるんですか?
一応&jcode'convert(*{$TEST{$key}}, "euc");
こんな感じにしたらエラーはでなくなりました。
しかしeucにコンバートされてないみたいです。
普通にスカラーを作って日本語を入れて検索した場合は成功しますし、
上記のハッシュに英語をいれてもちゃんとなります。
原因のわかる方がいましたらお願いします。
0917nobodyさん
03/02/05 10:39ID:???自分のPCにPERLをインストールして、それを使ってテストする。
そうすればもっと詳しいエラーメッセージが見れる。
0918nobodyさん
03/02/05 10:44ID:???0919nobodyさん
03/02/05 11:36ID:???Internalすら読めないのに、よくPerlのコードを書けるねえ。
意外とエラーの実体はタイプミスだったりしてな。
とりあえずレンタル鯖でのCGIテストは今すぐやめろ。
0920nobodyさん
03/02/05 11:47ID:???よって、彼には500 Internal Server Eroorで十分だったわけだ。要はエラーが起こったという事実が大切なのだから。
実行したらエラーが出ました。助けてください。
と言う質問がいかに多いか。
0921nobodyさん
03/02/05 12:38ID:???Eroor
0922nobodyさん
03/02/05 12:53ID:???0923nobodyさん
03/02/05 13:28ID:???0924894
03/02/05 14:37ID:???レンタル鯖でのテストはしてませんが?
activeprelとapacheを入れてIEのアドレスにPCのアドレスを入れてやってます。
0925nobodyさん
03/02/05 14:44ID:???百年早い。せめてperlのデバッグ方を学んで出直してこいや。
ttp://www.harukaze.net/~mishima/perl/index.html
ttp://www.harukaze.net/~mishima/perl/cgi-debug-env/deb-tech.html
この辺りな。
0926895
03/02/05 14:53ID:???use strict;
require 'jcode.pl';
my %TEST = ('A' =>'あ', 'B' => 'い');
my $key;
foreach $key(keys %TEST){
jcode'convert(\$TEST{$key}, "euc");
}
これで動くだろ。
0927894
03/02/05 16:22ID:???895さん、925さん、その他の方にも迷惑をおかけしました。
もう少し基礎を覚え直します
0928nobodyさん
03/02/05 16:52ID:???100年前にperlはない罠
0929nobodyさん
03/02/05 19:58ID:???100年後にもPerlはない罠
0930nobodyさん
03/02/05 22:39ID:???少し直してみました。
use strict;
require 'jcode.pl';
my %TEST = ('A' => 'あ', 'B' => 'い');
foreach my $key (keys %TEST){
jcode::convert(\$TEST{$key}, 'euc');
}
#メモリを節約:
while (my ($key, undef) = each %TEST) {
jcode::convert(\$TEST{$key}, 'euc');
}
#他のやりかた
foreach my $value (@TEST{keys %TEST}) {
jcode::convert(\$value, 'euc');
}
0931nobodyさん
03/02/05 23:03ID:???とか、テストコードに言うのは野暮か。
0932nobodyさん
03/02/06 00:06ID:???気をつければ良いのでしょうか。
0934nobodyさん
03/02/06 00:22ID:???スマートな方法はないでしょうか?
$last = @DATA;
@DATA = @DATA[1..$last]
0935nobodyさん
03/02/06 00:31ID:???shift @DATA;
0937nobodyさん
03/02/06 01:02ID:???3つ目で、valuesを使わない理由は、valuesで出てきたリストに対する
変更は、%TESTに反映されないから、です。
ってそういう意味じゃないか。
0939934
03/02/06 01:46ID:???$#DATAで、配列の最後の番号ということでしょうか?
これは応用が利きそうですね。
0940nobodyさん
03/02/06 03:40ID:???.
.
200212.txt
200301.txt
200302.txt
こういう年月の名前のファイルを作り出すプログラムで、そのテキストの中の数字を全部足していきたいので
open(IN,"200301.txt");
open(IN,"200302.txt");
こんな感じで一個一個開いて足しているのですが、
指定した月から現在の月までのファイルを開くような方法があれば教えてください
0941nobodyさん
03/02/06 05:09ID:???readdirでファイルリストを取得して
foreach等で回しつつ、
substrや正規表現で数字を切り出して、
if($xxx >= 200212)
などという条件つけてやれば?
または、予め何月以上というリストを作ってやって、
回しつつif (-e "$_.txt")で処理するか。
0942nobodyさん
03/02/06 06:20ID:???さらにこれからはもう一つ、
年月と数値だけ羅列したインデックスファイルを作っておくと便利だと思うよ。
・
・
200302<>5648
200303<>4421
0944nobodyさん
03/02/06 15:07ID:???そのファイル名が「4桁年2桁月」になっているのであれば、、、
$start = "200201";
$end = "200301";
foreach ($start .. $end) {
open(IN,"$_.txt");
何らかの処理
}
でよいのでは?
0946nobodyさん
03/02/06 17:12ID:???0948nobodyさん
03/02/06 19:23ID:???例えば任意日任意時の10〜20分の間に何か処理をするとして
($minは分)
if($min >= 10 and $min <= 19){⊂}
と
if($min =~ /1[\d]/){⊂}
とやるのはどっちが高速&負荷軽めですか?
つーかもっといい方法ありますでしょうか?
0950nobodyさん
03/02/06 19:52ID:???Benchmark.pm
use Benchmarkね。
0951nobodyさん
03/02/06 19:55ID:???my ($start, $end) = (200201, 200312);
my $cnt = $start;
while($cnt <= $end){
print $cnt, ".txt\n"; # なにかしら処理
my ($year, $month) = $cnt =~ /(\d\d\d\d)(\d\d)/;
$month++;
if ($month > 12){
$month = '01';
$year++;
}
$cnt = $year. $month;
}
単純に書いてみました。
0952別スレの優雅な948
03/02/06 20:02ID:???処理の重さだけなら後者が約2.2倍重いです。
前者を200万回処理するのにかかった時間0.69秒
後者を200万回処理するのにかかった時間1.51秒
実験は当方ローカル環境(CPU2.5GHz)
定期的に処理をしたいのであれば、UNIXコマンドのcronがありますが、
借りているサーバがshellを許可しているか、コントロールパネルにより
提供している必要がります。
0953郵政の歴史年表
03/02/06 21:24ID:iDPmTn07http://www.iptp.go.jp/museum/yusei/tsushin/nenpyou.html
にある1860年代から1990年代までの中から、
「郵便貯金の歴史」だけをgrep見たいに抜き出すこと出来ますか?
0955nobodyさん
03/02/06 21:30ID:???そうじゃないだろ・・・・
0957nobodyさん
03/02/06 21:47ID:???<td valign=top nowrap><b>([^<]*)</b></td>
<td>
<tr>
<td valign=top><font color=(?:ff9cff|9cff31|0031ff)>●</font></td>
<td>([^<]*)</td>
</tr>
0959nobodyさん
03/02/07 03:13ID:Md2X1ufVアップロードする前のオリジナルネームは
どこを参照すればわかるのでしょうか?
環境変数 Perl 一覧
などとググっても見つけられませんでした。
よろしくご教示ください。
0960nobodyさん
03/02/07 03:32ID:???http://www.yo.rim.or.jp/~getsu/document/rfc1867j.txt
こういう意味じゃない?
0961nobodyさん
03/02/07 03:55ID:???なるほど。格納されている場所がわかりました。
実際の取得方法(スカラー変数への代入)を調べてみます。
ありがとうございました。
0962nobodyさん
03/02/07 16:46ID:04vl2wLA全て配列に代入するにはどうすればいいんでしょうか?
例えば、cgi本体と同じ階層にある「log」というディレクトリに
0.dat,1.dat,2.datがある時に、
最終的に@dataに0.dat,1.dat,2.datが代入されている
という風にするにはどうするのでしょうか?
0963nobodyさん
03/02/07 16:54ID:???0964nobodyさん
03/02/07 16:54ID:???http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k03.htm
0965名無しさん@Meadow
03/02/07 17:01ID:???サブディレクトリもでしょ。.とか..とかのディレクトリは
入れないんでしょ。これでいいと思うよ。
#!/usr/local/bin/perl
# コマンドラインで指定したディレクトリの中にあるすべてのファイルを配列に入れる
$usage = 'perl files-in-dir.pl 絶対パス';
$starting_dir = shift;
die $usage if $starting_dir eq "";
sub search {
my($dir, $depth) = @_;
my $handle = "DIR$depth";
opendir($handle, $dir) or die $!;
while($file = readdir($handle)) {
next if $file =~ /^\.{1,2}$/;
if (-d "$dir/$file") {
&search("$dir/$file", $depth + 1);
} else {
push(@files, $file);
}
}
closedir($handle);
}
search("$starting_dir", 1);
for(@files) {
print;
}
0966962
03/02/07 17:40ID:???0967nobodyさん
03/02/07 21:04ID:???0969nobodyさん
03/02/08 00:03ID:???なんでPerlを覚えてるの?
借りてるサーバがPerlしか使えないとかかな?
マジレスきぼん。
0970マジレス
03/02/08 00:06ID:???0972nobodyさん
03/02/08 00:24ID:???( ´,_ゝ`) プッ
0973しょしんしゃ
03/02/08 00:26ID:qxZih98+日本語処理が面倒
ソケット通信が未熟
0974nobodyさん
03/02/08 00:43ID:???$no $name $heught $weight
とする場合、身長の降順、同じ場合は体重の昇順に
体重まで同じ場合は、さらに社員番号の昇順に
社員番号、社員名、身長、体重をprintしたい場合は
どうしたらよいでしょうか?(複数キー)
0975940
03/02/08 01:27ID:???レス数が950を超えています。1000を超えると書き込みができなくなります。