Perlコーディング初心者質問スレ Part 50
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/06/26(月) 00:46:38ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0402393
2006/07/11(火) 20:20:59ID:P82+nFT5使わない場合はやはり簡単ではないようで。
数学の世界ですねきっと。
0403nobodyさん
2006/07/11(火) 20:35:09ID:???待て待て待て
そのフォーマットなら単純に文字列比較するだけで良いはずだが。
my $limit = sprintf "%04s%02s%02s%02s%02s%02s",sub{shift()+1900,shift()+1,@_}->([gmtime(time-60)]->[5,4,3,2,1,0]);
if ($limit lt $date) { }
で一分以内になるはず。試してないが
後、この場合じゃ無駄だがgmtimeの逆をする関数ならTime::Localにある
ttp://search.cpan.org/~drolsky/Time-Local-1.12/lib/Time/Local.pm
0404nobodyさん
2006/07/11(火) 20:42:15ID:???でいろいろ使えると思うけど。1900足したりしなくていいし。
0405nobodyさん
2006/07/11(火) 20:44:44ID:???0406393
2006/07/11(火) 21:22:41ID:P82+nFT5おお!
モジュールを使うと、フォーマットやら細かい部分が変わってしまって
色々手を入れないといけなくなりそうだったので嫌だったのですが。
盲点でした。60秒前の設定で作り直せばよかったんですね。
それもltなんて知りませんでした。
いまさらltまで発見させてもらって最高です。
0407393
2006/07/11(火) 21:24:30ID:P82+nFT5ltと>ってどうやって使い分けるんですか?
そもそも文字列を数値比較するなら>,==とかでいいとおもうのですが。
0408nobodyさん
2006/07/11(火) 21:29:11ID:???0409393
2006/07/11(火) 21:37:58ID:P82+nFT5???
a ne a
はわかるのですが、
1 lt 1
がわからないのです。
1 > 1とどういう差があるのか・・・
0410nobodyさん
2006/07/11(火) 21:42:41ID:???だからなんで数値だけの文字列と比較するんだよ。
"hoge" と "1234" 比較して、"hoge" の方が大きい事を
判断したい場合もあるだろうが。
数値比較しか無いなら、"hoge"はいつでもゼロになる。
0411393
2006/07/11(火) 21:48:06ID:P82+nFT5hogeに数字を与えるのですか?
hageとも違う数字を?
ちょっと実験してきます。
0412393
2006/07/11(火) 21:50:40ID:P82+nFT5print "左辺の方が小さいです。" if "hage" lt "hoge";
print "左辺の方が小さいです。" if "hoge" lt "hage";
どうやら"hage"の方が小さいようです・・・・
どうなってるのですか?これ。
0413nobodyさん
2006/07/11(火) 22:06:01ID:???0414nobodyさん
2006/07/11(火) 22:06:29ID:???・一文字目は両方ともhで同じ('h' eq 'h')。
・二文字目はaよりもoのほうが後にある('a' lt 'o')
ので、hageよりもhogeのほうが大きい、と判断される。
この一文字一文字の比較はバイト列として行われるから、詳しくはASCIIコード表をじっくり眺めてくれ。
ちなみに、数値しか入ってこないはずの日時の比較になぜ文字列比較をしたのかと言うと。
この場合はまだ良いんだけど、後数桁増えた場合、数値として扱うと誤差が発生するため、固定長の場合は習慣的に。
> print 20060711213959123456;
2.00607112139591e+19
> print 20060711213959123456 < 20060711213959123455
1
0415nobodyさん
2006/07/11(火) 22:24:42ID:???保持しておけば比較も簡単だと思うのだが、なぜわざわざ話をややこしくしたがる奴が多いの
だろうか。
0416nobodyさん
2006/07/11(火) 22:51:13ID:???0417nobodyさん
2006/07/11(火) 23:02:30ID:???ほんとに誤差がでるの?@5.8.8
-------------
$\ = "\n" ;
print 20060711213959123456;
print 20060711213959123456 > 20060711213959123455
-------------
2.0060711213959e+20
1
自分の環境に合わせて、lt を使うかどうか判断しましょう
0418nobodyさん
2006/07/11(火) 23:07:10ID:???書くときに localtime なりすればいいわけで、
これならたとえ 西暦 から ともだち暦 に変わったってデータの変更とか必要ないしな。
0419nobodyさん
2006/07/11(火) 23:09:27ID:???0420nobodyさん
2006/07/12(水) 00:23:20ID:qvG7JsXw今CGIを制作しているのですが、正規表現でおもいっくそ躓きましたorz
例えば「$nameが5文字以上、100文字以下でなければエラーを実行する。」
みたいな感じに「$name」に文字制限を掛けたいのですが・・・。
よろしくお願いします。
0421nobodyさん
2006/07/12(水) 00:31:07ID:cb+ZHaYE0422nobodyさん
2006/07/12(水) 00:35:00ID:qvG7JsXwすいません。ありがとうございます・・・。
しかし、悩んでいるのはその先なんです・・・。それをどのように正規表現のパターンにはめればよいか・・・。
0423nobodyさん
2006/07/12(水) 00:40:55ID:???0425nobodyさん
2006/07/12(水) 00:54:54ID:qvG7JsXw「5文字以上、100文字以下」であることを調べたいと思ってるんですが・・・ orz
0426nobodyさん
2006/07/12(水) 00:57:04ID:???&error;
}
0427nobodyさん
2006/07/12(水) 01:01:22ID:???質問:
5文字以上100文字以下の文字列にマッチする正規表現が書きたい
回答:
出来無くないけど正規表現の使い方間違えてるよ
0428nobodyさん
2006/07/12(水) 01:03:57ID:???&error;
}
0429nobodyさん
2006/07/12(水) 01:06:52ID:w3I1i8Fsprint (2+4)*3/2-1; # 6(8が正しいはず)
print int((2+4))*3/2-1; # 8
となるのは何故でしょうか?
0430420
2006/07/12(水) 01:13:25ID:qvG7JsXwこんな低レベルな質問に・・・本当にありがとうございました orz
0431nobodyさん
2006/07/12(水) 01:13:29ID:cb+ZHaYE0432nobodyさん
2006/07/12(水) 01:17:09ID:???0433nobodyさん
2006/07/12(水) 01:28:20ID:???と「,」で区切られた文字列があるとして
その中の冒頭部分のいくつかの要素が欲しいとき
どうするのが一番メモリ食わずに済みますか?
例えば、上の文字列からbとcとdが欲しい場合、
(undef,$hage1,$hage2,$hage3,undef) = split(/,/,$hoge);
とするのがベストなんでしょうか?
0434nobodyさん
2006/07/12(水) 01:38:13ID:???あとはsplitした結果の配列スライスを取るしかないね。
正規表現は処理として重いし。
データが絶対に1文字なら、substrで切ってからsplitするとか。
データが5000とかあって、3番目から100個取りたいとかいう事でなければ、
あまりメモリを気にしてもしょうがないよ。
perl使ってる時点で、かなりのメモリを喰ってる訳だから。
0435433
2006/07/12(水) 01:46:55ID:???ありがとうございます。
多少のことなんか気にせずバリバリ書く方が気楽なんですけどね。
省メモリに凝りだすと、ついついつまらないことまでも気になって眠れませんw
ちなみにものすごくどうでも良いことだとは思うんですが
(undef,$hage1,$hage2,$hage3,undef) = split(/,/,$hoge);
と
(undef,$hage1,$hage2,$hage3,) = split(/,/,$hoge);
って、あらゆる点から見て全く同じ処理という解釈で良いんですかね?
0436nobodyさん
2006/07/12(水) 01:52:13ID:???(undef,$hage1,$hage2,$hage3,undef) = split(/,/,$hoge,, 5);
0437nobodyさん
2006/07/12(水) 02:05:31ID:???質問の答えじゃないですが
perldoc -f split
で第3引数のLIMITを見てみて。単純にsplitするよりは効率いいかも。
0438433
2006/07/12(水) 02:18:09ID:???なるほど、どこまで読み込むかの範囲指定できる引数を割り当てられるんですね。
って、以前にsplitの項を本で読んだときに絶対目にしてるはずなんだけどなぁ。
実際に使わないと身に付かない体質なのか・・・。
これは付けておくに越したことはないですね。可読性の点からも悪くないですし。
即、該当箇所全てに割り振らねば!
ありがとうございました!
undefで値を捨てるのと、そもそも値を未定義(?)にしておくのと何か違いがあるのか
分かる方いらっしゃいましたら、お暇なときにでも教えて下さい。
0439nobodyさん
2006/07/12(水) 02:44:06ID:???>ちなみにものすごくどうでも良いことだとは思うんですが
>(undef,$hage1,$hage2,$hage3,undef) = split(/,/,$hoge);
>と
>(undef,$hage1,$hage2,$hage3,) = split(/,/,$hoge);
>って、あらゆる点から見て全く同じ処理という解釈で良いんですかね?
上はそのまま。
下は、
(undef,$hage1,$hage2,$hage3) = split(/,/,$hoge);
に最適化される。
0440nobodyさん
2006/07/12(水) 02:56:50ID:???0441nobodyさん
2006/07/12(水) 04:55:16ID:???my ( $hage1,$hage2,$hage3) = ( split/,/,$hoge)[1,2,3] ;
てスライス使わない?
0442nobodyさん
2006/07/12(水) 09:45:38ID:???> これは付けておくに越したことはないですね。可読性の点からも悪くないですし。
> 即、該当箇所全てに割り振らねば!
何も考えずに即値をばらまくと後できっと忘れます。やるならコメント推奨。
> undefで値を捨てるのと、そもそも値を未定義(?)にしておくのと何か違いがあるのか
> 分かる方いらっしゃいましたら、お暇なときにでも教えて下さい。
undef って書かなくていいので、楽ちんな上にプログラムサイズを小さくすることができます。
いや正直「そもそも値を未定義(?)にしておく」が、どういう操作を指しているのか分からないので分かりません。
0444nobodyさん
2006/07/12(水) 11:35:39ID:???(undef,$hage1,$hage2,$hage3) = split(/,/,$hoge);
なんて酷いの始めてみた。
0445nobodyさん
2006/07/12(水) 11:38:48ID:???0446nobodyさん
2006/07/12(水) 11:50:40ID:???undef を左辺に置く手法は、何番目の要素をそれぞれ拾い、捨てているのか視覚的に分かりやすいというメリットもある。
リストの要素数が小さく、かつ一定である場合には特に。
0447nobodyさん
2006/07/12(水) 11:55:26ID:???スライスしなくてもいい
を考えて、warningが出ないなら有用だと思うが
0448441
2006/07/12(水) 12:13:35ID:???まあ機会があれば使うかもしれん。
>>393
>print @{[split /;/,$temp]}->[1];
の方は「 split のケースでは」一生使うことはない。
0449nobodyさん
2006/07/12(水) 14:25:53ID:???0450nobodyさん
2006/07/12(水) 16:11:36ID:x2NzMLn/foreach $keyword (@keywords) {
if ( index($line, $keyword) >= 0 ) {
push (@result, $line);
last;
}
}
}
こーんな感じで検索してるんだけど、
@keywordsの中身がHitしても次の行に行ってくれない、
というか@keywordsの複数の中身がhitすると同じ行が何回もpushされちゃう。
なんでなんでしょうか?
0452nobodyさん
2006/07/12(水) 20:58:47ID:???0453nobodyさん
2006/07/12(水) 21:00:13ID:???視覚的にとかいう意味だと、スライスの方が数字なんだし読みやすい希ガス。
>>451
探す文字がパターンマッチを必要としないならindexの方が激速。
0454nobodyさん
2006/07/12(水) 21:01:33ID:???テストカキコついでに>>392 への遅レス
ダークサイドだが
my @date = grep {$_} split /(\d2})/, '060711' ;
ちう手もあるよん。
0456nobodyさん
2006/07/12(水) 21:10:09ID:???>>454
そw 普段こんなの絶対使わないw
が、たまに
my $i = 0;
my %hash = map { $_ or $i ++ } split /(.{20})/, $hoge ;
とかしたくなって誘惑される。
だからダークサイド。
0457nobodyさん
2006/07/12(水) 21:24:50ID:???>探す文字がパターンマッチを必要としないならindexの方が激速。
なるほど…今度使ってみよう。
>>456
それって20で割り切れなかったら…
まあ、承知のうえで書いてんでしょうけど。ダークサイド宣言してるし。
0458nobodyさん
2006/07/12(水) 21:26:14ID:Fw7S49xFperlで書かれたあるcgiからhtmlを読んでその中身を表示したいのですが、さらに一歩踏み込んで、そのhtmlの中でさらにperlで書かれたcgiを呼んで、そのhtmlを動的に変更して表示したいのですが、そんなこと可能ですか?
0459すいません…
2006/07/12(水) 21:50:43ID:???ダウンロードしたのですが、コマンドプロンプトでバージョンチェックを
しても、「バッチファイルとして認識していません」と表示されるのですが
どうすれば良いのでしょうか?
0460nobodyさん
2006/07/12(水) 21:51:10ID:???一応対応はできる、がこんなことするくらいだったら
普通に hash 作成すべき。
split /(.{20})/, $hoge ;
push @_, '', pop @_ if @_ % 20 != 0 ;
my $i = 0;
my %hash = map { $_ or $i ++ } @_ ;
0461460
2006/07/12(水) 21:59:24ID:???orz...吊ってくる
0462460
2006/07/12(水) 22:03:56ID:???スレ汚しすまん
0463nobodyさん
2006/07/12(水) 22:36:08ID:???Perlでシェルスクリプト(useradd)を使用するにはどうしたらいいでしょうか?
0465nobodyさん
2006/07/12(水) 23:03:43ID:l/BVmrr1これってPerlユーザーの主流じゃないようなんですが
何故ですか
0466nobodyさん
2006/07/12(水) 23:08:41ID:???system "your script" ;
もしくは your script をバッククォートにてかこむ。
your script 部分にはコマンド単独実行時の
打ち込むものすべてを入れる。
0467nobodyさん
2006/07/12(水) 23:18:33ID:???#!/usr/bin/perl
$user = "aaa";
system "useradd $user";
エラーは出ないのですが、ユーザーが追加されてません。
なぜでしょうか?
0468nobodyさん
2006/07/12(水) 23:30:16ID:???具具ってみたけど
useradd って管理者権限が必要でしょ。
sudo useradd か perl 自体の実行を su でするか
しないとだめなんじゃない?
力になれそうにありません。すまん。
0470446
2006/07/12(水) 23:41:57ID:???>>453
> 視覚的にとかいう意味だと、スライスの方が数字なんだし読みやすい希ガス。
もちろんそりゃ読みやすいほうを使ったらよろしいんです。いつでもどちらかがイイってな話はしてないですから。
「視覚的に」と言うからには、数値のリストを添字として読み、それを元にスライスされる前のリストからどの値を取り出してどの値を捨てたのかを、脳内変換すること無しに、その姿を *目で見て* 把握できることを指しています。
逆から言えば、その意味では添字によるスライスの表現は、左辺 undef と比較した場合、視覚的ではないと言わざるを得ないでしょう、ということです。
0471nobodyさん
2006/07/12(水) 23:43:05ID:3OAigznjCGI経由でsql文を実行しようとすると動きません
コンソールからやっても動かないのでsql文がおかしいと思います。
mysql> update todo set content = aho where id = 9;
ERROR 1054 (42S22): Unknown column 'aho' in 'field list'
以上のエラーが出ています。
mysqlのバージョンは4.1.13です。
よろしくお願いいたします。
0472nobodyさん
2006/07/12(水) 23:44:44ID:???それじゃ同じ答えしか返ってこない。
system使えとか、``使えとか、qx() しろとか。
systemの戻り値を調べるか、$! を見て。
0473nobodyさん
2006/07/12(水) 23:46:15ID:3OAigznj本当にありがとうございました。
0474nobodyさん
2006/07/12(水) 23:53:16ID:???>ちょっと質問変えてみます
>Perlでシェルスクリプト実行するにはどうしたらいいでしょうか?
まあ、同じ答えになるんだけどもちょっとだけ詳しく。
「/PATH/hoge.sh を引数 piyo つきで実行するなら」
system "sh /PATH/hoge.sh piyo" ;
「STDOUT を perl の変数に直接入れたいなら」
open EXE, "sh /PATH/hoge.sh piyo|" ;
@data = <EXE> ;
「STDERR とか細かなところまで制御したいなら」
perldoc IPC::Open3あたり
0476nobodyさん
2006/07/13(木) 00:23:07ID:???Perl は UNIX 上の仕事をやっつけるために生まれ、UNIX 系のシステムを中心に普及したから。
でも主流じゃないことを気に病むことはないよ。まずは悩む代わりに、その時間を使ってコードを書くんだ。
0477nobodyさん
2006/07/13(木) 00:26:45ID:???`
0478nobodyさん
2006/07/13(木) 00:32:23ID:???>探す文字がパターンマッチを必要としないならindexの方が激速。
あんま誤解の生じること言わないほうがいいw
0479nobodyさん
2006/07/13(木) 00:38:17ID:???一般に正しいと思うけど。
(最適化のかかる)オートマトン作らなくて良いパターンでなければ、
indexの方が遥かに安価で速いだろう。
0480469
2006/07/13(木) 00:39:17ID:???0482nobodyさん
2006/07/13(木) 00:48:22ID:???0483nobodyさん
2006/07/13(木) 00:48:54ID:???正しくないw
ベンチとってみればわかるけど
A1 $_ =~ /hoge/
A2 index($_, 'hoge')
my $word = 'hoge';
B1 $_ =~ /$word/
B2 index($_, $word)
A1 A2 はほぼ同じ速さで、
B1 は B2 より速い。
index($_, $word[1]) or index($_, $word[1]) ・・・
より
/$word[0]/ or $word[1] ・・・
のが速い。
$_ が 'aaaaaaa......' で $word が 'baaaaaaaaaaaa' とかいう特殊な場合は考えないでね。
0484469
2006/07/13(木) 00:48:56ID:???0485nobodyさん
2006/07/13(木) 00:50:07ID:???× /$word[0]/ or $word[1] ・・・
○ /$word[0]/ or /$word[1]/ ・・・
0486nobodyさん
2006/07/13(木) 00:50:10ID:???日本語の問題だと思うけど。
「探す文字がパターンマッチを必要としないなら(最適化がかかるので)indexの方が激速なんてことはない。」
0487458
2006/07/13(木) 00:52:59ID:aY2uz4D9レスありがとうございます。
もう少し具体的に質問します。
まずparent.cgiがあります。ここやってることはhtmlテンプレートを使ったchild.htmlファイルを読み込んで表示させるだけです。つまり
$template = HTML::TEMPLATE->new(
filename => 'child.html',
);
print $template->output;
のような感じです。
このchild.htmlでは
<!-- TMPL_INCLUDE NAME="hoge.html" -->
のようにhtmlファイルを読み込んでいます。
しかし今回このhoge.htmlの代わりにhoge.cgiを使いたいのです。つまり静的なhtmlファイルではなくcgiを使ってここに表示される内容を動的に変化させたいわけです。これをするのにいい方法ありますでしょうか?
0488nobodyさん
2006/07/13(木) 01:04:37ID:???静的なhtmlをincludeするんじゃなくて、そこで普通にテンプレートを使えば
実質お望みの事ができると思うんだけど…。
0489nobodyさん
2006/07/13(木) 01:05:37ID:???いろいろ方法はあるだろうけど、全く別の CGI を呼ぶ 「いい方法」 というなら SSI が 「いい方法」 だと思うぞ。
0490nobodyさん
2006/07/13(木) 01:06:25ID:???0491nobodyさん
2006/07/13(木) 01:17:32ID:???パーミッション777のディレクトリだとmkdirできるのですが
755だとできません。777だとセキュリティ的に問題ですよね?
755のディレクトリ直下に新規ディレクトリを作成するにはどうしたらいいでしょうか?
0495487
2006/07/13(木) 02:29:43ID:aY2uz4D9知識不足で申し訳ないです。普通にテンプレートを使うとはどういうことでしょう?テンプレートでcgiを実行するようなものがあるんですか?
>> 489
SSIで試してみました。parent.cgiから読み取るのをchild.shtmlにしてその中で<!--#exec cmd="perl hoge.cgi" -->として実行してみました。
結果普通にchild.shtmlを見ると実行が確認できたのですが、parent.cgiの中でshtmlを読み込んでしまうとSSIが実行されないようでダメでした。
>>490
カウンターではありませんw
0496nobodyさん
2006/07/13(木) 02:50:05ID:???テンプレート使ってるってことは、そもそもCGIで動いてるんでしょ。
その場で動的なページ作ればいいだけでは。
テンプレートで静的なhtmlを読み込んで、
さらにそこからCGI叩いて動的なページを、、、なんて考える前に。
0497495
2006/07/13(木) 03:13:47ID:aY2uz4D9レスありがとうございます。
しかしそのテンプレートのhtmlの"ある部分"にCGIの結果を入れたいんですよ。そこはスタイルシート等で位置が厳密に決まっているのでその部分だけ元のparent.cgiでhoge.cgiを呼び出してってのは難しいんじゃないかと思ってます。
0498nobodyさん
2006/07/13(木) 03:25:44ID:???0499nobodyさん
2006/07/13(木) 06:06:02ID:???言いたい事はわかるが、
それはパターンマッチを必要とする条件じゃないのか?
ただの文字列を探すならindexしかないだろ。
0500nobodyさん
2006/07/13(木) 06:14:58ID:???皮をかぶってるかもしれないから、ソース見るかベンチ取るかしてみないと(ry
0501nobodyさん
NGNGふつーに簡単なベンチ取ったら
indexの方が2倍 速かったんですけど
当然っちゃー当然の結果やね
■ このスレッドは過去ログ倉庫に格納されています