Perlコーディング初心者質問スレ Part 56
レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん
2007/09/16(日) 19:49:43ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ ttp://pc11.2ch.net/test/read.cgi/php/1180492441/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0908906
2008/02/13(水) 10:48:35ID:???調べてみます
0910nobodyさん
2008/02/13(水) 12:25:12ID:???ありがとうございます
Encode::EUCJPMSモジュールをいれて、
use Encode::EUCJPMS;
use Encode;
my $cp50220_str = Encode::from_to( $utf8_str , "UTF8" , "CP50220" );
で良いのでしょうか?
実はフォーム入力はShiftJISでして、CP932からutf-8に一旦エンコードしています。
これで問題はないでしょうか?
0912nobodyさん
2008/02/14(木) 10:56:12ID:AY3pAm1W#!/usr/bin/perl
use strict;
print "IEを起動します...\n";
system("C:/Program Files/Internet Explorer/iexplore.exe");
exit;
__END__
上のようにすると、IEは起動するのですが、コマンドプロンプトは残ったままで
タスクマネージャーにも perl.exetが残っています。(残るというか待ってるようですが…)
IEを起動したあとはPerlも終了して欲しくて検索したらexecというのがあったので
exec("C:/Program Files/Internet Explorer/iexplore.exe");としたら起動しませんでした。
IE起動後速やかにPerlを終了させるにはどうすれば良いでしょうか。
PerlはActivePerl 5.8.8をインストールしました。
もう一つは、my $url = 'http://www.google.co.jp/'; とした時に
IEにこの$urlを開かせるにはどうすればよいのでしょうか。よろしくお願いします。
0913nobodyさん
2008/02/14(木) 11:58:11ID:???0915nobodyさん
2008/02/14(木) 12:27:34ID:???/ ::::::::::::::::\ つ
. | ,,-‐‐ ‐‐-、 .:::| わ
| 、_(o)_,: _(o)_, :::|ぁぁ
. | ::< .::|あぁ
\ /( [三] )ヽ ::/ああ
/`ー‐--‐‐―´\ぁあ
0916910
2008/02/14(木) 12:58:24ID:???ありがとうございます。
「〜」は手動でE3 80 9Cに置き換えています。
では教えていただいた方法でやってみようと思います。
0917nobodyさん
2008/02/14(木) 15:13:40ID:???Net::SMTPについて教えて下さい
use Net::SMTP;
my $smtp = Net::SMTP->new( $mailhost );
$smtp->mail( $MailFrom );
$smtp->to( $MailTo );
$smtp->data();
$smtp->datasend( "From: $MailFrom\n" );
$smtp->datasend( "To: $MailTo\n" );
$smtp->datasend( "Subject: $e_subject\n" );
$smtp->datasend( "Mime-Version: 1.0\n" );
$smtp->datasend( "Content-type: text/plain; charset=ISO-2022-1\n" );
$smtp->datasend( "Content-transfer-encoding: 7bit\n" );
$smtp->datasend( "Reply-to: $MailFrom\n" );
$smtp->datasend( "$body\n" );
ここでbodyに例えばtestdataと入れると$bodyもメールとして届くのですが、
$bodyをtest:dataとする(半角コロンが入っている)と、$bodyが送られません
何が悪いのかご教示下さい
0918nobodyさん
2008/02/14(木) 15:18:19ID:???0919nobodyさん
2008/02/14(木) 15:28:13ID:???0921919
2008/02/14(木) 15:57:21ID:???よかったな。
バグった状態だと$bodyが送られてこないんじゃなくヘッダに入ってたはず。
メールヘッダと本文の切り分けは「半角コロンが入ってない行が登場した所から本文」って事になってるから、
どんな文が入るか分からん時は、ヘッダの最後に空行を入れれば桶。基本なんで覚えとくと便利。
0923nobodyさん
2008/02/17(日) 21:47:50ID:???ヘッダと本文は空行で分けられます。
ついでに言うと、改行は CRLF (\r\n) にすること。
MTA によっては受け付けてくれません。
0924exe
2008/02/19(火) 11:44:47ID:L1DAdjnkaAbBcCdDeE・・・yYzZ のような形です。お願いします。
0925nobodyさん
2008/02/19(火) 12:05:44ID:???0926nobodyさん
2008/02/19(火) 12:06:11ID:???を10個コピペでおk
0927exe
2008/02/19(火) 14:24:58ID:L1DAdjnk0928nobodyさん
2008/02/19(火) 14:25:28ID:???for(65..90) {
print pack("C*",$_);
print pack("C*",$_+32);
}
print "\n";
}
0929exe
2008/02/19(火) 14:42:37ID:L1DAdjnkちなみに↓の形で書くと、どうしたらよいでしょうか。
何度もすいません。
open (FILE, '>test1.txt') or die "$!";
for my $count (0..9) {
for my $i ("a".."z") {
}
print FILE "\n";
}
close(FILE);
0930nobodyさん
2008/02/19(火) 14:59:33ID:???# $countってなんぞ?
#
open (FILE, '>', 'test1.txt') or die "$!";
binmode(FILE);
for my $count (0..9) {
for my $i('a'..'z') {
print $i;
print uc($i);
}
print FILE "\n";
}
close(FILE);
0931nobodyさん
2008/02/19(火) 15:01:42ID:???# ↑はウソ
#
open (FILE, '>', 'test1.txt') or die "$!";
binmode(FILE);
for my $count (0..9) {
for my $i('a'..'z') {
print FILE $i;
print FILE uc($i);
}
print FILE "\n";
}
close(FILE);
0932exe
2008/02/19(火) 15:06:17ID:L1DAdjnk0933exe
2008/02/19(火) 15:54:07ID:L1DAdjnk自力でやらないといけないのはわかっているのですが、時間がなくて・・どなたかお願いします。
0934nobodyさん
2008/02/19(火) 16:04:55ID:???# そういうウンコみたいな仕事を漏れにも回してくれよ
#
$sent = 'dTgZtyYthSGetLt';
$sent =~ s/[a-z]//g;
print $sent;
0935nobodyさん
2008/02/19(火) 16:31:12ID:???0936exe
2008/02/19(火) 16:55:41ID:L1DAdjnk自分にとっては色々難しくて。時間もありませんでしたので・・
0937nobodyさん
2008/02/19(火) 17:15:11ID:???OPEN("http://www.aa.com/a.cgi") みたいにして
a.cgiの出力結果を元にさらに処理をしたいと思っています
0938nobodyさん
2008/02/19(火) 17:30:48ID:gLoGL0Aeいい手じゃないが、Linuxでwgetが入ってる状態で漏れが使ってる方法
$foo = `wget -O- http://www.aa.com/a.cgi`;
0939nobodyさん
2008/02/19(火) 17:45:18ID:???0940nobodyさん
2008/02/19(火) 17:55:56ID:???0942938
2008/02/19(火) 20:13:58ID:???モジュール使った方が互換性高いし、そっちの方が良いと思ったんで。
>940のLWPを使うのが最良だと思うが、使い方調べてる気分的な余裕がないんで、
wget使ってそのまま今に至る感じだ。
>941
外部コマンド実行だから。``で囲むと外部コマンドを実行して標準出力が戻ってくる。
ちなみに"perl -T"でやってると、そのままじゃ外部コマンド動かない事があるんで注意。
$ENV{'IFS'}, $ENV{'CDPATH'}, $ENV{'ENV'}, $ENV{'BASH_ENV'}, $ENV{'PATH'}を
退避・削除してから外部コマンドを実行し戻す必要がある。
0943nobodyさん
2008/02/19(火) 20:26:04ID:???0944nobodyさん
2008/02/20(水) 08:23:23ID:???http://search.cpan.org/~gaas/libwww-perl-5.808/lib/LWP/Simple.pm
0946nobodyさん
2008/02/20(水) 13:15:09ID:???そのURLのページにキーワードか書かれているかどうか調べるとき、
foreach (@url) {
LWPで取得してキーワードが見つかったら、$count++;
}
みたいにすると一つずつなので物凄く時間が掛かります。
10個くらい一気に取得する方法はないでしょうか?
0947nobodyさん
2008/02/20(水) 13:35:03ID:???0948nobodyさん
2008/02/20(水) 13:43:09ID:???0950nobodyさん
2008/02/20(水) 14:34:00ID:???0951nobodyさん
2008/02/20(水) 15:01:34ID:???プロセスBは重いサイトがリストにあって終わってないとか
無駄に待ち時間増えるから、threads使える環境ならthreadsのが楽でない?
0952nobodyさん
2008/02/20(水) 15:03:07ID:???正規表現について教えてください。
通常の2バイト文字と同様に絵文字[\x75-\x7B][\x21-\x7E]がエスケープシーケンス
\x1b\x24\x42と\x1b\x28\x42に囲まれます。
エスケープシーケンスをそれぞれ
$esc_in = "\x1b\x24\x42";
$esc_out = "\x1b\x28\x42";
とし、絵文字を
$emoji = "[\x75-\x7B][\x21-\x7E]";
とします。
元の文を
$str="今日は晴れでした■気温は10度です。";(■は笑顔の絵文字 \x79\x79 )
この$strは
$esc_in今日は晴れでした■気温は$esc_out10$esc_in度です。$esc_out
とエスケープされます。
やりたい事はこれを
$esc_in今日は晴れでした$esc_out[7979]$esc_in気温は$esc_out10$esc_in度です。$esc_out
というように[]で絵文字コードを囲い、エスケープシーケンスの整合性をとるというものです。
どなたかご教授いただけないでしょうか?
0953nobodyさん
2008/02/21(木) 00:49:43ID:???0954nobodyさん
2008/02/21(木) 02:07:00ID:???いったんutf8文字列にしてから加工して戻す方がたぶん見通しいいよ。
0955952
2008/02/21(木) 03:31:08ID:???ありがとうございます。そちらの方で検討させていただきます。
このような複雑な置換について私は苦手でして、もしこれがお分かりになられるなら後学のためにも教えていただきたいのですが、ご無理でしょうか?
0956nobodyさん
2008/02/21(木) 10:36:05ID:???マッチした文字列はルールに沿って変換
ってことかな?
0957nobodyさん
2008/02/21(木) 10:36:46ID:???○$esc_inと$esc_outで囲って
0958nobodyさん
2008/02/21(木) 10:39:56ID:???# 絵文字部分を1文字ずつ加工。
# 1バイトずれてマッチしたり、ascii部分にマッチしないようにしてるので面倒
$str =~ s{
(
(?:\G | ^[^\1b]*\x1b\x24\x42)
(?:[^\x1b]{2}|\x1b\x28\x42[^\x1b]*\x1b\x24\x42)*?
)
([\x75-\x7b])([\x21-\x7e])
}{
sprintf "%s\x1b\x28\x42[%02x%02x]\x1b\x24\x42", $1, ord($2), ord($3)
}gex;
# 冗長なエスケープシーケンスの並びを除去
$str =~ s/(\x1b\x24\x42)+/$1/g;
$str =~ s/(\x1b\x28\x42)+/$1/g;
$str =~ s/\x1b\x28\x42\x1b\x24\x42//g;
$str =~ s/\x1b\x24\x42\x1b\x28\x42//g;
0959952
2008/02/21(木) 14:20:04ID:???ありがとうございます。
やはりすごい複雑になってしまうんですね。
(
(?:\G | ^[^\1b]*\x1b\x24\x42)
(?:[^\x1b]{2}|\x1b\x28\x42[^\x1b]*\x1b\x24\x42)*?
)
を見てもさっぱり理解できません。
これが絵文字でない文字を指すというのはわかるのですが、詳しく教えていただけないでしょうか?
または参考になる書籍などがありましたら教えていただけないでしょうか。
0960952
2008/02/21(木) 14:25:02ID:???これを作った方すごいですね。こんな便利なものがあると知りませんでした。
0961初心者
2008/02/21(木) 14:43:22ID:eHzrHpy8何から書いていいやらとっかかりがわかりません。どなたかアドバイス等をお願いします。
0962nobodyさん
2008/02/21(木) 14:48:53ID:???0963nobodyさん
2008/02/21(木) 14:49:53ID:???1. 本日の年・月・日・曜日を返す
2. x年y月z日の曜日を返す
3. x年y月1日の曜日を返す
4. x年y月の月末日を返す
5. x年y月の前月を返す
6. x年y月の翌月を返す
7. x年y月z日の前日を返す
8. x年y月z日の翌日を返す
0964初心者
2008/02/21(木) 15:13:33ID:eHzrHpy80965初心者
2008/02/21(木) 15:26:58ID:eHzrHpy80966nobodyさん
2008/02/21(木) 15:35:05ID:/bZGgDSr西暦が4で割り切れて、100で割り切れなければ閏年。
西暦が4で割り切れて、400でも割り切れれば、100で割り切れても閏年。
0967nobodyさん
2008/02/21(木) 15:35:25ID:???0968nobodyさん
2008/02/21(木) 15:38:45ID:/bZGgDSr0969nobodyさん
2008/02/21(木) 16:23:42ID:???月末=翌月1日の1日前( x年y月の月末日=(x年y+1月1日)-1日 )だから、
PerlインタプリタとOSとライブラリにバグがなけりゃ閏年だろうが、平年だろうが
関係なく計算できる。
Date::Calc使って計算すりゃ一発で出るだろ。
0970nobodyさん
2008/02/21(木) 16:35:43ID:???0972nobodyさん
2008/02/21(木) 18:08:27ID:???ggrksには同意だが、
たとえば誕生日の入力で2/29が妥当かどうかってのは閏年を判別しなきゃいかんだろ。
質問者の意図は知らんが。
0973969
2008/02/21(木) 18:13:29ID:???名前: 初心者 ID:eHzrHpy8 が継続的に質問してるんで、
ID:eHzrHpy8 : 「>961 カレンダーを作りたい。」
nobodyさん: 「>963」
ID:eHzrHpy8 : 「>965 月末日を知るのに閏年を知りたい」
って一連の流れだと思ったんだが、違うのか?
0974nobodyさん
2008/02/21(木) 18:21:25ID:???いいってことを>>969は言ってるんだね。
カレンダーを書くルーチンを考えたことないから、参考になるね。
0975nobodyさん
2008/02/21(木) 19:03:40ID:???末日計算を前提としてる話とごっちゃになっとる
0976nobodyさん
2008/02/21(木) 19:18:16ID:???でもさ、カレンダーを書くcgiくらい、散々ソースが転がっていそうな気がするんだけどね。
その辺の中から、適当に拾ってアレンジすれば目的は果たせるんじゃないの?
0977nobodyさん
2008/02/21(木) 19:26:16ID:???課題ともなるとそうもいかないんじゃない?
0978nobodyさん
2008/02/21(木) 19:33:08ID:???0981ID消し挑戦w
2008/02/23(土) 16:05:17ID:???0982nobodyさん
2008/02/23(土) 16:40:22ID:???package hoge;
use strict;
my $test = 'ABC';
sub new {
my $pkg = shift;
bless { hoge => $test, },$pkg;
}
みたいに先頭で定数定義してメソッド内で使いまくるのって問題ありますか?
これならuse strictしない方が良かったりする?
0983nobodyさん
2008/02/23(土) 16:46:25ID:???0984nobodyさん
2008/02/23(土) 17:07:54ID:???問題ないとおも。
ただ、定数として明示したければ、
use Readonly;
Readonly my $test = 'ABC';
しといた方が
0985nobodyさん
2008/02/23(土) 17:09:32ID:???0986nobodyさん
2008/02/23(土) 18:07:36ID:???0987nobodyさん
2008/02/23(土) 18:54:14ID:???箱から出したくないしので、blessに絡めたくないんです。
ちなみに全メソッドで使います。
>>984
CPAN配布物ですかね?
名前からして便利そうですが、標準で入ってないのは遠慮したいです。
>>985
おk
コールバックあたりも調べてみます。
とりあえずみなさんありがとうです。
0988nobodyさん
2008/02/23(土) 19:03:14ID:???0990nobodyさん
2008/02/23(土) 21:32:08ID:???0991nobodyさん
2008/02/23(土) 21:46:40ID:???CPAN配布物だけど、純Perlソースだから、インスコしなくても、
下記からダウソして自分のモジュールと同じディレクトリに入れればよさげ。
http://search.cpan.org/src/ROODE/Readonly-1.03/Readonly.pm
0992nobodyさん
2008/02/23(土) 21:47:49ID:???効率はいい。constant プラグマはいわばその構文糖。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlsub.html#Constant_Functions
変数展開コンテキストに埋め込みたいなら、リテラルのリファレンスに
名前を付ける方法もある。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlmod.html#Symbol_Tables
パッケージグローバルな my 変数も、そのパッケージ内でうっかり
書き換える心配が無いのなら別に悪い選択肢じゃない。
0993982
2008/02/23(土) 22:24:31ID:???ダウソしました。できるだけ理解してから使ってみます。
>>990,>>992
サブルーチンでやるならsub Readonly () { 'ABC' }でおkですね。
とりあえず自分用はそうします。
もし他人に配布するような事があれば>>989,>>991が良いっす
短時間ですごい勉強になりました。ありがとう
0994nobodyさん
2008/02/24(日) 18:30:29ID:???0995nobodyさん
2008/02/25(月) 16:37:54ID:???0996nobodyさん
2008/02/25(月) 17:52:22ID:???0997nobodyさん
2008/02/25(月) 19:27:13ID:???Perlコーディング初心者質問スレ Part 57
http://pc11.2ch.net/test/read.cgi/php/1203935151/
0998nobodyさん
2008/02/25(月) 20:00:31ID:???埋め
0999nobodyさん
2008/02/25(月) 20:07:07ID:???1000nobodyさん
2008/02/25(月) 20:07:31ID:???10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。