Perlコーディング初心者質問スレ Part 58
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
2008/08/06(水) 22:54:32ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1203935151/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0883nobodyさん
2009/02/07(土) 06:59:37ID:???>>873
Perlのオプション知らないの??>>852の書いてあるのはバラしたら
-w
-T
-c
各々のオプションを一々チェックするのは時間のムダ
上のオプションを繋げて書くと
-wTc(順番は書く人によって変わる、例えば-cwTや-Tcwなんかでもおk)
必要なオプションをつけてテストするのは当然の事だが
-Tオプション知らなかったり、オプションを繋げて書くのを知らなかったり(オプションだと気付いてない?)
少しは勉強してからPerlやれよ
0885nobodyさん
2009/02/07(土) 08:07:35ID:???0889nobodyさん
2009/02/07(土) 09:23:04ID:???0891nobodyさん
2009/02/07(土) 14:01:02ID:???45 -> 45
130 -> 2:10
3601 -> 1:00:01
どうしたらいいでしょうか?
DateTime->new(second => 4032)とかしたらyearとかも入れろって怒られました。
0892nobodyさん
2009/02/07(土) 14:10:32ID:???0893nobodyさん
2009/02/07(土) 15:08:36ID:???#!/usr/bin/perl -w
use Scalar::Util qw(looks_like_number);
use strict;
sub sec2hhmmss {
my $sec = int(looks_like_number($_[0]) ? $_[0] : 0);
my $min = int($sec / 60); $sec %= 60;
my $hour = int($min / 60); $min %= 60;
my $time = join ':', map sprintf('%02d', $_), $hour, $min, $sec;
$time =~ s/^[0:]+//;
$time || 0;
}
print map sec2hhmmss($_) . "\n", (
45, 130, 3601, 86420, 'seconds', undef,
);
__END__
0894nobodyさん
2009/02/07(土) 16:20:40ID:dq0WM+XPhoge.cをつくろうとC:\Perl\binへhoge.plをおき プロンプトで
C:\Perl\bin>perl -MO=C hoge.pl > hoge.c を実行したところ
Starting compile
Walking tree
Prescan
Tie::StdHash has method TIEHASH: saving package
Tie::Hash has method new: saving package
Tie::ExtraHash has method TIEHASH: saving package
Regexp has method DESTROY: saving package
Errno has method TIEHASH: saving package
Exporter saved (it is in Errno's @ISA)
Net::Ping has method new: saving package
Net::Telnet has method new: saving package
IO::Socket::INET saved (it is in Net::Telnet's @ISA) IO::Socket saved (it is in IO::Socket::INET's @ISA) IO::Handle saved (it is in IO::Socket's @ISA)
POSIX::SigAction has method new: saving package POSIX::Termios has method new: saving package POSIX::SigSet has method new: saving package POSIX::SigRt has method new: saving package
Saving methods
No definition for sub Fcntl::O_LARGEFILE
No definition for sub Fcntl::O_LARGEFILE (unable to autoload) No definition for sub Fcntl::F_SETLK64
No definition for sub Fcntl::F_SETLK64 (unable to autoload) No definition for sub Fcntl::F_SETOWN
No definition for sub Fcntl::F_SETOWN (unable to autoload) No definition for sub Fcntl::O_DSYNC No definition for sub Fcntl::O_DSYNC (unable to autoload)
Can't locate object method "IVX" via package "B::NV" at C:/Perl/lib/B/C.pm line
650.
CHECK failed--call queue aborted.
となり0行のCファイルができました。 どこに問題があるのでしょうか?何卒よろしくお願いします。
0895nobodyさん
2009/02/07(土) 16:26:29ID:???0896nobodyさん
2009/02/07(土) 18:52:05ID:???俺は「あたしんち」で初めて知ったから
バカチンって聞くと「あたしんち」のお母さんが
口から火を吐いてる絵が思い浮かぶ
0897nobodyさん
2009/02/07(土) 19:28:54ID:???0899nobodyさん
2009/02/07(土) 19:57:50ID:3N01Kgc2ググッて見つけた方法をいくつかテストしてみたのですが、全てダメでした。
例:「2ちゃんねる」を「2ちゃんねる」に変換したい。
・テストコードその1(正攻法)
my $txt = '2ちゃんねる';
$txt =~ tr/0−9/0-9/;
結果:文字化け 「0Q0ソ000ヒ0」
・テストコードその2(Jcodeを使うといいらしい?)
use Jcode;
my $txt = '2ちゃんねる';
my $txt2 = jcode($txt)->tr('0−9', '0-9');
結果:文字化け 「」イ、d网ヘ、」
・テストコードその3(tr('[0-9]', '[0-9]')はEUCでないとだめ。スクリプトがSJISの場合は変換必要らしい?)
use Jcode;
my $txt = '2ちゃんねる';
my $from = jcode('0−9')->euc;
my $to = jcode('[0-9]-')->euc;
my $txt2 = jcode($txt)->tr($from, $to);
結果:文字化け 「」イ、d网ヘ、」
・テストコードその4(スクリプトをEUCにしてjcode.pl使用)
require './jcode.pl';
my $txt = '2ちゃんねる';
jcode::tr(\$txt, '0-9', '0-9');
結果:「2」はOKだが、日本語が文字化け 「2、d网ヘ、」
どのようにしたら、うまく変換できるでしょうか。
0900899
2009/02/07(土) 19:59:02ID:???「ム板の質問スレってなくなったんでしょうか?」と書くつもりでした。
0901nobodyさん
2009/02/07(土) 20:06:47ID:???0902nobodyさん
2009/02/07(土) 20:18:17ID:???http://www.namazu.org/~tsuchiya/perl/perl-5.8.html
0903nobodyさん
2009/02/07(土) 20:19:34ID:???@num{qw(0 1 2 3 4 5 6 7 8 9)}= (0 .. 9);
$s=~ s/(\x82[\x4f-\x58]|[\x81-\x9f\xe0-\xfc].|.)/$num{$1} ne '' ? $num{$1} : $1/ges;
でどうよ
0904899
2009/02/07(土) 20:44:36ID:???馬鹿馬鹿しい話ですが tr('0−9', '0-9'); の「0−9」の真ん中のハイフンまで大文字になっていました・・・。
ここを直してSjisで出力したら、テストコード3でOKでした。
use Jcode;
my $txt = '2ちゃんねる';
my $from = jcode('0-9−')->euc;
my $to = jcode('0-9-')->euc;
my $txt = jcode($txt)->tr($from, $to)->sjis;
Jcodeを使ったのは、ググッて見つけた解説がほとんどJcode使用ばっかりだったからです。
Encodeを使った場合、trするのはどうすればいいんでしょうか。
0905nobodyさん
2009/02/07(土) 20:47:14ID:???0907nobodyさん
2009/02/08(日) 01:46:54ID:???DateTime使ってるんなら簡単な関数作ればいいんじゃね?
#!/usr/bin/perl
use strict;
use warnings;
use DateTime;
my $tz = DateTime::TimeZone->new( name => 'local' );
sub s2dt {
my $duration = shift;
my $now = DateTime->now( time_zone => $tz )->epoch;
my $duration_dt = DateTime->from_epoch( epoch => $now + $duration - $now );
return $duration_dt->hms;
}
use Data::Dumper;
print Dumper s2dt(45); # $VAR1 = '00:00:45';
print Dumper s2dt(130); # $VAR1 = '00:02:10';
print Dumper s2dt(3601); # $VAR1 = '01:00:01';
0908nobodyさん
2009/02/08(日) 12:20:52ID:???ドキュメントの読みの浅さが露呈して申し訳ないです。
ありがとうございました。
が、>>891をやるには、単純に
DateTime->from_epoch(epoch => 3601)
でいけると思ったのですが、
> my $duration_dt = DateTime->from_epoch( epoch => $now + $duration - $now );
はどんな意味があるのですか?
0909nobodyさん
2009/02/08(日) 18:14:28ID:bk/uRgIM0910nobodyさん
2009/02/08(日) 18:30:44ID:???0911nobodyさん
2009/02/08(日) 18:38:25ID:???あれですあれ。perlはどうやってやるのですか?
0912nobodyさん
2009/02/08(日) 18:47:33ID:???0913nobodyさん
2009/02/08(日) 18:55:22ID:???0915nobodyさん
2009/02/08(日) 18:59:30ID:???0916nobodyさん
2009/02/08(日) 19:11:47ID:???http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq9.html#how_can_i_get_better_error_messages_from_a_cgi_program
とりあえず、こっちも。
http://perldoc.jp/docs/perl/5.10.0/perldebtut.pod
0917nobodyさん
2009/02/08(日) 22:13:41ID:???自分はこう書いてます。
if () {
} elsif () {
} else {
}
0919nobodyさん
2009/02/08(日) 23:40:09ID:???あ。ごめん$nowいらないな
最初違うやり方で作った後に「差を出せばいっか」ってことに気づいてやったんだけど、
epoch => $duration
だけあればいいね
0920nobodyさん
2009/02/09(月) 00:03:20ID:???If () {
}
elsif () {
}
else {
}
制御文の頭が常に一列目に来るようにこんな感じで。
()の両側には1スペースを入れる。
0921nobodyさん
2009/02/09(月) 00:46:19ID:???} elsif () {
} else {
}
おれはこんな感じ
スタートとエンドが同じタブ位置って考えると、これが自然かなと自分では思ってる。
0922nobodyさん
2009/02/09(月) 03:06:32ID:???if()
{
}
elsif()
{
}
else
{
}
0923nobodyさん
2009/02/09(月) 03:12:05ID:???俺はこう。
if () { }
elsif () { }
else { }
嫌なんだよ、改行が。cssとかもいつもこう書いてる。
0927nobodyさん
2009/02/09(月) 11:44:49ID:???0928nobodyさん
2009/02/09(月) 13:11:50ID:???0931nobodyさん
2009/02/10(火) 00:31:04ID:???0937nobodyさん
2009/02/10(火) 17:59:35ID:???0938nobodyさん
2009/02/11(水) 01:12:17ID:DSvC+HT2for (my $i=0;$i<$num;$i++) {}
for my $i (0..$num-1) {}
# 両方ともしっくりこないのですが、妙案ありませんか?
# ruby の (0...5) みたいなのが希望です
0939nobodyさん
2009/02/11(水) 01:26:15ID:???0940nobodyさん
2009/02/11(水) 01:35:21ID:DSvC+HT2レスありがとうございます。
今回は配列の添字で$iを使いたいのです。説明足らずですいません。
# かといって$[を書き換えるような事はしたくないのでw
0941nobodyさん
2009/02/11(水) 01:40:31ID:???0942nobodyさん
2009/02/11(水) 04:51:02ID:???0943nobodyさん
2009/02/11(水) 06:47:14ID:???0944nobodyさん
2009/02/11(水) 09:12:53ID:???0945nobodyさん
2009/02/11(水) 09:35:29ID:???for(0 .. 4){
my $i = $_;
・・・・
}
0946nobodyさん
2009/02/11(水) 10:55:50ID:???my $num = 5;
my $n = $num-1;
for my $i (0 .. $n) {}
0947nobodyさん
2009/02/11(水) 13:33:22ID:???0948nobodyさん
2009/02/11(水) 13:36:30ID:???それは違うと思うけど
0949nobodyさん
2009/02/11(水) 13:37:25ID:???my @foo;
foreach my $num (0 .. $#foo) { ... }
それか、grep、mapとか・・・
0950nobodyさん
2009/02/11(水) 13:39:43ID:???0951nobodyさん
2009/02/11(水) 19:17:33ID:???0952nobodyさん
2009/02/12(木) 01:21:39ID:elf1AFfGその際予期しないファイルを発見した時、外部サーバーのphpファイルへhttpアクセスするという
事を行いたいのですがどのようにすればよいのでしょうか?
流れは以下のようになります。
1.perlが予期しないファイルを発見する。
↓
2.perlからhttp://www.hoge.com/check.php?g=1へアクセスを行う。
↓
3.check.phpが引数を取得して処理をする。
上記処理を自動で行いたいのですが。
どなたかお解かりになる方、ご教示お願い致します。
0953nobodyさん
2009/02/12(木) 01:29:57ID:???http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq9.html#how_do_i_fetch_an_html_file
0954nobodyさん
2009/02/12(木) 08:59:48ID:???0956nobodyさん
2009/02/12(木) 09:26:47ID:???0957nobodyさん
2009/02/12(木) 12:30:22ID:???あぷうろだを運営しています
ファイルがアップされたときにファイルの中身をプログラムでチェックしており、
あやしいファイルがアップされたときに外部のURLへ通知を行いたいのですが
どのようにやればいいのか分かりません
なのかな?
だとすれば >>953 にある
use LWP::Simple;
$content = get($URL);
で解決します
0960nobodyさん
2009/02/12(木) 16:47:42ID:???$test = '文字列の中の複数の文字を入れ替える事を目的としています';
$test =~ s/文字列/Peal/g;
$test =~ s/目的/CGI/g;
としても駄目でした。
複数の文字列を入れ替える方法をご存知でしたらご教授願います。
0961nobodyさん
2009/02/12(木) 16:51:46ID:???0962nobodyさん
2009/02/12(木) 16:57:41ID:???作業していた文字の中に表現文字が入っていたみたいで正常に作動してなかったみたいです。
実際に使っているコードを見せないと駄目ですよね。以後気をつけます。
ご返答ありがとうございました。
0963nobodyさん
2009/02/12(木) 17:25:17ID:???0964nobodyさん
2009/02/12(木) 17:36:07ID:???0967nobodyさん
2009/02/13(金) 09:47:26ID:???0968nobodyさん
2009/02/14(土) 01:31:17ID:???0969nobodyさん
2009/02/14(土) 10:44:28ID:???これに含まれてないフォーマットは読めない。
use Imager;
my @types = Imager->read_types;
print "@types\n";
0970nobodyさん
2009/02/14(土) 11:43:20ID:???sgi
bmp
ico
pnm
tga
raw
ってなるんだよね。前はjpegも使えたと思うんだけど。アップデートしたときかな
0972nobodyさん
2009/02/14(土) 19:51:11ID:???0974nobodyさん
2009/02/14(土) 22:41:05ID:oywl4yOvそのスレッドの内容が書かれているファイルとディレクトリを削除するため
unlinkとrmdirを使う時、flockのようなことをしなくても問題ないのでしょうか。
一応、ファイルに関しては開いてflockでロックをかけた後、unlinkをしてみたのですが
Permission deniedと表示されてしまい削除されませんでした。
仮に必要な場合はflockではなく、ファイルやディレクトリを作成しその間は読み込めないように
するしかないのでしょうか。
0976nobodyさん
2009/02/15(日) 00:36:02ID:Bli/G9UXflockはファイルの読み書きに対応するのであってしかもflockは
仮にロックがかかっていてもflockを宣言したファイルでなければ
読み込めるみたいですしunlinkとrmdir意味がなさそうですね。
となると使わなくてもいいかファイルやディレクトリを利用してのロックですね。
調べてもそれらしき内容のものは出てきませんし大丈夫な気もしますがどうなんでしょうか。。
0977nobodyさん
2009/02/15(日) 00:50:45ID:???結論だけ言うと、何も考えずに削除してかまわないんじゃないかな。
噛み砕いて解説しようと思ったけど、予備知識が足りてない模様なので、更なる精進を期待する。
0978nobodyさん
2009/02/15(日) 02:46:56ID:Bli/G9UXそうですか。perl以外の他の知識が必要みたいですね。
システムコールあたり?ちなみに'perl unlink'ではなく
'unlink'で調べたらC言語のunlinkの解説が出てきて見てみたのですがopenされてると
削除されないように出来てるみたいですね。削除中にopenされたら?
とも思いましたがファイルの削除が開始された時点でアクセス不可になる。
というように今のところ解釈しています。
あくまで予想なのでこれからももっと励んでいつか理解できるように
なりたいと思います。ありがとうございました。
0979nobodyさん
2009/02/15(日) 03:13:07ID:???flockって同時にopenした時に
片方がもう片方に上書きされるのを防ぐためのもんでしょ
0980nobodyさん
2009/02/15(日) 04:03:44ID:???0981nobodyさん
2009/02/15(日) 09:20:41ID:???unlinkしとけばOSの側がいいように取り計らってくれるから、
こっちがどんな順番でどう処理するか考える必要ないと思うけど。
0982nobodyさん
2009/02/15(日) 09:22:25ID:???消した後に書き込み失敗しても関係ないじゃん。
レス数が950を超えています。1000を超えると書き込みができなくなります。