Perlについての質問箱 39箱目
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/02/09(月) 21:17:36"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://pc11.2ch.net/php/)
CGI の質問は答えが Perl と全然関係ない話に帰着する場合が
多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html
● 2009/02/09 現在の最新版: 5.10.0
▼ 前スレ
Perlについての質問箱 38箱目
http://pc11.2ch.net/test/read.cgi/tech/1221967332/
リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-6 あたり
0002デフォルトの名無しさん
2009/02/09(月) 21:18:35Perl プログラミング講座: ttp://www.site-cooler.com/kwl/perl/
[本]
リャマ: ttp://www.oreilly.co.jp/books/4873111269/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://www.ascii.co.jp/books/books/detail/4-7561-3057-7.shtml (修正)
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/
[オンラインマニュアル]
最新のドキュメント: ttp://search.cpan.org/dist/perl/
perl5.8.x のドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: ttp://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: ttp://www.cpan.jp/search.cgi (停止中)
perldoc.jp: ttp://www.perldoc.jp/
perldoc.com: ttp://www.perldoc.com/
0003デフォルトの名無しさん
2009/02/09(月) 21:19:37CPAN.com: ttp://search.cpan.org/
河馬屋二千年堂: ttp://homepage3.nifty.com/hippo2000/
[テクニック]
Perl メモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perl のページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perl の小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm
[Perl 5.8 Unicodeメモ]
ttp://www.rwds.net/kuroita/program/Perl_unicode.html (修正)
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004デフォルトの名無しさん
2009/02/09(月) 21:20:36# このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。
# このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。
# 入出力ともシフト JIS 形式のファイルまたは DOS 窓を想定しています。
# まず、以下の行を先頭に入れて下さい。
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)"; # ※1
use Encode;
# 次に、あなたが実行したい処理の内容を入れて下さい。
$file = 'C:/なんたら/かんたら.txt';
open my $fh, '<', encode("cp932", $file) or die $! ; # ※2
print <$fh>;
# 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう
# おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。
# 【注】※1. の行を入れると、DOS 窓への日本語出力は簡便になりますが、
# ソースファイル名に非 ANSI 文字が含まれる場合に die 文の出力が失敗します。
# ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、
# この例のように cp932 でエンコードする必要があります。
0005デフォルトの名無しさん
2009/02/09(月) 21:21:351 http://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 http://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 http://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 http://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 http://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 http://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 http://pc2.2ch.net/test/read.cgi/tech/1068051036/ (事故により消滅)
8 http://pc2.2ch.net/test/read.cgi/tech/1074151549/ (事故により消滅)
9 http://pc5.2ch.net/test/read.cgi/tech/1079114157/
10 http://pc5.2ch.net/test/read.cgi/tech/1085564875/
11 http://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 http://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 http://pc5.2ch.net/test/read.cgi/tech/1097851764/
14 http://pc5.2ch.net/test/read.cgi/tech/1101649274/
15 http://pc5.2ch.net/test/read.cgi/tech/1105953092/
16 http://pc8.2ch.net/test/read.cgi/tech/1111034732/
17 http://pc8.2ch.net/test/read.cgi/tech/1117870308/
18 http://pc8.2ch.net/test/read.cgi/tech/1121804136/
19 http://pc8.2ch.net/test/read.cgi/tech/1126977805/
20 http://pc8.2ch.net/test/read.cgi/tech/1131286411/
0006デフォルトの名無しさん
2009/02/09(月) 21:23:0121 http://pc8.2ch.net/test/read.cgi/tech/1134327348/
22 http://pc8.2ch.net/test/read.cgi/tech/1138519327/
23 http://pc8.2ch.net/test/read.cgi/tech/1141742901/
24 http://pc8.2ch.net/test/read.cgi/tech/1146022352/
25 http://pc8.2ch.net/test/read.cgi/tech/1149259409/
26 http://pc8.2ch.net/test/read.cgi/tech/1153412251/
27 http://pc8.2ch.net/test/read.cgi/tech/1157874614/
28 http://pc8.2ch.net/test/read.cgi/tech/1162273941/
29 http://pc11.2ch.net/test/read.cgi/tech/1166708139/
30 http://pc11.2ch.net/test/read.cgi/tech/1173880452/
31 http://pc11.2ch.net/test/read.cgi/tech/1181500187/
32 http://pc11.2ch.net/test/read.cgi/tech/1186995713/
33 http://pc11.2ch.net/test/read.cgi/tech/1192463997/
34 http://pc11.2ch.net/test/read.cgi/tech/1199977642/
35 http://pc11.2ch.net/test/read.cgi/tech/1208674881/
36 http://pc11.2ch.net/test/read.cgi/tech/1215569470/
37 http://pc11.2ch.net/test/read.cgi/tech/1218449440/
38 http://pc11.2ch.net/test/read.cgi/tech/1221967332/
00071
2009/02/09(月) 21:24:290008デフォルトの名無しさん
2009/02/09(月) 21:29:520009デフォルトの名無しさん
2009/02/10(火) 16:19:34%hoge = {
"A" => [ 100, 300, 800 ],
"B" => [ 150, 50, 320 ],
"C" => [ 160, 220, 500 ]
};
配列n番目の値をソートしてハッシュからKey値を取り出したい。
たとえば、配列2番目(配列[1])の昇順に、ハッシュKeyを
"B", "C", "A" の順番に取り出す、ってなことをやりたい場合
どういうコーディングをすればいいのでしょうか?
よろしくお願いいたします。
0010デフォルトの名無しさん
2009/02/10(火) 20:33:01sort命令使えば一行でできるよ。
my @sortedkeys = sort { /* ここに配列の二番目を比較する方法を書く */ } keys(%hoge);
0011デフォルトの名無しさん
2009/02/10(火) 21:40:03その配列の二番目を比較する方法の書き方を知りたいっていうのが質問の主旨なんじゃ・・・
0012デフォルトの名無しさん
2009/02/10(火) 21:51:320013デフォルトの名無しさん
2009/02/11(水) 01:45:350014デフォルトの名無しさん
2009/02/11(水) 12:57:48perlを用いてexcelデータから行、列ごとにデータを取りこみ、計算処理した後データをファイルに出力することは可能ですか?
0015デフォルトの名無しさん
2009/02/11(水) 12:59:50CPANで探したらそれっぽいモジュールがあると思うよ
0016デフォルトの名無しさん
2009/02/11(水) 13:13:05即レスありがとうございます。
ちょっと自分で調べてみますね
0017デフォルトの名無しさん
2009/02/12(木) 09:54:53どうしたらよいでしょうか?
0018デフォルトの名無しさん
2009/02/12(木) 10:18:54△▲ WebProg 初心者の質問 Part18 ▼▽
http://pc11.2ch.net/test/read.cgi/php/1219842559/
0019デフォルトの名無しさん
2009/02/12(木) 10:21:310020デフォルトの名無しさん
2009/02/12(木) 15:40:13で困っています。
全てのエラーチェックをエラーを表示するように設定しているのですが、
エラー項目が出力されず、かといって先に進めません。
エラーチェックは
if(not $result->has_error){
$c->stash->{template} = "form/cfm";
$c->detach("cfm", $item_id);
のようにして、エラーがなければ次へ行っているのですが$result->has_errorはなぜか真です。
どこがエラーしたか分かる方法とかありませんか?
すみませんがよろしくお願いします。
0021デフォルトの名無しさん
2009/02/12(木) 15:45:14> name => [qw/NOT_BLANK/, [qw/LENGTH 0 20/] ],
を外したら正常動作しました。不思議なのは、ブランクにすると
エラーが出ますし値を埋めても正常動作しない点です。
どなたか助けてください。
0022デフォルトの名無しさん
2009/02/12(木) 15:58:39nameがinvalidになってます。何故なんでしょう・・・。
0023デフォルトの名無しさん
2009/02/12(木) 16:00:28の20を40にすると動きました。お騒がせしました。急いでいたので荒らし気味になってスマソ。
0024デフォルトの名無しさん
2009/02/12(木) 18:20:56しかも半角文字もUTF-8扱いで困った。
0025デフォルトの名無しさん
2009/02/13(金) 02:00:09「もっと短くできる。とにかくperlは文字量、行数を節約して書くものだ」と言われました。
有名なperlの参考書にもそう書いてあります。
とにかくあらゆるテクニックを駆使して短く書くのがperlの美学のように書いてあります。
私は、他の言語では行数にこだわらず可読性を重視してソースを記述していました。
今、perlでやや大きめのプログラム(個人で使うツール)を作ろうとしています。
テクニックや行数圧縮にこだわらず自分が保守しやすい読みやすいコードを書きたいと
思っていますが、それはperlでは許されないのでしょうか。
0026デフォルトの名無しさん
2009/02/13(金) 02:18:43基本的にはシンプルに書けるなら
短い方がわかりやすいものだと個人的には思っている
0027デフォルトの名無しさん
2009/02/13(金) 02:25:18言語仕様が許さないんならともかく、
書けるんなら自分が書きたいように書けばいいじゃないですか。
There's more than one way to do it っていう言葉もありますよ。
0028デフォルトの名無しさん
2009/02/13(金) 02:28:18お好きにどうぞ
0029デフォルトの名無しさん
2009/02/13(金) 10:11:00「 可 読 性 」 は 禁 句
このスレの掟。
0030デフォルトの名無しさん
2009/02/13(金) 16:53:34許しまへんでー
0031デフォルトの名無しさん
2009/02/13(金) 16:58:26自分の好きなように書けばおk
0032デフォルトの名無しさん
2009/02/13(金) 17:31:37abc => "cde"
1 while
or die
$flag and
$_=$flag
/abc/ and 処理
/cdf/ and 処理
/ghi/ and 処理
$name->firstname->camel->output
辺りは知っといて欲しい。
0033デフォルトの名無しさん
2009/02/13(金) 19:49:49ほかの言語だと、したい処理を表現するのに余計なことを書き込まなくてはいけない。
その余計なことはプログラムの流れにとって不自然なので注釈が必要になる。
25はほかの言語の仕様に毒されていてプログラムに無駄が多いんだろうね。
perlが可読性に乏しいと主張する人は単にperlについての知識が乏しいだけだ。
0034デフォルトの名無しさん
2009/02/13(金) 21:22:44知ってる知識だけでプログラムが出来ちゃうところがPerlのいいところだと思う
0035デフォルトの名無しさん
2009/02/13(金) 21:28:43ファイル1枚で絵巻物みたいに長いのは勘弁してください。
0036デフォルトの名無しさん
2009/02/14(土) 12:14:44ソース内でシステムコマンド(たとえば`tasklist`とか)を使うとプロンプトが一瞬開きます。
これを開かないようにする方法ってありますか?
0038デフォルトの名無しさん
2009/02/15(日) 05:33:131Mぐらいのデータを読んで、特定のデータを検索するのですが、
最初、index を使っていたら、これは、\r\nを1文字と解釈するようで、
位置がずれてしまいます。
代わりになる関数を探したけど、見つからないです。
0039デフォルトの名無しさん
2009/02/15(日) 08:14:08Windowsで使ってるでしょ?
特殊変数の$/に「\n」を代入してから検索してみ?
0040デフォルトの名無しさん
2009/02/15(日) 12:01:37バイナリを扱うなら \r や \n といった論理的な表現を使わず \x0D や \x0A を使え。
print index join('', map chr, 0..31), "\x0A"; # 10
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
0041デフォルトの名無しさん
2009/02/15(日) 12:08:271行目は重箱の隅で本件とは関係なし。
2行目はなんなの?
$/ = "\n";
print index($a,$b);
で済む問題。
0042デフォルトの名無しさん
2009/02/15(日) 13:07:18ActivePerlでWindowsでやっているのですが、Webで見つけたサンプルが
use strict;
use warnings;
use HTML::ExtractContent;
use LWP::UserAgent;
となっているのですが、モジュールのインストールの方法がまったくわかりません。
HTML::ExtractContentというのはhttp://search.cpan.org/dist/HTML-ExtractContent/
ここからダウンロードできたのですが、その先をどうしたらよいのでしょうか
LWPというのはとりあえずppmからインストールできました
0043デフォルトの名無しさん
2009/02/15(日) 13:08:54>su
>password: ********
> cpan
:
:
[1]cpan>install HTML::ExtractContent
おしまい。
004442
2009/02/15(日) 14:45:18install HTML::ExtractContent
と入力しエンターを押すとたくさんズラーっとでてきて最終的に
NMAKE : fatal error U1077: 'C:\WINDOWS\system32\cmd.exe' : return code '0xff'
Stop.
TARAO/HTML-ExtractContent-0.05.tar.gz
nmake test -- NOT OK
//hint// to see the cpan-testers results for installing this module, try:
reports TARAO/HTML-ExtractContent-0.05.tar.gz
Running make install
make test had returned bad status, won't install without force
Failed during this command:
ROBIN/Want-0.18.tar.gz : make NO
RCLAMP/Class-Accessor-Lvalue-0.11.tar.gz : make_test NO
TARAO/HTML-ExtractContent-0.05.tar.gz : make_test NO
cpan >
と表示されました。
インストールが完了したと思ったのでサンプルプログラムa.plを実行すると
C:\Documents and Settings\SX3WX06MA\デスクトップ>perl a.pl
Can't locate HTML/ExtractContent.pm in @INC (@INC contains: C:/Perl/site/lib C:/
Perl/lib .) at a.pl line 3.
BEGIN failed--compilation aborted at a.pl line 3.
となってしまいました
これはインストールが失敗したということでしょうか
もしかして、ダウンロードしたモジュールを特別な場所に移動してから
cpan>install HTML::ExtractContent
をしなければいけないのでしょうか
0045デフォルトの名無しさん
2009/02/15(日) 14:50:18> これはインストールが失敗したということでしょうか
そう書いてありますが。
0046デフォルトの名無しさん
2009/02/15(日) 15:33:12cpanのログを読んでどこでcpan installがつまづいたか自力で探すしかないね。
0047デフォルトの名無しさん
2009/02/15(日) 15:36:46http://d.hatena.ne.jp/KNOPP/
の一番最後の方を読むと幸せになるかもしれん。
ただWindowsだからどうなのかは知らん。
> Class-Accessor-Lvalue
> File-Slurp
> をPPMであらかじめいれておき、
そのあと cpan >installしてみたらどーなる?
0048デフォルトの名無しさん
2009/02/15(日) 15:39:14ぽつぽつとスマソ。
004938
2009/02/15(日) 21:14:22ありがとうございました。
$/なる変数は、初めて知りました。
しかし、どうやら原因は、ほかでしたw。
FTP転送の際に、改行を勝手に変換してたため、\r\nが、\nだけになってたことでした。
これで、2文字が1文字扱いされてるなってw
0050デフォルトの名無しさん
2009/02/15(日) 21:16:42indexや正規表現を使ってる。
文字列がutf8に汚染されないように気をつけている程度かな。
0051デフォルトの名無しさん
2009/02/15(日) 21:22:34それだとバイナリにindexや正規表現を使っちゃいけないように読める。
005250
2009/02/15(日) 21:56:57>>51
言われてみればそう読める。
指摘tnx.
ついでに >>36
方法はあるけど、それなりに難しそう。
GUIアプリからコンソールアプリを実行 でググると吉。
もしかしたら既存モジュールがあるかも。
005342
2009/02/15(日) 23:00:58ついさっきまでCentOS5をインストールしてCPANで試してもうまくいかず絶望していましたが、
書き込みを見てリンク先の指示通りにやったら無事プログラムが動きました。
本当にありがとうございました。いくら感謝しても感謝し切れません。
0054デフォルトの名無しさん
2009/02/16(月) 11:55:30おお動いたか、よかったな。少し心配してたw
0055デフォルトの名無しさん
2009/02/16(月) 22:19:33>>50
僕もよく知らないのだが、下のはどうかな?
use Win32::OLE;
my $WshShell = Win32::OLE->CreateObject("WScript.Shell");
$WshShell->Run('tasklist', 0);
0056デフォルトの名無しさん
2009/02/17(火) 07:10:12ググったところ、グローバル変数ならシンボルテーブルとかいうものを検索すれば見られそうな感じですが、
レキシカル変数は無理なのでしょうか
0057デフォルトの名無しさん
2009/02/17(火) 09:16:53なぜそんなことが必要な状況になったかが問題だと思う。
0058デフォルトの名無しさん
2009/02/17(火) 09:32:52つPadWalker
0059デフォルトの名無しさん
2009/02/17(火) 13:26:55デバッグのときにあまり本体を汚さずに中の変数を覗きたいんですよ
最終的には一行書くだけで自動的に変数をトレースしたいです
>>58
それ素晴らしく完璧ですね
ありがとうございます
0060デフォルトの名無しさん
2009/02/17(火) 14:03:35知らないならレスしないでください
0061デフォルトの名無しさん
2009/02/17(火) 14:25:230062デフォルトの名無しさん
2009/02/17(火) 14:36:07後出しみっともない
0063デフォルトの名無しさん
2009/02/17(火) 15:42:16コピペにマジレスみともない。
0064デフォルトの名無しさん
2009/02/17(火) 15:49:58そう思うならやるなよ
0065デフォルトの名無しさん
2009/02/17(火) 16:31:29いつまでもみっともない。
0066デフォルトの名無しさん
2009/02/17(火) 17:50:44必死だな!
0068デフォルトの名無しさん
2009/02/17(火) 18:41:46もう返信しないで下さい。キモいです。
0069デフォルトの名無しさん
2009/02/17(火) 19:08:440070デフォルトの名無しさん
2009/02/17(火) 23:44:42"a,b,c:ABC,d,e,DEF"ghi
のような文字列があった場合に、
ABC(コロンとカンマの間)
DEF(カンマとダブルクオテーションの間)
の文字を取得するにはどのようにすればよいでしょうか?
indexとsubstrを駆使してみましたが、
カンマやダブルクオテーションが複数あるため
indexの位置が正しく取得できずに断念しました。
0071デフォルトの名無しさん
2009/02/17(火) 23:51:51っ[パターンマッチ]
0072デフォルトの名無しさん
2009/02/18(水) 00:29:51ありがとうございます。
$tmp =~ /:(.+)\,/;
のようにやってみましたが、下記の結果になってしまいました。
$1⇒「ABC,d,e」
後ろのカンマのマッチを無視するにはどのようにすればよいでしょうか?
0073デフォルトの名無しさん
2009/02/18(水) 00:39:30(.+?)で最小マッチングできるよ
0074デフォルトの名無しさん
2009/02/18(水) 00:50:47ABC ⇒ /:(.+?)\,/
DEF ⇒ /.+\,(.+?)"/
↑で、うまくいきましたー。
ありがとうございました
0075デフォルトの名無しさん
2009/02/18(水) 06:44:36内容を置換して出力し直すことは可能でしょうか
0076デフォルトの名無しさん
2009/02/18(水) 07:48:500077デフォルトの名無しさん
2009/02/18(水) 14:57:23どうもです
007875
2009/02/18(水) 23:09:04ですが、perl はサポートしてないんですよね
実現してるモジュールなんかはありますでしょうか
0079デフォルトの名無しさん
2009/02/19(木) 01:33:04親切な僕が変態 ReplacePrint.pm をそれっぽく書いたげたお。
die のほうはせっかく例外投げてんだから catch してあげて。
使い方:
use ReplacePrint;
print "string\n";
# ここから ReplacePrint.pm
package ReplacePrint;
use strict;
sub TIEHANDLE { bless [], $_[0] };
sub PRINT {
my $self = shift;
my @str = @_;
for (@str) {
s/$/ is replaced/;
print STDOUT;
}
}
my $out;
open *OUT, ">", \$out;
my $stdout = select(OUT);
tie *OUT, "ReplacePrint";
1;
0080デフォルトの名無しさん
2009/02/19(木) 03:00:45まだファイルハンドルあたりやtaiについての知識が薄いので、
ここ2,3日で実験しながら学びたいと思います
また何か分からないことがあると思うので、
よろしくお願いします
008179
2009/02/19(木) 22:56:32正直、想定外の好反応にあわててる僕がいるお。
外野からの「こんなひどいことするくらいなら設計見直したほうがいい」系のツッコミを期待してたので。
>>79 は猛烈にやっつけで、行儀の良くないことをいくつもやっている点が「変態」の所以。
なのでこのまま流用したりすると後でひどい目にあうことうけあい。
ヒント程度にしておくのが吉です。
0082デフォルトの名無しさん
2009/02/20(金) 00:25:080083デフォルトの名無しさん
2009/02/20(金) 09:24:24:viaレイヤ使うといいのかもしれない。使ったことないけど。
0084デフォルトの名無しさん
2009/02/20(金) 10:12:570085デフォルトの名無しさん
2009/02/20(金) 11:43:28不足しているのでもうすこし勉強しましょう。
0086デフォルトの名無しさん
2009/02/20(金) 14:09:07っ[Digest]
0087デフォルトの名無しさん
2009/02/20(金) 14:28:40s/>/test/g
とやってもうまく検索できません
EUC-JPへのエンコードなどしてみたのですが、そうすると他の文字が一部文字化けなどしてしまい更に
面倒なことになったので、できれば文字のエンコードなしで日本語の置き換えをしたいです
Dumpで表示した\xxxなどの形式で検索もしてみましたが、うまく置き換えできませんでした
日本語の置き換えに何かいい方法はないでしょうか?
置き換えしたい文字は">"だけです。
0089デフォルトの名無しさん
2009/02/20(金) 18:31:12009088
2009/02/20(金) 18:56:00index関数とsubstr関数で置換できました
0091デフォルトの名無しさん
2009/02/20(金) 18:58:52これはどういう意味なんでしょう?
# untaint
$0 =~ /^(.+)$/;
my $self = $1;
$0でスクリプト自身のファイル名を取ってきて
正規表現に掛け、マッチしたものを別の変数に入れてますけど、
これだと$0と$selfは一緒なものが入る気がするんですが・・・。
0092デフォルトの名無しさん
2009/02/20(金) 19:21:24志村〜、コメント、コメント
汚染されたデータからパターンマッチで部分文字列を取り出すことで
汚染を取り除いている(=untaint)のだが、汚染とは何かとか言い出すと
長くなるので「perl 汚染」でぐぐっていろいろと調べてみるといいよ。
0093デフォルトの名無しさん
2009/02/20(金) 20:02:26(汚染チェックの重要性は十二分に解ってはいるんだけど)
009491
2009/02/20(金) 21:38:11レスありがとうございます。
なるほど、不正なコマンド含んでたりするものを取り除いてるわけですね。
でもこの正規表現だと任意の文字列にマッチしてしまって取り除いたりは
できないような気もしますが・・・。一回正規表現を通して見かけだけ汚染を
取り除いたとみなしてるんでしょうか。
まぁ調べる方針はわかったのでもう少し調べてみます。どうもでした。
0095デフォルトの名無しさん
2009/02/20(金) 23:19:11取り除いただけです。よい子は真似しないこと!
0096デフォルトの名無しさん
2009/02/21(土) 18:23:38perl -e 'use strict;my%H;sub A{my %H@H{qw/A B C/}=(1,2,3);return \%H};*H=A();print "$H{C}\n"'
この二つ
上は何故かコンパイルも通り、意図したようにデータも返すことが出来る
下は一見すると正しい文法だし問題もないように見えるけどなぜかデータを取得できない
原因がわかる人いますか?
0097デフォルトの名無しさん
2009/02/21(土) 18:24:12perl -e 'use strict;my%H;sub A{my %H;@H{qw/A B C/}=(1,2,3);return \%H};*H=A();print "$H{C}\n"'
の間違いです。スマソ
0098デフォルトの名無しさん
2009/02/21(土) 20:00:22スコープが違うから。
上はサブルーチンの外側で宣言した %H に代入している。
下はサブルーチンの内側で宣言した %H に代入している。
型グロブはパッケージ変数。
0099デフォルトの名無しさん
2009/02/21(土) 20:18:27なるほど
パッケージレベルのmy変数はどの関数からも見えるんですね
あと型グロブはmy変数とは異なるパッケージ変数と。勉強になりました
0100デフォルトの名無しさん
2009/02/22(日) 11:53:36●ログインするプログラムを書いてみました。
しかし、認証に失敗して、以下のセッションIDが返ってきます。
SESSION-ID=ERROR:ppppppppppp
何かアドバイスお願いします。
※IDとパスワードはここではダミーのものとしていますが
実際には自分自身のIDとパスワードを使用しています。
use strict;
use Socket;
use FileHandle;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
my $id='id';
my $pw='password';
my $ua = LWP::UserAgent->new;
$ua->agent('DOLIB/1.00');
$ua->default_header('X-2ch-UA' => 'Hoge/1.00');
my $url='https://2chv.tora3.net/futen.cgi';
my %form = ('ID'=>$id,'PW'=>$pw);
my $req = POST($url,[%form]);
0101デフォルトの名無しさん
2009/02/22(日) 12:51:19手元で検証してみたが、サーバ側のバグかもしれない
IDパラメータの「@」が「%40」にエンコードされていると認証に失敗した
0102101
2009/02/22(日) 12:58:44futen.cgiに渡すパラメータは通常
[email protected]&PASS=password
って風になるんだけど、これが
ID=mail%40domain.jp&PASS=password
という風に渡すと、なぜか認証に失敗する。
本来は後者でも%40が@にデコードされた結果、認証が成功していないといけないのだが…
あ、>>100のコードでおかしいところ発見。
my $req = POST($url,[%form]);
↓
my $req = POST($url,\%form);
0103デフォルトの名無しさん
2009/02/22(日) 13:12:46・エンコードしない。
・[%form]→\%formに修正。
再度実行してみましたけど、認証に失敗・・・orz
いや、プログラムが間違ってるわけじゃなくて、サーバ側の実装がおかしいんです。
で、一応の回避策ですが、
\%form
↓
Content => "ID=$id&PW=$pw"
に修正すればうまくいくかと思います。
P.S.
サーバ側のバグについて
http://qb5.2ch.net/test/read.cgi/operate/1225876082/591
にて問い合わせています
0105デフォルトの名無しさん
2009/02/22(日) 14:11:11辛抱強く DAT 落ちしたログ持って待ってた甲斐があった。
…単なるログコレクターみたいなもんなんだけど…。
0107デフォルトの名無しさん
2009/02/22(日) 19:48:03すぐそういうことを言う・・・
たまたま知ってたから自慢したいだけやろ。
0108デフォルトの名無しさん
2009/02/22(日) 20:13:00そういう風に嫉妬むきだしの解釈するのは感心しませんね。
>>106さんは、自分がたまたま読んでいなかったばかりに、素早く問題点を
指摘してあなたがたに無駄働きさせないことが出来なくてすいませんと
言いたかったんですよ。
0109デフォルトの名無しさん
2009/02/22(日) 20:18:330110デフォルトの名無しさん
2009/02/22(日) 22:12:06解決しました。
ありがとうございました。
0111デフォルトの名無しさん
2009/02/22(日) 22:36:020112デフォルトの名無しさん
2009/02/22(日) 22:40:110113デフォルトの名無しさん
2009/02/22(日) 22:40:200114デフォルトの名無しさん
2009/02/22(日) 22:40:390115デフォルトの名無しさん
2009/02/22(日) 23:51:08手で引っぱって全部剥けるなら心配いらん。
0116デフォルトの名無しさん
2009/02/23(月) 03:18:46>switch.layer3.asia が稼動してる際に SNMPv2c の一般的な読み取りコミュニティ名で
>リクエストを送ると、どこかのツリーの下に私の携帯電話番号が現れますよ
http://layer3.asia/
痛いw
0117デフォルトの名無しさん
2009/02/24(火) 03:02:56klassというのをたまに見掛けるけど、これはどういった意図で使ってるの?
ある程度の頻度で見掛けるので、一定の合意があるのかと思って聞いてみました。
0118デフォルトの名無しさん
2009/02/24(火) 03:29:04funktionなんてのもよく見るね
0119デフォルトの名無しさん
2009/02/24(火) 13:22:48読み出したデータの名前はa1からa10までで、それを$a1から$a10に入れたいのですが、
$form = new CGI;
$a1 = $form -> param('a1');
$a2 = $form -> param('a2');
…と、a10まで順番に書いていかなければならないんでしょうか。
すっきりした書き方があれば、教えて下さい。
0120デフォルトの名無しさん
2009/02/24(火) 13:25:44そもそも変数名に通し番号をつけるセンスをなんとかすべきだな。
配列使えよ。
0121デフォルトの名無しさん
2009/02/24(火) 13:32:09foreach(0..10){push(@a, $form->param('a' . $_))}
でいいんじゃね?ゼロからだけど@aの添え字にあわせるため。
0122デフォルトの名無しさん
2009/02/24(火) 14:00:14${"a$_"} = $form->param("a$_") for 1..10;
0123デフォルトの名無しさん
2009/02/24(火) 14:13:51push(@a,$form->param($_))for a0..a9;
0124デフォルトの名無しさん
2009/02/24(火) 14:23:55ソートする時とか上のような技法が使えないから。
0125119
2009/02/24(火) 14:41:12配列なんて考えもしませんでした…思いついたところで、
今度は「配列に入れたいんですが」と泣きついていたように思いますが。
桁数にも気をつけます。
ありがとうございました。
0126デフォルトの名無しさん
2009/02/24(火) 14:45:13ラマ本は買った?
http://www.amazon.co.jp/dp/4900900818
昔のラマ本の方が分かりやすかったな・・・。
0127デフォルトの名無しさん
2009/02/24(火) 14:45:310128デフォルトの名無しさん
2009/02/24(火) 14:47:47http://www.amazon.co.jp/dp/4873111269
0129デフォルトの名無しさん
2009/02/24(火) 17:06:30print Math::BigFloat->new('436611485')->fdiv('2074', 3)->bstr, "\n";
# 211000 と表示されてしまう
0130デフォルトの名無しさん
2009/02/24(火) 17:24:37fdivじゃなくてbdivだよな。bdivの二番目の引数は精度だから精度3桁で計算合ってるよ。
0131デフォルトの名無しさん
2009/02/24(火) 18:44:14utf8の文字列(フラグ付き)で、 'あ' という文字を 650字程度より
多い状態で、sjis に変換すると 途中から、????? と文字化けします。
Jcode.pm ってバイト数の制限があるのでしょうか。
どなたか知っていたら教えてください。
0132デフォルトの名無しさん
2009/02/24(火) 18:54:10とりあえずざっと目通した?
http://search.cpan.org/~dankogai/Jcode-2.07/Jcode.pm
http://search.cpan.org/~dankogai/Encode-2.31/Encode.pm
0133デフォルトの名無しさん
2009/02/24(火) 23:21:18それに加えて、呼び出し元(さらに呼び出し元の呼び出し元なども)の関数を表示できるような機能ってありますか?
&aaa();
sub aaa{ &bbb(); }
sub bbb{ &ccc(); }
sub ccc{ &ddd(); } #ここでエラー
たとえば、上のようなプログラムで、関数 ddd が定義されていないとき、
「Undefined subroutine &main::ddd called at test.pl line XX.」というエラーが出ますが、
このエラーの呼び出し元が bbb でさらにその呼び出し元が aaa であることが
エラーメッセージで表示されると助かります。
0134デフォルトの名無しさん
2009/02/24(火) 23:52:07ここにプログラムがありますが、これを実行するために
1.必要なもの
2.(1.)が揃ったらやること
をざっと教えてください。
0135デフォルトの名無しさん
2009/02/24(火) 23:57:57自前でエラー出すなら perldoc carp 参照。
そうじゃなきゃ、perl -d hoge.pl でデバッガ上で実行すれば?
0136デフォルトの名無しさん
2009/02/25(水) 00:06:54増田に聞けば?
はてなでもいいけど
とりあえず自分がどこまで理解しているのかくらいは書けよ
環境とか
0137デフォルトの名無しさん
2009/02/25(水) 00:13:10すんません
プログラミング経験はありません
環境はwindows vistaです
0138デフォルトの名無しさん
2009/02/25(水) 00:26:05> http://anond.hatelabo.jp/20080822142610
> ここにプログラムがありますが、これを実行するために
> 1.必要なもの
それを実行するために何が必要で、何をやればいいのかがわかるだけの知識。
0139デフォルトの名無しさん
2009/02/25(水) 00:26:18それ書けば質問に答えられるのか?
0140デフォルトの名無しさん
2009/02/25(水) 00:31:02その知識を分けてください
>>139
もしかしたら>>134の1,2,の回答だけじゃ俺には無理かもしれないけど
最低限それだけあれば頑張れそうな気がする
要するにエロい思いしたいからです。
0141デフォルトの名無しさん
2009/02/25(水) 00:32:540142デフォルトの名無しさん
2009/02/25(水) 00:33:200143デフォルトの名無しさん
2009/02/25(水) 03:22:27ここ見て、知らない単語はぐぐれ。
ttp://www.moongift.jp/2008/06/strawberry_perl/
英語読めるなら
ttp://win32.perl.org/wiki/
0144デフォルトの名無しさん
2009/02/25(水) 13:44:59プログラミング自体が初めてなら、こうゆう本から始めたほうがいいかもな。
http://books.livedoor.com/item/379362
Perlとは何か、プログラムとは何か、というところから始まってるから。
ただ、オレ自身はこの本を読んだことはないが。
0145デフォルトの名無しさん
2009/02/25(水) 19:34:10その上、読んでない本すすめてるし
ちょっと興味もって調べたら著者はこぼら
0146デフォルトの名無しさん
2009/02/25(水) 23:35:21さっそく登録した
0147デフォルトの名無しさん
2009/02/26(木) 06:13:13http://fleur.hio.jp/perldoc/mix/Fields.ja.html
フィールドソートをしたいのですが、
use Sort::Fields;
これを書くとエラーになります。インストール先ディレクトリをみると
sort.pmやfields.pmがperl本体と同じディレクトリに置かれています。
本来は perl本体のディレクトリ直下から /sort/の下に存在するべき物でしょうか?
インストール場所が悪いと手直しをお客に依頼する必要があるのですが、
作業は大変でしょうか?
環境はlinux Red Hatなのでsortで頑張った方が良いですか?
sort に詳しくありません。
0148デフォルトの名無しさん
2009/02/26(木) 06:21:09大爆笑
0149デフォルトの名無しさん
2009/02/26(木) 06:59:300150デフォルトの名無しさん
2009/02/26(木) 09:21:400151デフォルトの名無しさん
2009/02/26(木) 10:15:42確かにuse Sort::Fieldsがアクセスするのは"[モジュールの検索パス]/Sort/Fields.pm"(大文字小文字の区別有り)だと思うけど、
なんかファイル名が小文字でperl本体と同居してるとかなってるなら
もはやカオスとしか言いようが無い。
CPAN行ってインストールをやり直した方がマシじゃね。
もちろん、使うコマンドは"perl -MCPAN -e shell"で。
0152デフォルトの名無しさん
2009/02/26(木) 10:27:07第三フィールドでソートしたいとかなら配列の配列使えば出来るよ。
0153デフォルトの名無しさん
2009/02/26(木) 10:46:46バカに引っ張られて自分もバカになるなよ。
0154デフォルトの名無しさん
2009/02/26(木) 13:04:39ひとまずこっちに質問させてください。
XMLっぽいタグを解析してるんですが、
<AAA BBB=CCC>
にマッチさせるのに
/<.*?>/
と書いています。一応これでマッチするのですが、CCCに例えば
<AAA BBB="XXX>=YYY">
のような大小比較式がダブルクオートで囲まれて入っている場合があって、
このときは上の書き方だと
<AAA BBB="XXX>
にマッチしてしまいます。ダブルクオート内を無視して<〜>にマッチさせる
にはどう書けば良いのでしょうか?
よろしくお願いします。
0155デフォルトの名無しさん
2009/02/26(木) 13:17:120156デフォルトの名無しさん
2009/02/26(木) 13:21:26でググったら変態正規表現がけっこうヒットするな。
0157154
2009/02/26(木) 13:34:510158デフォルトの名無しさん
2009/02/26(木) 17:04:37/(<[^>"]*?(?:(?:".*?){2}|)>)/
0159147
2009/02/26(木) 22:26:27>use Sort::Fields
>"[モジュールの検索パス]/Sort/Fields.pm"(大文字小文字の区別有り)
やっぱりそうでしたか。
エラーにはperlのインストール環境と思われるパスが出力されました。
>なんかファイル名が小文字でperl本体と同居してる
今日も確認しましたが、小文字でperl本体と同居になっていました。
お客の環境を使っているので、指摘や説明をするのが大変なので諦めます。
有り難うございました。
0160デフォルトの名無しさん
2009/02/27(金) 07:35:19sort.pm, fields.pm => pragma
Sort::Fields => 外部モジュール
「人間はタマゴから生まれる」レベルの気違い理論を展開してる事に気付け。
0161デフォルトの名無しさん
2009/02/27(金) 07:40:210162デフォルトの名無しさん
2009/02/27(金) 07:58:040163デフォルトの名無しさん
2009/02/27(金) 11:24:32終了処理ができたんですが、Vistaでは終了処理が実行されずに、問答無用で停止し
ているようです。Vistaで終了処理を実行するヒント等、ありますでしょうか?
ActivePerl 1004で、以下のようなスクリプトでテストしています。
$SIG{INT} = $SIG{HUP} = $SIG{TERM} = $SIG{KILL} = $SIG{QUIT} =
sub {
# 終了処理
}
while (1){
print "a";
sleep 1;
}
0164デフォルトの名無しさん
2009/02/27(金) 17:07:51配列を空っぽにする方法はありますか?
0165デフォルトの名無しさん
2009/02/27(金) 17:13:02@a = ();
0166164
2009/02/27(金) 17:31:23うまく空っぽにすることができました
0167デフォルトの名無しさん
2009/02/27(金) 17:35:31できれば仕組みも理解してね。応用利くから。
0168デフォルトの名無しさん
2009/02/28(土) 23:31:59かけないでしょうか。
0169デフォルトの名無しさん
2009/02/28(土) 23:37:29#!/usr/bin/perl
foreach my $fn (@ARGV){
open my $fp, "<", $fn;
print scalar(<$fp>);
}
0170デフォルトの名無しさん
2009/02/28(土) 23:39:31書けるよ
0171デフォルトの名無しさん
2009/02/28(土) 23:43:380172デフォルトの名無しさん
2009/03/01(日) 00:10:02書けるよ
0173デフォルトの名無しさん
2009/03/01(日) 00:10:14いやん
0174デフォルトの名無しさん
2009/03/01(日) 00:11:000175デフォルトの名無しさん
2009/03/01(日) 00:21:22まだ冗長だね。
#!/usr/bin/perl
while(<>){
print $_;
close(ARGV);
}
0177デフォルトの名無しさん
2009/03/01(日) 00:40:57>>175
close(ARGV)ってclose($ARGV)やclose(@ARGV)とはどう違うん?
とりあえず、printの後の$_は省略出来るぜ
0178デフォルトの名無しさん
2009/03/01(日) 00:45:08おお、�d>printの後の$_
close(ARGV)はコマンドラインで指定されたファイルのうち今開いてるファイルを閉じる。
次の<>では次のファイルを開く。
0179デフォルトの名無しさん
2009/03/01(日) 00:52:04print ;
close ARGV;
0180デフォルトの名無しさん
2009/03/01(日) 01:17:030181デフォルトの名無しさん
2009/03/01(日) 01:23:460182デフォルトの名無しさん
2009/03/01(日) 01:32:220183デフォルトの名無しさん
2009/03/01(日) 01:57:480184デフォルトの名無しさん
2009/03/01(日) 08:33:59print $musabetsutero;
0185デフォルトの名無しさん
2009/03/01(日) 10:38:53いつのネタだよ。ったく。
0186デフォルトの名無しさん
2009/03/01(日) 10:42:21先にcloseしちゃうからダメじゃん。
0187デフォルトの名無しさん
2009/03/01(日) 11:04:56closeする前に1行分が読み込まれてるから大丈夫。
0188デフォルトの名無しさん
2009/03/01(日) 11:13:47あ、そか。さんくす。
0189デフォルトの名無しさん
2009/03/01(日) 12:05:500190デフォルトの名無しさん
2009/03/01(日) 12:12:36Shift-jisでスクリプトを書いていてShift-jisのファイル名でファイルを作成しようとするとエラーは出ないのですがファイルが作成できません
英数字のファイル名だとファイルが作成できます
0191デフォルトの名無しさん
2009/03/01(日) 12:16:16システムがShift-JISのファイル名に対応してなかったら当然作れない。
あと""で囲むとメタ文字が発動するかもな。
0192デフォルトの名無しさん
2009/03/01(日) 12:28:07$file = "テスト";
open FH, ">$file"; →失敗
open FH, '>$file'; →書き込めるが当然変数展開がされない
open FH, ">テスト"; →成功
open FH, '>テスト'; →成功
ファイル名を変数を使わずに直接記述するとうまくいきました
変数に格納されている文字列の形式がおかしいのかな…
0193デフォルトの名無しさん
2009/03/01(日) 12:35:19調べてないけど、2回""で囲ってるからメタ文字が二度発動してるんだと思われ。
0194デフォルトの名無しさん
2009/03/01(日) 12:37:40ダメ文字という言葉は知っておいた方がいい。
0195デフォルトの名無しさん
2009/03/01(日) 13:24:190196デフォルトの名無しさん
2009/03/01(日) 13:45:53$a = '十\';
だと思うが、探すのもメンテも面倒だしなんかイラッとくるから、
$a = <<'EOF';
十
EOF
chop($a);
とするようにしてる。
0197デフォルトの名無しさん
2009/03/01(日) 13:47:50昔はqwなかったからその時の流儀をそのまま使ってる。
0198デフォルトの名無しさん
2009/03/01(日) 13:53:03連投スマソ
0199デフォルトの名無しさん
2009/03/01(日) 17:07:13>>4のテンプレがあるのにな。
0200190
2009/03/01(日) 19:41:26ならファイルが作成できるんですが、
open ">$file.txt"にするとだめでした
事前に$file .= ".txt";
で文字結合してもだめでした
0201デフォルトの名無しさん
2009/03/01(日) 19:48:27ソースファイルのエンコーディングは何?
もしSJISでなければSJISにしてみては?
0202デフォルトの名無しさん
2009/03/01(日) 19:49:520203190
2009/03/01(日) 19:53:45open ">テスト.txt";はできます
末尾に.txtを文字結合すると書き込めなくなるようです
0204190
2009/03/01(日) 20:00:43改行コードを含んでいたようです
スレ汚し失礼しました
0206デフォルトの名無しさん
2009/03/03(火) 13:58:07my(%ch, $i);
$i = 0;
sub new{
my($pkg, $data) = @_;
$ch{$i} = $data;
my $self = {obj_num => $i ++};
return bless $self, $pkg;
}
sub DESTROY{
delete $ch{$_->{obj_num}};
}
カプセル化ってこんな感じでいいの?
自分で動かした感じは問題なさそうだけど普通のオブジェクトとアクセサしか使えないだけで同じ動作する?
02071/2
2009/03/03(火) 17:18:15どのレベルでのカプセル化を言っとるんだ?
その例だと、呼出元にて、$obj->{obj_num} = 10 ; とかしてobj_numに
直接代入可能だから、その点ではカプセル化されたとは言えん。
只、編集とか継承とかしない限りにおいて、$ch{$obj->{obj_num}} には
アクセス出来ん事だけは確かだ。ゲッタねえし。
インサイドアウトオブジェクトレベルの意味ならば以下に簡単な例。
Hoge2は(恐らく)貴方の目指してた物をインサイドアウトで実現してる。
new時に投入した'hoge'がアクセサを介さず変えられるか?がポイント。
package Hoge; #=== カプセル前 ===
sub new { bless { data => pop }, shift ; }
sub setter { shift->{data} = pop ; return ; }
sub getter { shift->{data} }
1;
package Hoge2; #=== カプセル後 ===
use Scalar::Util qw(refaddr) ;
my %hash ;
sub new { my $obj = bless \do{''}, shift ; $hash{ refaddr $obj } = shift ; $obj ;}
sub getter { $hash{ refaddr shift} ; }
sub setter { $hash{ refaddr shift} = pop ; return ; }
sub DESTROY { delete $hash{ refaddr shift } ; }
1;
02082/2
2009/03/03(火) 17:18:54use Data::Dumper ;
use Hoge;
use Hoge2;
my $obj = Hoge->new('hoge') ;
print Dumper $obj ; # ほら丸見えだし、
$obj->setter('fuga') ; # 折角セッタでセットしても
$obj->{data} = 'bar' ; # カプセル化出来てねえよ。
print $obj->getter . qq{\n} ; # ほらね、変えられちゃった
my $obj2 = Hoge2->new('hoge') ;
print Dumper $obj2 ; # bless先がdo{ }で弄り様もねえしなあ。
printf "%s\n", $obj2->getter;
$obj2->setter('fuga') ; # 専用のセッタを用いて漸く変更可能。
printf "%s\n", $obj2->getter;
#Hoge2を以下の様に書いてるサイト(有名所)もあるが、大ポカだから注意!
#package Hoge2;
#my %hash ;
#sub new { my $obj = bless \do{''}, shift ; $hash{ $obj } = shift ; $obj ;}
#sub getter { $hash{ shift } ; }
#sub setter { $hash{ shift } = pop ; return ; }
#sub DESTROY { delete $hash{ shift } ; }
#1;
長文失礼
0209デフォルトの名無しさん
2009/03/03(火) 19:46:08それそれ、それ完璧
Scalar:Util の refaddr がよく分からんけど、Dumper に見てもらった限りだとオブジェクトごとに固有の数字を割り振ってくれる感じなのかな?
とりあえずゲッターとセッター書いたのに、
使わなくても自由に書き換えできるなら書く意味ないじゃんってのが気持ち悪かったから、
それが解消できればよかった
$iゴニョゴニョはrefaddrの代わりにオブジェクトごとに固有の数字を割り当てるために使ってたつもり
$_はミスです
後でScalar::Utilについては色々詳しく調べてみます、丁寧にありがとう
助かりました
0210デフォルトの名無しさん
2009/03/04(水) 19:05:23どこらへんが大ポカなの?
0211デフォルトの名無しさん
2009/03/05(木) 09:30:590212デフォルトの名無しさん
2009/03/05(木) 11:27:450213デフォルトの名無しさん
2009/03/07(土) 01:50:07としたときに引数が設定されたメソッドが生えると思います
ですが
Hoge::huga('hogehoge');
としてもhogehogeは無視されるようです
設定した引数に加えて更に引数を追加する方法は無いでしょうか
0214デフォルトの名無しさん
2009/03/07(土) 04:47:47> *Hoge::huga = /&hogehoge('hugahuga');
> としたときに引数が設定されたメソッドが生えると思います
本当?
> 設定した引数に加えて更に引数を追加する方法は無いでしょうか
*Hoge::huga = sub { hogehoge('hugahuga', @_); };
0215デフォルトの名無しさん
2009/03/07(土) 12:31:20つ Sub::Curry
0216デフォルトの名無しさん
2009/03/07(土) 13:32:36Adware.Vundo/Variant [ 4 items ]
Files
C:\PERL\LIB\AUTO\FCNTL\FCNTL.DLL
C:\PERL\LIB\AUTO\LIST\UTIL\UTIL.DLL
C:\PERL\LIB\AUTO\MIME\BASE64\BASE64.DLL
C:\PERL\LIB\AUTO\SOCKET\SOCKET.DLL
と検出されていました。
昔、perlをインストールした憶えはあるのですが、入れた経緯は忘れてしまいました。
これって誤検出ですよね?
誰かSUPERAntiSpyware入れてる方で、検出された方いますか?
0217デフォルトの名無しさん
2009/03/08(日) 12:29:04perlが使えればawkでできることは全てできる、それはわかってるんです。
でも、awk使う人ってawk単独で使うわけじゃなくてbash,sed,grepなんかも使えるから
結局出来ることに違いはないですよね。
むしろやる内容によってはawkのほうがスッキリ書けますし。
どういった場合にどちらを使えば良いのか教えて下さい。
※awkは古いからダメとか、ダサいとか、そういうのは抜きにして下さい。
純粋に有用性の観点のみでお願いします。
0218デフォルトの名無しさん
2009/03/08(日) 12:35:530219デフォルトの名無しさん
2009/03/08(日) 12:43:15やっぱり楽なほうを選ぶのが賢明ですか。
Windowsだとperl単独のほうが環境を整えやすいでしょうね。
UNIXやLinuxだったら最初から色々入ってるのが普通ですけど。
Cygwinとか入れてよければどちらでも手間は変わらない気がしますけど、
学校や会社のPCなんかだと、何かインストールするのに許可が必要だったりしますし。
0220デフォルトの名無しさん
2009/03/08(日) 12:47:41元awk使いだけど。言語的なメリットはないと思うよ。
Perlはawkの後方互換を目指した言語だからね。awk2perlっつって
awkスクリプトをPerlスクリプトに置換するものがあるのは最近の人は知らなさそう。
ちなみにPerlにはawk互換のためだけに作られた機構がいくつかある。
awkのメリットは必ずプリインストールされているから
root権限持ってない場合でも必ず動くってとこだけど、
今日びデフォルトでPerlが入らないケースは稀だろうから、
このメリットも失われつつある。
長いことCGIプログラマをやってきたけどPerl覚えてからawkを使う機会は
上記のようなケースを除いてゼロになったな。特にここ10年は全く書いてない。
0221デフォルトの名無しさん
2009/03/08(日) 12:51:19a2pで変換すると長〜いスクリプトに変換してくれますよね。
あれってどうにかならないでしょうか。
あれ見るとawkのほうが簡単じゃん、って思ってしまうんですよ。
0222デフォルトの名無しさん
2009/03/08(日) 12:57:02いやいやa2pは人工知能じゃないし、最適化とかはしないから
長くなるのは仕方ない。
awkはバイナリ扱えないとか(今は知らんけど)文字コード変換が大変とか
色々制約あるし、書くのもPerlの方が楽だよ。
0223デフォルトの名無しさん
2009/03/08(日) 13:06:22>いやいやa2pは人工知能じゃないし、最適化とかはしないから
>長くなるのは仕方ない
私もそれはあるだろうなぁ〜、と思ってましたけど、やっぱりそうですか。
>awkはバイナリ扱えないとか(今は知らんけど)文字コード変換が大変とか
>色々制約あるし、書くのもPerlの方が楽だよ。
シェルスクリプトでバイナリは扱えますよね。
nkfとかconvmvとか使うと文字コード変換できますね。
でも、やっぱりperlのほうが楽なのですか?
もし楽ならperlを学んでみたいなぁ、と思います。
0224デフォルトの名無しさん
2009/03/08(日) 13:13:58でもやっぱりPerlが楽ですね。awkより短く速く書けるよ。
0225デフォルトの名無しさん
2009/03/08(日) 13:23:11補うべく作られた言語だからね。そもそもは。
0226デフォルトの名無しさん
2009/03/08(日) 14:02:19でも当たり前だよな。
sedはできることが少ない。
grepはできることが少ない。
wcは、mvは・・・
って、言えばその通りだが、
単独で使うわけじゃないから気にするようなことでもない。
一つで何でもやれるようになんていうLarry Wallがバカなだけ。
0227デフォルトの名無しさん
2009/03/08(日) 14:37:32perlが使えればsedでできることは全てできる、それはわかってるんです。
でも、sed使う人ってsed単独で使うわけじゃなくてbash,awk,grepなんかも使えるから
結局出来ることに違いはないですよね。
むしろやる内容によってはsedのほうがスッキリ書けますし。
どういった場合にどちらを使えば良いのか教えて下さい。
※sedは古いからダメとか、ダサいとか、そういうのは抜きにして下さい。
純粋に有用性の観点のみでお願いします。
0228デフォルトの名無しさん
2009/03/08(日) 14:56:45perlとperl以外で同じことをやってみれば違いがわかるだろう。
大雑把な傾向として、シェルスクリプトのほうが覚えることが少なく、
簡単なことは簡単にかける。
日本刀があれば包丁は要らないわけではないのと同様、
Perlがあってもsedは必要。
sed 's/nae/moe/g' akiba.txt
perl -pe 's/nae/moe/g' < akiba.txt
----------------------------------------------
awk 'BEGIN{FS=","}$2 == $3{print $1}' hoge.csv
perl -F',' -alne 'print $F[1] if $F[2] ne $F[3]' hoge.csv
でも、ある程度以上の規模のスクリプトを組んだり、
C言語に近いようなことをしたいならPerlを選びましょう。
0229デフォルトの名無しさん
2009/03/08(日) 15:26:42Perl不要論ですか。これは新しい。
0230デフォルトの名無しさん
2009/03/08(日) 15:37:05絶対必要ってわけじゃないだろ。Perlが入ってないマシンいじる
機会があるならともかく。覚えといて損はない程度だと思うが。
日本刀でも料理は出来る。
>>226
インストーラがPerlを要求するご時勢にこんな事言う人がいるとは。
昔はそうやって批判する人もいたけどね。
0231デフォルトの名無しさん
2009/03/08(日) 15:47:58日本刀で料理w
そこまでムキになって否定しなくてもいいんでない?
世の中シェルスクリプトはできるけどPerlはできない人なんてゴロゴロいるし、
Perlが出来ても使い捨てスクリプトはシェルスクリプトでやる流儀の人もいる。
どうあがいても完全にシェルスクリプトを駆逐するのは無理だよ。
自動車の優位性をいくら説いても原チャリや自転車はなくならないのと同じでさ。
0232デフォルトの名無しさん
2009/03/08(日) 15:52:30不要とは言ってない。Perlでブートするわけにはいかんだろw
ただマの知識として必要かというとPerlで事足りる人もいるだろう。
0233デフォルトの名無しさん
2009/03/08(日) 16:07:30お前こそムキになってPerlは必要ないって言ってるじゃん
0234デフォルトの名無しさん
2009/03/08(日) 16:07:39エンドユーザの立場から一言。
プログラマの方のお考えはごもっともです。
しかし、「高層建築にカンナやカナヅチなんて要らない」的発想が
今日のエンドユーザー・コンピューティングの惨状を招いたのではありませんか?
たかだかちょっとした自動化、文書検索、集計程度も自分で書けない人だらけにしてしまったのは
「素人は言語なんて使わなくていい」という発想のせいだと思えるのですが。
0235デフォルトの名無しさん
2009/03/08(日) 16:21:46特にスクリプト系言語を使うってことは、大体が小物でしょう?
自分がサッと書けること。これが重要。
0236デフォルトの名無しさん
2009/03/08(日) 16:26:44時代のせいだと思います。
例えば自分はWebプログラミング畑だけど、全てのWebアプリケーションを
全部Cで書くことは納期的にほとんど不可能です。awkでは完成すらしない
ものも出てきます。
自分も昔はquick sortくらいは空で書けたけど、Webに足を
突っ込んだ今ではそれすら忘れてしまいました。
0237デフォルトの名無しさん
2009/03/08(日) 16:47:37quicksortなんてlibcに任せときゃいいんですよ。気に病むことでもない。
0238デフォルトの名無しさん
2009/03/08(日) 16:59:13quick sortもできないの?
ププ
0239デフォルトの名無しさん
2009/03/08(日) 17:03:17だね。
>>238みたいになんでも自分で作るとたまに間違うことがあるし、
馬鹿馬鹿しいプライドで心がねじ曲がってしまう。
0240デフォルトの名無しさん
2009/03/08(日) 17:17:39プログラマの方のお考えはごもっともです。
しかし、sortコマンド打つのが簡易で合理的な発想だと思えるのですが。
たかだかちょっとしたソートも自分で書けない人だらけにしてしまったのは
「素人はソートなんてやらなくていい」という発想のせいだと思えるのですが。
0241デフォルトの名無しさん
2009/03/08(日) 17:22:210242デフォルトの名無しさん
2009/03/08(日) 17:24:54■libcでqsort()を再帰を使って実装してる香具師は怠慢だろ…常識的に考えて
http://d.hatena.ne.jp/n2s/20070421/p1
0244デフォルトの名無しさん
2009/03/08(日) 20:19:13シェル言語ってのは地味に需要がある。
MSがUNIX/Linuxへの対抗心むき出しでWindows PowerShellなんぞ作ってるくらいだから。
UNIX/Linuxを普段使ってる人ってのはシェルを対話的に利用するのに慣れている。
だから、さて何か組もうかって時もシェル言語が第一選択になる。
それでダメな時に別の言語を選ぶ。
UNIXの世界ではシェルでできることはシェルで、というのが昔から暗黙の了解なので
いきなりPerlやPythonでやろうとするのは、コンピュータの世界にWindowsから入った人くらいだろう。
それは例えて言うなら、自家用車を持ってるのにリムジンをレンタルしてドライブするようなもんだ。
0245デフォルトの名無しさん
2009/03/08(日) 22:44:41多いな。例えばいくらオプションでsplitを暗黙
にさせても[]書かされる時点で、$1,$2でいい
awkにはかなわない。
もちろんガッツり書くならスクリプト言語。
0246デフォルトの名無しさん
2009/03/09(月) 17:17:271行目は同意だが、あとはいつの時代の話だよと思うな。
そりゃ配布物配ろうとか思ったらまずshを選択するだろうが、
例えばWebアプリケーション作る時にshを第一選択肢に上げるか?
hello world以外は特にsh使う場面って思いつかないんだが。
0247デフォルトの名無しさん
2009/03/09(月) 17:48:50普通にファイル処理やテキスト処理には使うし、
処理を自動化するのにも使うし、
定期的にどっかのサイトにアクセスして、特定の情報だけを記録するとか、
その程度の用途には当たり前に使うと思うが。
本格的なプログラミングか、ワープロとか表計算みたいに出来合いのアプリで済ませるか、
二者択一だったらパソコンライフなんて送れねーよ。
それとも、プログラミングってのはアプリとwebの開発のためだけにあんのか?
0248デフォルトの名無しさん
2009/03/09(月) 17:54:320249デフォルトの名無しさん
2009/03/09(月) 17:54:45例外は認めないのかよw
普遍的な事のように書くから変な誤解受けるんだろ。
んで、それらの用途にシェル使わない人もいると思うが何かデメリットでもあるのか?
「UNIXの世界ではふつー」とかじゃ理由にならんだろ。
例えば毎秒起動とかだったらさすがに少々面倒でもshを第一選択とするのが吉だと思うが。
0250デフォルトの名無しさん
2009/03/09(月) 17:58:02>んで、それらの用途にシェル使わない人もいると思うが何かデメリットでもあるのか?
同じことができるならそれでいい。
ただし、より面倒臭くなることはあるだろう。
何も難しくないワンライナーでできることに他の物使うとか、そういうのは単なるアホだろ。
0251デフォルトの名無しさん
2009/03/09(月) 18:06:37コマンド並べれば動くから
難しいナンチャラ理論やらウンタラ指向やらも考えなくて済む
プログラマでないエンドユーザや管理者にも使えるのは大きなメリットだと思うな
0252デフォルトの名無しさん
2009/03/09(月) 18:07:23要するに余計面倒な時だけsh使うでもいいわけね。
>>244はとてもそういう論調には見えないけど。
そういう俺はよくshスクリプト書くがな。
0253デフォルトの名無しさん
2009/03/09(月) 18:10:49w3m -dump http://www.media-k.co.jp/jiten/wiki.cgi?%A1%E3%B4%E9%CA%B8%BB%FA%A1%A6%A3%C1%A3%C1%A1%E4 | grep '´_'
0254デフォルトの名無しさん
2009/03/09(月) 18:11:49> 何も難しくないワンライナーでできることに他の物使うとか、そういうのは単なるアホだろ。
Perlプログラミングに没頭してる合間とかだったら、AWKの方が少々短くても
Perlのワンライナーを選択することはあるな。
短く書けるっつったってせいぜい数バイトだろ>>228。頭切り替える方が面倒だわ。
0255デフォルトの名無しさん
2009/03/09(月) 18:13:28Perlに没頭してるあなたにとってはPerlでやるほうが簡単なんでしょうね
別にそれはそれでいいのでは?
だからといって、それはあなた個人の特殊事情で簡単に感じるだけなのだから、
シェルでやるほうが手間が少ない人にまで強要すべきことではないでしょう
0256デフォルトの名無しさん
2009/03/09(月) 18:15:10いつ強要したんだよww俺はこうだって言っただけじゃん。
逆に>>244なんかshで出来ることにPerl使う奴は外道みたいな書き方じゃん。
0257デフォルトの名無しさん
2009/03/09(月) 18:17:24「何事もshが第一選択にするのが普通、じゃなきゃ外道」
みたいな主張がおかしいと言ってるだけなんだが。
0258デフォルトの名無しさん
2009/03/09(月) 18:22:07話がかみ合わない理由って案外簡単なんじゃない?
普通にUNIX系OS使ってる人にとってshって標準的な道具だから、
シェルで作業するってのは鉛筆で文字を書くのと同じくらい簡単で当たり前なんだよ。
だから、どうしても他の物を試す前にshで、っていう発想になるだけでしょ。
0259デフォルトの名無しさん
2009/03/09(月) 19:01:03はっきりさせてくれ。
0260デフォルトの名無しさん
2009/03/09(月) 19:09:120261デフォルトの名無しさん
2009/03/09(月) 19:20:030262デフォルトの名無しさん
2009/03/09(月) 19:41:35世界じゅうどこを見て回っても、WEBアプリしか無いんだから
awk も sh もいらん。perl しか選択の道は無いだろ。
0263デフォルトの名無しさん
2009/03/09(月) 19:43:50しゃべる電子レンジのファームウエアを awk や sh で書けると思ってんの?
0264デフォルトの名無しさん
2009/03/09(月) 19:56:310265デフォルトの名無しさん
2009/03/09(月) 20:00:33イマドキのPerlerには、Perlのワンライナーのほうが慣れてる人が多いんだろうね。
0266デフォルトの名無しさん
2009/03/09(月) 20:06:24perlの人は
ls
と打たずに
opendir(DIR,'.');
@file = sort readdir(DIR);
foreach(@file){
$time = localtime ((stat($_))[9]);
print "$time"."\t"."$_\n";
}
closedir(DIR);
とやるわけですね?
簡単なことをいちいち
perl ふがほげ
perl うんたらかんたら
ってやるのは不自然なんですけど
0267デフォルトの名無しさん
2009/03/09(月) 20:10:37Windowsユーザならlsなんぞ打たずにファイラとかエクスプローラだろうしな
でも、スクリプトの話じゃなかったのか
0268デフォルトの名無しさん
2009/03/09(月) 20:13:40cat hoge | wc -l
とせずに
0269デフォルトの名無しさん
2009/03/09(月) 20:14:54wc -l <hoge
catとか使わないな
0270デフォルトの名無しさん
2009/03/09(月) 20:15:05シェルとシェルスクリプトに何の違いがあんの?
コマンドが単発か複数かの違いだけじゃん?
0271デフォルトの名無しさん
2009/03/09(月) 20:15:32その場でうちこんで終わりかの違いじゃね
0272デフォルトの名無しさん
2009/03/09(月) 20:17:15シェル言語使わなけりゃいいじゃん
そこまで言うならPerlだけで暮らせ
0273デフォルトの名無しさん
2009/03/09(月) 20:18:570274デフォルトの名無しさん
2009/03/09(月) 20:23:470275デフォルトの名無しさん
2009/03/09(月) 20:26:16この話ではWinユーザは無関係と思われ
UNIXの操作ではシェルが母国語みたいなもんなのに
簡単な用事でも外国語使いたがる変人だけが対象
0276デフォルトの名無しさん
2009/03/09(月) 20:30:510277デフォルトの名無しさん
2009/03/09(月) 20:40:09perl -ne 'print if /UNIX/ || /Linux/' hoge
シェルを普通に使いこなしてる人なら最初の方が明らかに簡単だろ?
打鍵数だけじゃなく、構文的にも。
「何でもPerl」ってやりかたが変だってのは、そういうこと。
shは古い、awkやgrepは低機能だと文句言いながら、より難しくやってる人たちを変だと言ってるだけさ。
で、シェルとシェルスクリプトをやたらに区別したがってる奴がいるが、本質は同じだろ。
シェル使って作業して、コマンドを複数使って仕事しようとすると、シェルスクリプトと言われるだけで。
0278デフォルトの名無しさん
2009/03/09(月) 21:04:33その例なら
grep '(UNIX|LINUX)' hoge
かなあ
awkなんて使わないよ
でもえぇやん。。。
0280デフォルトの名無しさん
2009/03/09(月) 21:13:16環境によって動かないとおもいまつ
GNU grep 2.5.3
では少なくとも×
grep -e UNIX -e Linux hoge
これなら動きます
ただし、awk使うのと難しさに大差ありません
0281デフォルトの名無しさん
2009/03/09(月) 21:15:29Perlより簡単な方法が出てくる件
0282デフォルトの名無しさん
2009/03/09(月) 21:21:06ありゃ
egrepならいいのかな?
0283デフォルトの名無しさん
2009/03/09(月) 21:21:44そうでつね
0284デフォルトの名無しさん
2009/03/09(月) 21:29:38Bシェルとかgrepとかawkとかsedなんて前時代の遺物だと思ってたけど・・・
今でも十分に使えんじゃん
0285デフォルトの名無しさん
2009/03/09(月) 21:45:28あらゆるスキルを磨いとけってこった。
0286デフォルトの名無しさん
2009/03/09(月) 22:15:16それでも sed や awk を使うのでは1行で済まない場合は
(シェルスクリプト組むような場合は)、Perl の方がシンプルになってくる
0287デフォルトの名無しさん
2009/03/09(月) 22:19:03なんでshのコマンドラインとワンライナーを比べるんだか・・・。
ネジ緩んでるの?後者は一応スクリプトだぞ。
コマンドはスクリプトで書くのが大変or不可能なことをするために
存在するんだからwcとか例に持ってくるのは愚の骨頂。
0288デフォルトの名無しさん
2009/03/09(月) 23:24:23簡単なことだけならシェルスクリプトの方がシンプルだと思うが
>>287
それって自分の首絞めてないか?
コマンド単体で強力ならそれを利用したスクリプトも強力なわけで
0289デフォルトの名無しさん
2009/03/09(月) 23:42:01ワンライナーってコマンドラインの延長じゃねーの?
質的な違いなんてねーよ
0290デフォルトの名無しさん
2009/03/09(月) 23:48:37Perlとsedとawkとbashはどれがいちばんつおいのですか?
0291デフォルトの名無しさん
2009/03/09(月) 23:57:590292デフォルトの名無しさん
2009/03/10(火) 00:00:57問:以下のシェルスクリプトをPerlに直しなさい。
#!/bin/sh
o=$(echo "$@" | sed 's/ /+/g' | sed 's/ /+/g')
w3m "http://www.google.co.jp/search?hl=ja&q="$o"&meta=lr%3D&aq=f&oq="
0293292
2009/03/10(火) 00:08:22sed 's/ /+/g' | sed 's/ /+/g'
の部分は
sed 's/[ ]/+g'
でも同じですが、
全角スペースと半角スペースを列記すると見た目にわかりにくくなるので、
問題文ではあえて別々に処理しとります。
0294デフォルトの名無しさん
2009/03/10(火) 00:15:36perlも仲間に入れてあげなよ
0295デフォルトの名無しさん
2009/03/10(火) 00:18:460296デフォルトの名無しさん
2009/03/10(火) 00:21:18判断するのは難しいよな
0297デフォルトの名無しさん
2009/03/10(火) 01:53:00糞linuxごときの標準シェルなんぞどーでもえーわ
0298デフォルトの名無しさん
2009/03/10(火) 06:31:060299デフォルトの名無しさん
2009/03/10(火) 11:47:12からといってここに八つ当たりしなくてもねえ。
0300デフォルトの名無しさん
2009/03/10(火) 22:07:54ある程度の日付の範囲をもって複数の祝日を取得するときは問題なく動作するんだけど、ある特定の祝日を一つに絞って実行すると上手く動作しない。
printをあちこちかませて調べてるんだけどどうも$keyが上手く取れてない様子。通常はURLが入るんだけどNGの場合はXMLのタグ名がなぜか入ってきてNGになってしまう。
上手く動かすには何が足らないんだろ?
use LWP::UserAgent;
use XML::Simple;
&Holiday ("2009-02-01", "2009-04-01"); # OK
&Holiday ("2009-03-20", "2009-03-21"); # NG
sub Holiday {
my $feed_base = 'http://www.google.com/calendar/feeds/[email protected]/public/full';
my $sdate = $_[0]; # この日を含む開始日
my $edate = $_[1]; # この日を含まない終了日
my $query = "start-min=${sdate}&start-max=${edate}";
my $feed_url = $feed_base . '?' . $query;
my $ua = LWP::UserAgent->new;
my $res = $ua->get( $feed_url );
if( $res->is_success ){
my $xml_parser = XML::Simple->new();
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
my $holidays_data = $xml_parser->XMLin( $res->content );
foreach my $key ( keys %{ $holidays_data->{ entry } } ){
#print "$key\n";
my $holiday_day = $holidays_data->{ 'entry' }{ "$key" }{ 'gd:when' }{ startTime };
print $holiday_day , "\n";
}
}else{
die $res->status_line;
}
}
0301デフォルトの名無しさん
2009/03/10(火) 23:08:10以下のコードを実行するとhoge_fooという出力を期待していたのですがfooとしか表示されません。
おそらく_が何か演算子としての働きをしているんだと思いますが、
一体これはどういう意味を持つ演算子なんでしょうか?教えてください。
Perlのバージョン:This is perl, v5.8.8 built for MSWin32-x86-multi-thread
$hoge="hoge";
$foo="foo";
print "$hoge_$foo\n"; # 出力:foo
print "$hoge\_$foo\n"; # 出力:hoge_foo
0302301
2009/03/10(火) 23:10:45$foo="foo";
$hoge_="まさか・・";
print "$hoge_$foo\n";
print "$hoge\_$foo\n";
どうみても誤解釈です。ほんとうにありがとうございました。
0303デフォルトの名無しさん
2009/03/10(火) 23:11:023行目で$home_ を展開してる。
サンプルコードの最初に
$hoge_ = "HOGE";
て入れてみると、3行目の出力が「HOGEfoo」になる。
0304デフォルトの名無しさん
2009/03/10(火) 23:11:340306デフォルトの名無しさん
2009/03/11(水) 10:31:12($self->{year},$self->{month},$self->{day}) = ( gmtime time + $time_difference * 3600 )[5,4,3]
この [5,4,3]っていうのはどういうことなのですか?
こういう書き方の呼称がわからないのでググれなくて
0307デフォルトの名無しさん
2009/03/11(水) 10:50:280308デフォルトの名無しさん
2009/03/11(水) 13:46:550309デフォルトの名無しさん
2009/03/11(水) 18:19:50ググる前にマニュアルを読めばいいと思うよ。
http://perldoc.jp/docs/perl/5.10.0/perldata.pod
0310デフォルトの名無しさん
2009/03/11(水) 18:31:28perldata読めばいいってはじめからわかってたら困らんだろ。
0311デフォルトの名無しさん
2009/03/14(土) 10:04:59以下のようなソースがありまして、
$| = 1;
print "Start\n";
$i = 0;
while($a = <>){
print "Loop: $a $i\n";
$i++;
}
print "End\n";
コマンドラインから perl test.pl などとして起動すると、
Ctrl+Z(ENTER)でEOFを渡して(よくわかってない?)中断して終了できますよね。
しかし、EOF(0x1a)を、
ファイルで渡したり(perl test.pl < test.txt)、Delphi等のプログラムから渡したりすると
上記プログラムでは終了してくれなす。
これを終了してくれるようにするにはどうしたらよいでしょうか?
0312デフォルトの名無しさん
2009/03/14(土) 10:06:38捕捉
> EOF(0x1a)を、ファイルで渡したり
これは、バイナリエディタで 74 65 73 0D 0A 74 65 73 74 0D 0A 1A 0D 0A のように記述しました。
0313デフォルトの名無しさん
2009/03/14(土) 11:13:250314デフォルトの名無しさん
2009/03/14(土) 11:24:011A は関係ないと思う。
1A は有っても無くても終了するはずだよ。
でないと UNIX などは大変なことになる。
1A は Windows だけの習慣。UNIX のテキストファイルには普通 1A は無いからね。
原因は何か他にあるんじゃないの?
0315311
2009/03/14(土) 12:15:10OS: Windows Vista SP1 32bit
perlは体分前に入れたものなので古い
This is perl, v5.8.3 built for MSWin32-x86-multi-thread
(with 8 registered patches, see perl -V for more detail)
>>314
ファイルをつっこむと、1Aで終了せずに、ファイル全部読み込んだら終了します
プログラムで(というか以下のライブラリ)で読むと、1A送っても無限ループが続く幹事
http://maxxdelphisite.free.fr/doscmd.htm
1AってそもそもEOFじゃないんのかな?
0316デフォルトの名無しさん
2009/03/14(土) 12:27:16先ず先に<>はSTDINとARGV両方を示す事を理解しろ。
プログラム引数に何か渡されたら、< であろうが、ARGVとして扱われ、
ARGVがあれば、暗黙のうちに<>は<ARGV>として挙動する。
従って
====
while(<>){ print "ARGV: $_" }
while( ($_=<>) !~/^$/ ){ print "STDIN: $_"}
====
をhoge.plとして保存して以下の様に実行した場合、
perl hoge.pl < hoge.pl
は、ARGVの中身を全てプリントした後にSTDINの処理をする
(STDIN処理は、何も入力せずにreturnで終了)。
外部ファイルにシグナルを入れて流し込むのが仮に可能だと
しても、それをどのタイミングで使うかは書き手に任される訳だから、
素直に終了フラグを立てるのが普通では無いの?
0317デフォルトの名無しさん
2009/03/14(土) 13:49:03>>プログラム引数に何か渡されたら、< であろうが、ARGVとして扱われ、
へー
0318デフォルトの名無しさん
2009/03/14(土) 13:55:55それでも言葉不足だけどw
perl hoge.pl < hoge.pl
は、
while(<ARGV>){ print ; }
でも
while(<STDIN>){ print ; }
動くよ。
0319デフォルトの名無しさん
2009/03/14(土) 13:57:020320デフォルトの名無しさん
2009/03/14(土) 14:08:580322デフォルトの名無しさん
2009/03/14(土) 14:28:14Pod::HTML, Pod::HtmlEasy, Pod::Xhtml, Pod::Tree::HTML,
Pod::Simple::HTML, Pod::Simple::XHTML...と、色々試していますが、
L<Foo>やら=item * <Bar::Baz>やらマルチバイト文字やら、
一部に対応しているものがありますが、全部に対応したものはないように
感じました。
0323デフォルトの名無しさん
2009/03/14(土) 17:02:33>ファイルをつっこむと、1Aで終了せずに、ファイル全部読み込んだら終了します
>プログラムで(というか以下のライブラリ)で読むと、1A送っても無限ループが続く幹事
結局どうなの?終了するの?無限ループするの?どっちなの?
結局、何がしたいの?どういう動作を期待してるの?
0324デフォルトの名無しさん
2009/03/14(土) 19:47:30どうしてもそれを望むなら OS を CP/M に換えるといい
0325デフォルトの名無しさん
2009/03/14(土) 21:48:070326デフォルトの名無しさん
2009/03/16(月) 20:40:31perl -E '
@tmp=([1,2,3],[4,5,6],[7,8,9]);
for (@tmp){
for (@{$_}){say}
}'
出力
1
2
3
(以下略)
という構文をforeach修飾子を使って、以下のように書いたのですが、
perl -E '
@tmp=([1,2,3],[4,5,6],[7,8,9]);
say for @{$_} for @tmp;'
コンパイルエラーになってしまいます。
このような二重のforeach修飾子は使えないのですか?
それともコードが間違っているのでしょうか?
perlのバージョンは
v5.10.0 built for x86_64-linux-thread-multi
です。
0327デフォルトの名無しさん
2009/03/16(月) 20:59:27Any simple statement may optionally be followed by a SINGLE modifier,
just before the terminating semicolon (or block ending).
0328デフォルトの名無しさん
2009/03/16(月) 21:15:11もしくはrand()で出る一番小さな数字というのがあれば教えて頂けないでしょうか。
0329326
2009/03/16(月) 21:19:15ありがとうございます。
参考になりました。
0330デフォルトの名無しさん
2009/03/16(月) 21:51:39perldoc -f rand
0331デフォルトの名無しさん
2009/03/16(月) 23:58:47if($data =~ /\d\d:\d\d:\d\d \d*/){
print "マッチ\n";
}else{
print "マッチせず\n";
}
「数字数字:数字数字:数字数字 いくつかの数字」という文にだけヒットさせたいんですが、
何故か余計な文字の入っている上の文でもヒットしてしまいます。
どうしてヒットしてしまうんでしょうか?
環境:This is perl, v5.8.8 built for MSWin32-x86-multi-thread
0332331
2009/03/17(火) 00:01:27*を+にしたらうまくいきました。
0333デフォルトの名無しさん
2009/03/17(火) 00:42:36標準関数はこのパターンが多いような気がします。
シェルスクリプトの場合だとたいてい逆ですよね?
0334デフォルトの名無しさん
2009/03/17(火) 07:18:18って考えれば Perlの関数の多くも コマンドの終了コードも同じ
0335デフォルトの名無しさん
2009/03/17(火) 08:34:52アフォ?
0336デフォルトの名無しさん
2009/03/17(火) 16:16:53そだよ
だからsystem関数の使い方には注意
Perl6では、system関数の戻り値もPerlの流儀になる
0337デフォルトの名無しさん
2009/03/17(火) 20:36:43if($ARGV[0] =~ /^A+[0-9]$/)
でいいのかな
おしいかも。
/^A[0-9]+$/
でもその前にchomp入れた方がよいかも♪
0339デフォルトの名無しさん
2009/03/17(火) 20:47:23ありがとーw
0341デフォルトの名無しさん
2009/03/18(水) 04:15:450342デフォルトの名無しさん
2009/03/18(水) 09:46:260343311
2009/03/18(水) 10:41:45時間が空いてすいません。
^Z(1A)はシグナルなのでそもそもファイルからは渡せないもんなんでしょうか?(単にデータとして受け取られる)
問題は、通常のプログラムから標準入力を渡した場合なのですが、これもファイルから渡したのと同様になる
ものなのでしょうか?
つまり、何かのデータをフラグと見立てて、それを検出したら終了、というような作業が必要なものか、と。
0344311
2009/03/18(水) 10:44:13期待する動作は、プログラムで1Aを送ると終了して欲しい、ということです。
ターミナルやコマンドプロンプトなどで、^Zを送ったときと同じような動作を期待しています。
0345デフォルトの名無しさん
2009/03/18(水) 10:44:39\d や \w はロケールや UTF-8 フラグによってマッチする文字が変わる。例えば全角数字。
$ は改行の直前にもマッチするので、"A10\n" =~ /^A[0-9]+$/ が真となってハマる初心者多し。
^ は /m が指定されていない限り文字列先端にしかマッチしないので、\A だとやや偏執的
とも感じる。用心深いに越した事はないけれど、/\AA よりは /^A の方が見た目がスッキリ
して読みやすい。
http://perldoc.jp/docs/perl/5.10.0/perlreref.pod
http://perldoc.jp/docs/perl/5.10.0/perlretut.pod
0346デフォルトの名無しさん
2009/03/18(水) 11:35:381Aが入ってきたら終わるように書けばいいだけ。
0347デフォルトの名無しさん
2009/03/18(水) 16:01:22雰囲気的にはどんな感じなんでしょうか?
0348デフォルトの名無しさん
2009/03/18(水) 16:24:04Web業界に限って言えば様子見ムード。
0349デフォルトの名無しさん
2009/03/18(水) 16:28:27他言語との連携が楽になるだけ?
0350デフォルトの名無しさん
2009/03/18(水) 16:40:10CP/Mからの呪縛。
DOS(Windows)とUNIXそれぞれの、改行コード、終端コード、
テキストモード、バイナリモードについて、ググるなりして理解するのが先。
0351デフォルトの名無しさん
2009/03/18(水) 18:44:37�d
0352デフォルトの名無しさん
2009/03/18(水) 20:17:40だから 0x1a が EOF と思ってる時点で間違ってる
まずここを理解しろよ
CTRL-Z 押下は EOF を送るための特殊な操作であって、
それが歴史的な理由で CTRL-Z (0x1a)になってるだけであって
0x1a を送れば EOF になるわけじゃない。
0353デフォルトの名無しさん
2009/03/19(木) 01:24:01if (ナントカ eq "\x1a") { exit }
こういう発想は思いつかんの?
0355デフォルトの名無しさん
2009/03/20(金) 02:20:00@b = ('2','3')
という配列があった時に、@aから@bを削除して
@c = ('1','4','5','6')
を作りたいのです。ループ回すしか無いのでしょうか?
大崎氏(http://www.din.or.jp/~ohzaki/perl.htm#ArrayUnique)の、
# 配列 @array から重複した要素を取り除く
{
my %count;
@array = grep(!$count{$_}++, @array);
}
みたいな華麗な手法があるなら知りたいです。
0356デフォルトの名無しさん
2009/03/20(金) 03:24:57@array = grep(!defined($count{$_}), @a);
0357デフォルトの名無しさん
2009/03/20(金) 05:09:05すごく…力わざです…
0358デフォルトの名無しさん
2009/03/20(金) 06:47:02みたいなじゃなくてそれ使えよ
0359デフォルトの名無しさん
2009/03/20(金) 16:49:14use Array::Utils;
@a = ('1','2','3','4','5','6');
@b = ('2','3');
@c = Array::Utils::array_diff(@a, @b); # (1,4,5,6)
0360デフォルトの名無しさん
2009/03/20(金) 16:52:41最近ではそういうのを華麗というのか?
0361デフォルトの名無しさん
2009/03/20(金) 17:25:050362デフォルトの名無しさん
2009/03/21(土) 21:33:12sample.html
--------------------
<html>
2009-03-20
</html>
--------------------
yyyy-mm-dd.pl
--------------------
#!/usr/bin/perl
use Time::Local;
($s, $mi, $h, $d, $mo, $y, $w) = localtime(time);
$lastupdate = sprintf("%04d-%02d-%02d", $y + 1900, $mo +1, $d);
$yesterday = sprintf("%04d-%02d-%02d", $y + 1900, $mo +1, $d-1);
s/$yesterday/$lastupdate/g sample.html;
--------------------
0363362
2009/03/21(土) 21:34:06sample.html内の2009-03-20を2009-03-21に置換したいのですが、
これじゃだめなんですよね? どうしたらいいでしょうか。
ちなみに、ワンライナーっていうんですよね、それで
$ perl -i -p -e 's/2009-03-20/2009-03-21/g;' sample.html
みたいにすると置換できましたが、s/foo/bar/のfoo, barの部分に
変数を使いたいんです。
目的は、社内LANで公開しているweb(html)内の最終更新日時の表示を、
ちょっとした理由から、毎朝午前5時とかに、その日の日付に変えること、です。
よろしくお願いします。
0364デフォルトの名無しさん
2009/03/21(土) 21:45:51javascriptじゃだめなの?
0366362
2009/03/21(土) 22:00:24javascriptでもいけるんでしょうか。
それから、おっしゃるとおり04月00日になりそうですね。
perlで行くとしたら、そこは勉強して、何とか回避策を考えようと思います。
WSH, perl, あと何だろう、いくつか候補を考えたのですが、perlは
まったくといっていい初心者です。sedも。正規表現は理解はしている
つもりですが使ったことがあまりないです。
どんな手段でもよいのですが、何となくperlがよさそうだと思って、
この板に来てしまいました。。。
あらためて、どんな手段(言語、手段、ツール)がいいかを含めて
教えてください。<(_ _)>
0367デフォルトの名無しさん
2009/03/21(土) 22:11:341) SSIで最終更新日時を書くのが楽
2) Perlでやるなら、File::Slurpで読んでDateTimeで計算するのが楽
かね。
そもそも、
A) sample.htmlにベタ書きしてある最終更新日時の翌日を書けばいいのか、
B) sample.htmlの最終更新日時をただ表示すればよいのか(上記1.でよい)、
そのあたりの要件がはっきりしません。
更新日時についても、営業日でなくて暦日で良いのか、とか。
ちょっとまってね、これから書くから。
0368デフォルトの名無しさん
2009/03/21(土) 22:15:530369デフォルトの名無しさん
2009/03/21(土) 22:19:42# ただし13月32日とかも引っ掛かって甘いので注意
# しかも、最終更新日以外でも、くだんの正規表現に引っ掛かった値が変換されるので注意
use strict;
use warnings;
use File::Slurp;
use DateTime;
my $file_name = q{sample.html}; # $ARGV[0]とかの引数で渡すとか好きにして
my $file = read_file($file_name, array_ref => 1);
LINE:
foreach my $line (@$file) {
$line =~ s{
(\d{4}) - (\d{2}) - (\d{2})
}{
DateTime->new(year => $1, month => $2, day => $3)
->add(days => 1)
->ymd();
}xmse;
}
write_file($file_name, $file);
0370362
2009/03/21(土) 22:19:54そもそも、から行きますと、
A) sample.htmlにベタ書きしてある最終更新日時の翌日を書けばいい
です。
営業日ではなく暦日でOKです。
土日祝日もインフラが停止しなければ365日毎朝更新したいです。
というのは、会社のデータベースからあるまとまった形のデータを
Excel形式で落としてきて、それにパスワードをかけて、所定のフォルダに
アップロードし、それを地方拠点にイントラウェブで提供します。
最終更新日を更新したいというのは、そのアップロードの案内ページなんです。
データを落としてきて、パスワードをかけて、所定のフォルダにアップロード
するところまでは、マクロとMS-DOSのバッチファイルとタスクスケジューラと、
恥ずかしいうにょうにょなやり方でどうにか実現しました。
が、そうしたところ、案内のhtmlファイルも自動で日付を変えられるだろうと、
偉い人から言われまして...
0371369
2009/03/21(土) 22:22:40ただ、>>370の書き方を見ると、
土日でもアップロードされたデータが更新されているなら、
touch sample.html
してアップロード案内ページだけ最終更新日時を変えれば、
A)はB)と同じになるよね。
そうすればSSIでもやれるんじゃないかな?
0372362
2009/03/21(土) 22:22:46さっそく明日試してみます。
SSIについては鯖管さんに相談してみます。
そういうとこ、小回りのきかない、相談窓口も親身になってくれない
会社です。。。
0373369
2009/03/21(土) 22:26:43鯖管は別なのか……。
まあ、SSIを検討してみてよ。日曜なのに大変だね。
もしPerlでどうしてもやりたいなら、>>369を使う場合、
DateTimeとかFile::Slurpは標準では入っていないから、
CPANから導入出来るかも聞いておいて。
0374デフォルトの名無しさん
2009/03/21(土) 22:29:14my $file = read_file($file_name, scalar_ref => 1);
して
$file =~ s{略}{略}xmseg;
すりゃよかったか。
しつこくてごめん。
0375デフォルトの名無しさん
2009/03/21(土) 22:33:23チラ裏。
>>322が気になった今日この頃。比較表とかないかな?
0376362
2009/03/21(土) 22:40:12日付を表記するのに、yyyy-mm-ddは、そのhtmlファイルでその更新日の
部分だけにしてあります。よくわからないなりに、ここだけは見つかるように、
ここだけの形にしておかなければいけないだろうと思いました。
CPANからの導入についても明日確認してみます。
正規表現の本もperlの本も、いつか勉強しなければと積ん読になっています。
(恥ずかしながら)
ところで私、普段はぜんぜん違う板の住人です。切羽詰まってここに来ました。
こんなに速くレスをいただけるとは思っていませんでした。
本当にありがとうございます。
perl、勉強しますね。今はお金とか在庫とかの勘定ばかりやっていますが、
小学生の頃はベーマガとかで勉強したクチです。
おやすみなさい。
0377デフォルトの名無しさん
2009/03/21(土) 22:41:0413月32日に引っかけないためにはRegexp::Commonを使おう
0378デフォルトの名無しさん
2009/03/22(日) 00:28:52これはちょっとマズいんじゃないの?
コメントでは YYYY-MM-DD と書いてるけど、実際の処理が
\d{4}-\d{2}-\d{2] では、全然年月日じゃない文字列にもマッチしかねない。
もちろん年月日かどうか完璧な判定はできないけど、
>>362 にあるようにマッチさせる文字列が昨日の日時でいいなら
そういう風に限定すべき
0379デフォルトの名無しさん
2009/03/22(日) 01:19:26perl -e 'for ($n=1;$n<16;$n++) {my$res;!(($n%3||($res="Fizz"))&&($n%5||($res=$res."Buzz")))||($res&&print "$res\n")||(print "$n\n");}'
0380戦犯369
2009/03/22(日) 02:48:29thxです。
ついでに、sample.htmlのエンコードを考慮してみた。
# UTF-8(BOMなし)で保存してね
use strict;
use warnings;
use utf8;
use DateTime;
use Encode::Guess;
use File::Slurp;
# ファイルの中身を変数に突っ込む
my $file_name = q{sample.html}; # $ARGV[0]とかの引数で渡すとか好きにして
my $file = read_file($file_name, scalar_ref => 1);
# ファイルのエンコードを類推して、UTF-8に変換する
# 決め打ちならこんなことをせず、use Encodeしてdecode, encodeする
my $encoding = guess_encoding($$file, qw(cp932 euc-jp utf8));
die "Can't guess"
unless ref $encoding;
if ($encoding->name() ne 'ascii' || $encoding->name() ne 'utf8') {
$$file = $encoding->decode($$file);
}
# 昨日のYYYY-MM-DDを得る
my $yesterday = DateTime->now(time_zone => 'local')
->add(days => -1)
->ymd();
# つづく
0381戦犯369
2009/03/22(日) 02:49:50# >>362式なら
# my (undef, undef, undef, $day, $month, $year) = localtime();
# my $yesterday = sprintf("%04d-%02d-%02d", $year + 1900, $month + 1, $day - 1);
# ファイルの中身で昨日のYYYY-MM-DDに合致すれば変換する
$$file =~ s{
($yesterday)
}{
# ファイルに書いてある最終更新年月日(昨日)を、
my ($year, $month, $day) = split q{-}, $1;
# 翌日(つまり今日)に変換する
DateTime->new(year => $year, month => $month, day => $day)
->add(days => 1)
->ymd();
# >>362式なら
# sprintf("%04d-%02d-%02d", $year, $month, $day + 1);
}xmseg;
# ファイルのエンコードを元に戻す
if ($encoding->name() ne 'ascii' || $encoding->name() ne 'utf8') {
$$file = $encoding->encode($$file);
}
write_file($file_name, $file);
__END__
まあ、
SSI > テンプレート使用 > ベタ置換
の順が楽なんだろうけど。
0382デフォルトの名無しさん
2009/03/22(日) 02:57:58perl -e 'for(1..15){my$r;$_%3or$r="Fizz";$_%5or$r.="Buzz";$r or$r=$_;print"$r\n"}'
添削してくだちぃ
0383デフォルトの名無しさん
2009/03/22(日) 03:12:33いきなりDateTimeを使わずにsprintfでやった方がいいし、
いきなりFile::Slurpを使わずにopen関数を使った方がいいと思うけど、
面倒くさすぎて放り投げられるとPerlスキーとしては寂しいので、
CPANに依存してみた。今は反省している。
FizzBuzzについては、
1. 要件を実現出来ているんなら、
2. ワンライナーなら、
3. FizzBuzzでゴルフしたり難読化選手権を開くんじゃなければ、
多少腕白でもいいと思うけどね、俺は。
敢えてPBP的に見ても、
a. C的なforでなくforeachを使おうとか、
b. $_でなくてちゃんとforeach my $num (1 .. 15)にしようとか、
c. ""で括らなくていいときは''で括ろうとか、
そんなつまらない指摘しか出来ないけど。
あとはあれか、>>379なら、C的なforをどうしても使うときは、
$n <= 15の方が直感的とかか。
0384デフォルトの名無しさん
2009/03/22(日) 03:20:37>>381の二つめの>>362式は、3月32日になるw
ゆえに素直にDateTime使おう。
0385379
2009/03/22(日) 03:36:54ありがとうございます!>>382さんのコードの方がPerlっぽくていいですね。
ぼくのはJavaとかでも使えるテクしか使ってないや。
最近Perlはワンライナーしか書かなくなってさっぱり鈍ってしまった。
time - 86400
でよさそうな。。。
0387デフォルトの名無しさん
2009/03/22(日) 10:34:110388デフォルトの名無しさん
2009/03/22(日) 11:15:10UNIX時はどれも閏秒は算定してないと思うが。
システムによって現在のUNIX時が食い違ったら困るだろ。
0389デフォルトの名無しさん
2009/03/22(日) 13:00:390390デフォルトの名無しさん
2009/03/22(日) 13:15:46>>389
0391362
2009/03/23(月) 05:38:24ご報告が遅くなりました。
>>381さんに教えていただいたスクリプトを昨日、会社で使って
(ファイル名など一部変えました)、まだ1日(1回)だけですがテストとしては
うまく動いたようです。
今朝出社してうまく書き換わっているかどうか。これから出勤です。
うまくいったら引き続き使います。
ではみなさま、また縁がありましたらどうぞよろしくお願いします。
0392デフォルトの名無しさん
2009/03/23(月) 07:49:00仕様上はどちらでもいいことになっているが、先発製品との互換上、
どのシステムもうるう秒は算定していない。
うるう秒はいつ発生するか算定できないからどっかから情報取得する必要があるし、
tarファイルを移転する時とか、NTP使う時とか困るだろ。
よほど金融系のシステムとかでなければ、NTPクライアントを随時走らせておけば大きな支障はない。
0393デフォルトの名無しさん
2009/03/23(月) 09:22:29いるんだよね。
実用上はうるう秒のたびに時計を進めたり戻したりして1日の秒数は
一定としてしまうのが楽な場合がほとんどだから設定した例は自分の
周りでは見たことない。
天文とかは過去のある時刻との間の時間みたいのをきっちり出せない
と困りそうだけど。
0394デフォルトの名無しさん
2009/03/23(月) 09:23:100395デフォルトの名無しさん
2009/03/23(月) 13:06:04一般的なUNIXtimeの扱いの話であって、
そういったシステムが存在しないとは誰も言ってない。
極端な話、協定世界時を管理してるシステムなんかは当然勘案しなきゃ困るでしょ。
0396526
2009/03/24(火) 19:51:11debian etch の上で、perl-tk をいれて触っています。
どうにも日本語が表示されませんので、どなたか詳しい人、アドバイスをお願いします。
perlは、 v5.8.8
perl-tkは、804.027-7
です。
よろしくお願いします。
0397デフォルトの名無しさん
2009/03/25(水) 04:25:03とりあえず>>4
あとやったこと書け
0398デフォルトの名無しさん
2009/03/25(水) 14:49:23昨日から体の具合が悪いんですが、何かの病気でしょうか?
どなたか詳しい人、アドバイスをお願いします。
どんな薬を飲めばいいですか?医者に診せたほうがいいですすかね・・・
何科の医者に行けばいいですか?
よろしくお願いします。
0399デフォルトの名無しさん
2009/03/25(水) 14:53:250400デフォルトの名無しさん
2009/03/25(水) 17:06:54赤、A、あ、 #$test{0}
黄、A、い、 #1
青、A、あ、 #2
赤、B、あ、 #3
赤、C、い、 #4
青、A、あ、 #5
例えばこういう配列があったとして
各項目ごとに一番多い文字列(赤 A あ)をそれぞれ取り出したいんですがどのようにすればいいんでしょうか?
0401デフォルトの名無しさん
2009/03/25(水) 17:28:240402デフォルトの名無しさん
2009/03/25(水) 17:36:06my @dat = ( 'red,A,a', 'yellow,A,b', 'blue,A,a', 'blue,B,a' ) ;
my @cache ;
for ( @dat ){ my $cnt = 0 ; $cache[$cnt++]->{$_} ++ for split /,/ ; }
printf "%s\n", sort { $_->{$b} <=> $_->{$a} } keys %{$_} for @cache ;
日本語? => 自分で考えて
同じ個数の物があったら? => 知らん。
0403デフォルトの名無しさん
2009/03/25(水) 23:32:24「exec △△.pl $param1」とexecを使用して呼び出しても、
呼び出し先の△△.plが実行されないです。
環境が原因と思うのですが、
初心者で何が原因かわからないです。
0404デフォルトの名無しさん
2009/03/26(木) 12:16:36二次元配列のようでもあるし、コメント見るとハッシュにしてるし…
せめてPerlの書式で書いてくれ
0405400
2009/03/26(木) 18:21:17レスありがとうございます。
ただちょっと仕様を変更したので、普通の配列の中から一番多い要素を取り出すものに変えようと思ったのですが、
初心者なため>>402のコードでわからない部分があり、改良することができません。
どなたか配列の中で一番多い要素を取り出すサブルーチンを書いていただけないでしょうか。
0406デフォルトの名無しさん
2009/03/26(木) 18:50:35いくら出すかも書いておくと話が早いよ
0407デフォルトの名無しさん
2009/03/26(木) 18:52:32『10日でおぼえる Perl /CGI入門教室 第2版 』2005/9/5発売。
を購入しようと思っています。
この書籍が出た時点のバージョンのPerlをWindowz Vistaで
動かすことは可能でしょうか?バクがでたりエラーなどは大丈夫でしょうか?
これからPerlを勉強するので詳しいことはわかりません。
なお、PHP関連の書籍に付録で付いていたXAMPP1.6.5はインストール済みで
少なくともVistaで動作確認済みとPHPの書籍にありました。
どなたか回答よろしくお願いいたします。
0408デフォルトの名無しさん
2009/03/26(木) 19:32:340409405
2009/03/26(木) 20:37:12どう書けばいいのかわからないんです、アドバイスください
@array = ('マグロ','鯛','イワシ','鯛','マグロ','鯛');
&extract(@array);
#一番多い要素を書き出す
sub extract {
foreach (@_) {
$hash{$_} ++;
}
while (($key, $value) = each(%hash)) {
push(@test, $value);
}
@sort = sort{$b <=> $a} @test;
$shift = shift(@sort);
$aa = $hash{$shift};
print "$aa";
}
0410デフォルトの名無しさん
2009/03/26(木) 20:44:100411デフォルトの名無しさん
2009/03/26(木) 22:47:29初心者をあまりいじめるのも可哀想なのでとりあえず書くけど、正直なところもっとちゃんと自分で調べてほしい。
>>402 のヒントがあれば本を読むなりウェブでリファレンスを引くなりして調べようがあるとおもう。
人のコードを盲目的にコピペするのではなくて、ちゃんと一行一行やってることを理解するようにしないと上達しないよ。
シンタックスシュガーはあえて封じた。
use strict;
use List::Util qw(max first);
my @data=('foo','bar','poo','foo');
my %cache;
foreach my $entity(@data) {
$cache{$entity}=$cache{$entity}+1;
}
my $maxval=max(values(%cache));
my $res=first(sub{$cache{$_}==$maxval},keys(%cache));
print $res."\n";
0412デフォルトの名無しさん
2009/03/28(土) 17:23:43#一番多い要素を書き出す
sub extract {
foreach (@_) {
$hash{$_} ++;
if($max < $hash{$_}){ $max = $hash{$_}; } #追加
}
while (($key, $value) = each(%hash)) {
if($value == $max){ print $key,"\n"; } #追加
}
}
0413デフォルトの名無しさん
2009/03/28(土) 20:50:08my %hash;
my $res = $_[0] ;
for ( @_ ){ next if ++ $hash{$_} < $hash{$res} ; $res = $_ ; }
return $res ;
}
0414デフォルトの名無しさん
2009/03/30(月) 04:58:54(1がずっと続くよ) みたいな書き方が知りたいです
0415デフォルトの名無しさん
2009/03/30(月) 07:28:290416デフォルトの名無しさん
2009/03/30(月) 09:31:19""とundefどうやって区別したらいいんでしょうか
0417デフォルトの名無しさん
2009/03/30(月) 10:15:31どもです
0418デフォルトの名無しさん
2009/03/31(火) 13:31:20各項目はいくつかの分類のどれかに属していて、
分類ごとにまとめて処理をしたいので、
項目のリストを分類別に作りたい
for (keys %class) {
for (@items{$_}) {
みたいに配列の連想配列が使えるといいのだけれど
何かスマートな解決法はありますか
0419デフォルトの名無しさん
2009/03/31(火) 13:37:48色々とエンコードも試したのですが解決しませんでした
文字コード判別もなぜか失敗しました
↓がDumpした結果ですが、文字コードは何なのか教えてくれませんか
SV = PV(0x1cffd24) at 0x1bbe7e4
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x1832f24 "G\"\22w\221U\207L\241\300\361l\16\326ao\352d\351\30\265m\303Ox
\203\24\213\2262\273\271\274\5\273S\307\323\367b\372\277\340\17\254#\257\206D\24
3\243\243\265\342{4_\254j@\213\266gV\3417\236\237\265\331U\370\266\300\2477\227\
357\324D!\362&\32\204\233h\325\36l\301S\370\210n\0366\242\373\205lX\203\317\225\
375\fm\324\322\213\347\324\223\270\360\203'e\253UB\221\"\360l\340\305\211\357Q|u
\377\1\24yz\316\302\3\0\0"\0
CUR = 143
LEN = 676
0420デフォルトの名無しさん
2009/03/31(火) 15:16:24defined
>>418
ハッシュのキーに分類の名前
ハッシュの要素に項目の配列リファレンスとか入れたらどうだろう
$item{分類} = [qw/項目 項目 項目/];
みたいに
0421デフォルトの名無しさん
2009/03/31(火) 15:44:36という正規表現を使って複数回文字を削除しようとしています
while($str =~ /<hoge>/){ $str =~ s/<hoge>//; }
とすると無駄な処理が入るので、ループの判別のところだけで処理したいんですが、
そういう書き方は可能でしょうか
while($str =~ s/<hoge>//);
と書くとエラーを吐かれました
do{''} while($str =~ s/<hoge>//);
や
while($str =~ s/<hoge>//){}
だとうまくいきますが、なんか気持ち悪いです
0422デフォルトの名無しさん
2009/03/31(火) 15:51:120423デフォルトの名無しさん
2009/03/31(火) 15:51:371 while $str =~ s/<hoge>//; とか
$str =~ s/<hoge>//g; とか
0424デフォルトの名無しさん
2009/03/31(火) 16:16:08$class と $itemのセットを記憶するのに、
push(@{$items{$class}}, $item);
でいけました
@$items{$class} ではないという部分で引っかかりました
念のため[]で初期化したけど、外しても問題なく動くあたりが流石
0425デフォルトの名無しさん
2009/03/31(火) 16:39:15上では無駄な1が気持ち悪いです
下では $str = '<h<hoge>oge>' のときに削除できません…
0426デフォルトの名無しさん
2009/03/31(火) 16:48:20リャマ本に似たようなコード載ってるから、じゃ気持ち悪くならない理由にならない?
上の方は定数式(1)は最適化で取り除かれるんだとさ
0427デフォルトの名無しさん
2009/03/31(火) 16:57:42見た目が気持ち悪いのと処理的に気持ち悪いのは違うんですよ
「全部取り除く」って処理に全く関係ない1なんかがあるのは生理的に気持ち悪いです
{}で終わるのも一文なのに;がないから処理が終わってない感じがいやらしいです
リャマ本に上が載ってるなら、他にやり方はないんですかね…
もしかしたら正規表現で再帰的に検索してくれるオプションがあるかもと思ってたんですが…
0428デフォルトの名無しさん
2009/03/31(火) 17:21:08再帰的にやるなら
my $hoge;
$hoge = qr/<(??{$hoge})?h(??{$hoge})?o(??{$hoge})?g(??{$hoge})?e(??{$hoge})?>/;
$str =~ s/$hoge//g;
とか? もっと綺麗に書けそうだが。
5.10以降ならキャプチャバッファ(see perl5100delta)使って一行でしかも効率良く書けるはず。
0429デフォルトの名無しさん
2009/03/31(火) 19:56:14トン
キャプチャバッファについてググってみます
0430デフォルトの名無しさん
2009/03/31(火) 19:59:32my $str = '<h<hoge>oge>' ;
L:{ $str =~ s/<hoge>//g and redo L; }
1 while COND の方が断然気持ち良いけどさ。
0431デフォルトの名無しさん
2009/04/01(水) 13:55:08「 気 持 ち 悪 い 」
・・・か。それじゃC言語の
if (a == 1) {
hoge();
}
なんか、気持ち悪さ1000%だな。
なぜ「等しい」の判定に () が必要なのか。
なぜ hoge を呼び出すのに { } が必要なのか。
なぜ hoge のうしろにも () がくっついてるのか。
アメリカ人は苗字と名前を逆に言う。
住所も番地から逆に言う。
日付も逆に言う。
実に「気持ち悪い」。
だが、そういうもんだ。いちいち疑問にしてたらキリが無い。
順応しろよ、順応。
0432デフォルトの名無しさん
2009/04/01(水) 13:56:130433デフォルトの名無しさん
2009/04/01(水) 14:01:470434デフォルトの名無しさん
2009/04/01(水) 15:41:460435デフォルトの名無しさん
2009/04/01(水) 17:37:19-d でフォルダかどうか判断する時に、
5Cで終わっているフォルダ名を正しく扱えません
どうやったら回避できますか
0436デフォルトの名無しさん
2009/04/01(水) 18:30:230437デフォルトの名無しさん
2009/04/01(水) 18:58:01-d "$file\\"
という書き方でも結果は同様です
0438デフォルトの名無しさん
2009/04/01(水) 19:04:39必ず失敗するかというとそうでもないようで、
opendir(dir, '.');
for $file (readdir(dir)) {
if (-d "$file") {print "$file is directory.\n"}
else {print "$file is file.\n"}
}
これを
aaa
aaa2―
aaa―
こんな状況で実行すると
. is directory.
.. is directory.
aaa is directory.
aaa― is directory.
aaa2― is file.
test.pl is file.
_ is file.
こうなります
0439デフォルトの名無しさん
2009/04/01(水) 19:22:590440デフォルトの名無しさん
2009/04/01(水) 19:51:36aaa2― is file.
となってしまうことが問題
0441デフォルトの名無しさん
2009/04/01(水) 20:05:270442デフォルトの名無しさん
2009/04/01(水) 20:23:030443デフォルトの名無しさん
2009/04/01(水) 20:47:53至極真っ当
理に叶ってる
()の中はbooleanが必要とされてる
{}の中は場合によって処理されるか否かなんだからブロックで囲まれてて当然
だけどwhile(〜){}は関数的に使われてるのにセミコロンがない
これが問題
気持ち悪い原因
つまりwhile(〜);と書ければ万事解決なんだよ!!!!
0444デフォルトの名無しさん
2009/04/01(水) 21:49:190445デフォルトの名無しさん
2009/04/01(水) 21:57:59while(~){}は
while(~){
();
}
の省略記法だよ?B::Deparseで確認してみ?
勝手に省略して、省略してしまった部分について気持悪がられても…
「();が気持悪い!」って言われたら、
「そりゃごもっとも、俺もそう思う。」と言わざるを得ないけどさ。
0446デフォルトの名無しさん
2009/04/01(水) 22:04:09aaa: -f, -d1, -e1
aaa―: -f, -d1, -e1
aaa2―: -f, -d, -e
ディレクトリを再帰的に辿って全部のファイルに対して云々、みたいな
処理をさせると、フォルダの末尾が5Cかもしれない問題は必ず発生すると思うんだけど、
どうやって回避してるの?
0447デフォルトの名無しさん
2009/04/01(水) 22:04:57perlではこう解釈されるってのが正しいのか。
0448デフォルトの名無しさん
2009/04/01(水) 22:13:47あなたの環境が何か解らないからスルーしてたけど、
スクリプトのエンコーディングとディレクトリのは合ってるの?
winなら>>4とかそこらへんの問題じゃないの?
私の環境だと問題が出ないから力にはなれません。
0449デフォルトの名無しさん
2009/04/01(水) 22:43:19aaa: -f, -d1, -e1
aaa?\: -f, -d, -e
aaa?Q?\: -f, -d, -e
むしろ悪化しています
環境はwindowsXPです
0450デフォルトの名無しさん
2009/04/01(水) 23:34:090451デフォルトの名無しさん
2009/04/02(木) 00:20:370452デフォルトの名無しさん
2009/04/02(木) 00:35:54日本語の文字列としての取り扱いを完璧にする方法だけど、
ファイルシステム絡みは何も改善しないように見える
唯一、ファイル名をcp932でencodeするように注意はあるけど、
それは必要な処理であって、今回のケースを解決しない
0453デフォルトの名無しさん
2009/04/02(木) 00:54:42ActivePerlがMultiByte系のW32API使ってないんじゃ
0454デフォルトの名無しさん
2009/04/02(木) 00:59:15他の言語も含めた別の解決法を探すんだけど、
ぐぐってもそのへんを断言した文章は見つからない
逆に、このスレでは口を揃えて出来る出来ると言っている
サンプルは1バイトも出てこないけど
0455デフォルトの名無しさん
2009/04/02(木) 01:53:05PerlはあきらめてPythonでやるといいよ!!
0456デフォルトの名無しさん
2009/04/02(木) 04:29:43http://homepage2.nifty.com/ttoyoshima/Perl/lesson5.htm
には
> 「Active Perl V5.8.8」では日本語の「ファイル名」のファイルは開けない。
って書いてあるけど。
0457デフォルトの名無しさん
2009/04/02(木) 08:13:35というのはそのサイトの人がUTF-8のままで処理しようとしているからでは?
別のサイト
ttp://www.aritia.org/hizumi/perl/perlwin.html
では内部コードはUTF-8でもファイル操作時はShift_JISに
戻せみたいなことが書いてあるが
open(IN,encode('cp932',"<表.txt")) or die "open(表.txt):$!\n";
少なくともまったくできないってことはないだろ
0458デフォルトの名無しさん
2009/04/02(木) 08:45:490459デフォルトの名無しさん
2009/04/02(木) 10:27:31<?php
require_once "Text/Password.php";
$a=new Text_Password;
$b=$a->create(8, 'unpronounceable', 'alphanumeric');
echo $b ;
?>
このコードを書くだけで、ランダムなパスワードを
自動で生成してくれる。
同じことをperlでやったら65行は書かないといけない。
0460デフォルトの名無しさん
2009/04/02(木) 10:53:360461デフォルトの名無しさん
2009/04/02(木) 11:20:310462デフォルトの名無しさん
2009/04/02(木) 11:46:17use String::Random;
print $a=String::Random->new->randregex('[A-Za-z0-9]{8}');
このコードを書くだけで、ランダムなパスワードを
自動で生成してくれる。
同じことをphpでやったら6行は書かないといけない。
0463デフォルトの名無しさん
2009/04/02(木) 12:29:06> >>4を入れても改善しないようです
>>4には
> # ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、
> # この例のように cp932 でエンコードする必要があります。
と書いてあるが、なぜそんなことが必要なのか、よく考えてごらんよ。
すると、OS からもらった文字列は逆にcp932 からutf8 にデコード
しなきゃならない、という事にも気づけるだろう。
0464デフォルトの名無しさん
2009/04/02(木) 14:07:20問題を勘違いしてる
0x5Cがエスケープ文字だからトラブってるのではなくて
Windowsのディレクトリセパレータなのが問題
0465デフォルトの名無しさん
2009/04/02(木) 15:49:06> Windowsのディレクトリセパレータなのが問題
へ〜、そうなんだ。
0466デフォルトの名無しさん
2009/04/02(木) 15:54:30ワロタwww
0467デフォルトの名無しさん
2009/04/02(木) 17:30:30use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
use Encode;
opendir dir, encode('cp932','.');
@files = readdir dir;
for (@files) { $_ = decode('cp932', $_) }
for $file (@files) {
if (-d encode('cp932',$file)) {print "$file is directory.\n"}
else {print "$file is file.\n"}
}
ポイント
・OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、utf8 → cp932 に変換すること。
・逆に OS からもらう文字列(readdirなど)は cp932 → utf8 に変換すること。
0468デフォルトの名無しさん
2009/04/02(木) 18:38:39しかしこれは何故か3万回を超えた辺りから重複による何十回ものスキップ処理が入ってしまいます。
3万回数字を表示した時点でスキップが起こる確率は3/5=60%なので何十回ものスキップが頻発するというのはおかしいです。
(例えば10回のスキップ処理が連続で起こる確率は0.6^10でたった0.6%であるにも関わらず、こういう規模の事象が頻発する。3桁レベルのスキップも起こったりする。)
Perlのランダム関数がおかしいとは考えにくいのですが、何故こういう事が起こってしまうんでしょうか?教えてください。
$starttime = (times())[0];
$sessionstarttime = (times())[0];
$count=1;
$skipcount=0;
@triedNumbers=();
print " count skip num total this\n";
while(1){
$number = int(rand(50000))+1;
$new = 1;
foreach(@triedNumbers) {
if($number == $_) {
$skipcount++;
$new = 0;
last;
}
}
if($new==0){next;}
push(@triedNumbers,$number);
$endtime = (times())[0];
$totaltime = $endtime-$starttime;
$sessiontime=$endtime-$sessionstarttime;
printf "%6d %4d %6d %3ds %3ds\n", $count, $skipcount,$number,$totaltime,$sessiontime;
$sessionstarttime = (times())[0];
$skipcount=0;
$count++;
}
0469デフォルトの名無しさん
2009/04/02(木) 18:40:13This is perl, v5.8.8 built for MSWin32-x86-multi-thread
WindowsXP SP3
0470デフォルトの名無しさん
2009/04/02(木) 18:54:550471デフォルトの名無しさん
2009/04/02(木) 19:03:36This is perl, v5.8.9 built for i386-freebsd-64int
だと以下のようになるが。
32264 3 48037 119s 0s
32265 4 43101 119s 0s
32266 2 38633 119s 0s
32267 2 31075 119s 0s
32268 0 8513 119s 0s
32269 1 49402 119s 0s
32270 1 27972 119s 0s
32271 0 32400 119s 0s
32272 3 28045 119s 0s
32273 0 35972 119s 0s
32274 0 22672 119s 0s
32275 1 44140 119s 0s
32276 2 32443 119s 0s
32277 2 41433 119s 0s
32278 2 33357 119s 0s
32279 0 6772 119s 0s
32280 2 26341 119s 0s
0472468
2009/04/02(木) 19:03:40>>468のスキップ多発については原因が分かりません。
@numbers=();
for my $i (1..50000){
push(@numbers,$i);
}
for my $i (0..$#numbers){
$rand = int(rand(@numbers));
$tmp = $numbers[$i];
$numbers[$i] = $numbers[$rand];
$numbers[$rand]=$tmp;
}
for my $i (0..$#numbers){
print "$i:$numbers[$i]\n";
}
0473デフォルトの名無しさん
2009/04/02(木) 19:10:27所詮線型合同法だろ? 偏りあるしそんなもんよ。
List::Utils::shuffle(1..50000) じゃダメなのか。
0474デフォルトの名無しさん
2009/04/02(木) 19:11:18それは偏りが出るまずいアルゴリズム。
っ「Fisher-Yates shuffle」
0475デフォルトの名無しさん
2009/04/02(木) 19:21:05その環境での乱数の有効ビット数が15だから。
rand(1)が返す数の種類が32768通りしか存在しないので、3万時点のskip確率は90%以上。
乱数のビット数は use Config して $Config{randbits} で確認できる。
0476デフォルトの名無しさん
2009/04/02(木) 19:55:54aaa is directory.
aaa― is directory.
aaa―2 is directory.
aaa2― is file.
テスト結果で書くと
aaa: -f, -d1, -e1
aaa―: -f, -d1, -e1
aaa―2: -f, -d1, -e1
aaa2―: -f, -d, -e
こんなん
aaa―2みたいに途中に5cを含む場合はエスケープとか無しに普通に扱える
aaa―が何で通るのかが謎だけど、
aaa2―みたいなのは、aaa2―/hoge みたいにフォルダ内のファイルを
直接指定してもエラーになる
結論としては、そんなフォルダ名を使うな、ということになる
ファイル名もNGなんだけど、大抵は拡張子があるので、問題になることがない
0477468
2009/04/02(木) 20:08:30乱数の有効ビット数というのが原因のようですね。
手持ちのWindowsだと15でしたがLinuxでは48でした。
Fisher-Yates法では偏りが出る様なので>>473の方法でやってみようとおもいます。
レスありがとうございました。
0479デフォルトの名無しさん
2009/04/02(木) 20:13:48aaa― が通るのは aaa があるから。
aaa2―/hogeの失敗は、何らかの単純ミスの可能性が高い。
>>446
>どうやって回避してるの?
@dirs=split /[\r\n]+/,`dir /s/b/aD`; とか?
再帰? 再帰って何だ?
ファイルテスト演算子内から呼ばれるwin32_stat()内で終端の\を加工してるのが直接の原因。
なんでも FindFirstFile() and stat() are buggy with a trailing backslash, なので、
so change it to a forward slash (〜5.8.7.815)とか、
remove additional trailing slashes (5.8.8.816〜)という対策をしてるとの事。
-dを使う限りstatを避けることは出来ないが、There's More Than One Way To Do Itという
決まり文句を持ち出すまでもなく回避するには数多くの方法がある。
1.くどいけど @dirs=split /[\r\n]+/,`dir /b/aD`;
2.Win32::FileにGetAttributesがあるのでソレを使う
3.Win32API::FileやWin32::APIで好き勝手にやりたい放題?
4.面倒だから -e "${fn}/." で代用 (chdir/opendirにも使える/-fはopenで代用)
X. グロブ(<*>)を使うと、statに通らないファイル名は入ってこない
正しい対応.バグレポートを出し、余裕があればパッチも投稿する。
例えば、WideChar化してから終端加工して再度MultiByteに戻すとか。
楽な対応.そんなフォルダ名は使わない、見つけたら即リネーム
0480デフォルトの名無しさん
2009/04/02(木) 20:47:30> if (-d encode('cp932',$file)) {print "$file is directory.\n"}
がおかしいんじゃないの?
エンコードするから、sjis の2バイト目の0x5Cが復活する。
if (-d $file) {print "$file is directory.\n"}
でうまくいくと思うが。
0481デフォルトの名無しさん
2009/04/02(木) 21:18:47詳しく�d
-d 以外にテストの方法があったとしても、
次にそこに対してopendirすると失敗するので、結局目的は果たせない
例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム
5.10.0 とか 5.8.9.825 では直っているかしら
0483デフォルトの名無しさん
2009/04/03(金) 01:52:56VBAスレなんて、、、
0484デフォルトの名無しさん
2009/04/03(金) 12:19:330485デフォルトの名無しさん
2009/04/03(金) 12:45:06嘔吐感、嫌悪感が生じない人なんだろ?
なら、数が限られてくるわな。
0486デフォルトの名無しさん
2009/04/04(土) 15:09:01最初に479に間違いがあったので訂正。
誤 4.面倒だから -e "${fn}/." で代用 (chdir/opendirにも使える/-fはopenで代用)
正 4.面倒だから -e "${fn}/./" で代用 (chdir/opendirにも使える. -fはopenで代用)
末尾への/.追加だけだと5.8.8以降ではchdirには使えなかった。
chdirの確認を常用してる5.8.7.813でしかやってなかったという単純ミス
>次にそこに対してopendirすると失敗するので、結局目的は果たせない
>例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム
そんなに難しいことをやっているの? ツリー表示程度なら
sub tree {
# my(@dir,$ent) = map { chomp;$_ } `dir "$_[0]" /b/aD`; # ,`dir "$_[0]" /b/aDH`;
#↓は↑の手抜き変形でほぼ同内容
my(@dir,$ent) = eval { opendir my $h,"$_[0]/.";grep {-d "$_[0]/$_/." and !/^\.+$/} readdir $h };
while(defined($ent = shift @dir)) {
print "$_[1]+${ent}\n";
&tree("$_[0]/${ent}",@dir ? $_[1].'| ' : $_[1].' ');
}
}
&tree('.');
みたいにopendir無しでも書ける気がするし、opendirも成功しそうな気がするんだが。
opendirに関しては最悪DLL違いでの挙動差もありえなくは無いけどね。
0487デフォルトの名無しさん
2009/04/04(土) 15:59:30だからうまいことすれば大抵のソフトは回避できると思うけど、
そんな僅かなリスクの為に常時opendir禁止というのは辛すぎる
0488デフォルトの名無しさん
2009/04/04(土) 16:59:22>例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム
長いよ。長すぎるよ。そんなん書いたら保守性が悪いだろ。
いいかい?
system("tree");
ほら、たった一行でできただろ。
0489デフォルトの名無しさん
2009/04/04(土) 20:53:370490デフォルトの名無しさん
2009/04/04(土) 22:48:390491デフォルトの名無しさん
2009/04/05(日) 00:27:34嘔吐感、嫌悪感が生じない人なんだろ?
なら、数が限られてくるわな。
0492デフォルトの名無しさん
2009/04/05(日) 01:25:460493デフォルトの名無しさん
2009/04/05(日) 01:30:46ぷw
0494デフォルトの名無しさん
2009/04/05(日) 02:26:05田植えならしかるべきとこでやっていただきたい
あーゲシュタルト崩壊してきた
0495デフォルトの名無しさん
2009/04/05(日) 11:24:11"他の言語は使えないから、Perlが一番いい"
Perlの良いことを一言も言えない
0496デフォルトの名無しさん
2009/04/05(日) 11:51:14いわゆるYAGNI
みたいな?
0497デフォルトの名無しさん
2009/04/05(日) 18:57:42とりあえずperlが使えれば、好奇心以外に他の言語に乗り換える動機が発生しにくいので、
perlしか使わない人がおおい
0498デフォルトの名無しさん
2009/04/05(日) 22:22:180499デフォルトの名無しさん
2009/04/06(月) 00:35:28もしかすると>495に答えを授けた自称「Perl使ってるひと」も
>497の「perlしか使わない人」も「Perl使ってるひと」ではないかもしれない。
0500デフォルトの名無しさん
2009/04/06(月) 19:11:10$str =~ /hoge\((.*?)\)/;
$hoge=$1;
$str =~ /foo\((.*?)\)/;
$foo=$1;
}
これをもっと綺麗に書くことってできませんか?できたら教えてください。
hogeとfooの位置が前後する事があるのでこういう書き方にしました。
・やりたいこと
文中のhoge(あいうえお)とfoo(かきくけこ)から
$hoge="あいうえお"; $foo="かきくけこ";という変数を生成したい。
0501デフォルトの名無しさん
2009/04/06(月) 20:56:000502デフォルトの名無しさん
2009/04/06(月) 21:18:19例えばこんな感じ?
@pair = $str =~ /((?:hoge\([^)]*)|(?:huga\([^)]*))/g;
foreach my $pair(@pairs){
my($name, $value) = $split '\(', $pair;
$name = 'hoge' ? $hoge = $value
: $name = 'huga' ? $huga = $value
: 1
;
}
0503デフォルトの名無しさん
2009/04/06(月) 21:22:23○$name eq
確かに>>501の通り
my $foo, $hoge;
my %refhash = ( foo => \$foo, hoge => \$hoge );
...行ごとのループとか
if (/(hoge|foo)\((.*?)\).*(hoge|foo)\((.*?)\)/) {
$r1 = $refhash{$1};
$$r1 = $2;
$r2 = $refhash{$3};
$$r2 = $4;
... $foo, $hogeを使った処理
}
0505デフォルトの名無しさん
2009/04/06(月) 22:39:27my %hash = $str =~ /(hoge|foo)\((.*?)\)/g ;
my $hoge = $hash{hoge} ;
my $foo = $hash{foo} ;
>1行目要らないのでは
の例
my ($hoge) = $str =~ /hoge\((.*?)\)/ ;
my ($foo )= $str =~ /foo\((.*?)\)/ ;
0506デフォルトの名無しさん
2009/04/06(月) 22:54:29my $hoge ;
my $foo ;
1 while $str =~ /(hoge|foo)\((.*?)\)(?{ ($1 eq 'hoge' ? $hoge : $foo )= $2 })/g ;
0507デフォルトの名無しさん
2009/04/06(月) 23:40:54package Foo;
my $singleton;
sub new {
my $class = shift;
return $singleton if $singleton;
return $singleton = bless {}, ref $class || $class;
}
1;
0508500
2009/04/06(月) 23:52:45if(($str =~ /hoge\((.*?)\).*foo\((.*?)\)/)){
$hoge=$1;
$foo=$2;
}
# 位置関係が前後した場合に対応できない事が分かったので書き直して以下に
if(($str =~ /hoge\((.*?)\)/) && ($str =~ /foo\((.*?)\)/)){
$str =~ /hoge\((.*?)\)/;
$hoge=$1;
$str =~ /foo\((.*?)\)/;
$foo=$1;
}
これを前者と比べるとゴテゴテしてしまったなというところでした。
>1行目のif文
万が一hogeが含まれfooが含まれていないという場合
if文が無いとhogeの値がfooの値にも入ってしまい、それはマズいので入れてます。
ワンライナーな方のコードも読んでみました。$hoge = ($1 eq 'hoge' ? true : false)みたいな用法は知っていましたが、
この方法を右辺にも使えるんですね。自分には新しいです。(?{})というのは知りませんでした。
見た感じ正規表現の中で処理を実行する際に使うんでしょうが調べてみてもうまくヒットさせられませんでした。
もうちょっと知りたいのでキーワードとかあれば教えてください。
$hoge = ($str =~ 正規表現)での代入方法。これ知りませんでした。
あと右辺がリストで左辺もリストだと配列、右辺がリストで左辺がハッシュだと
キー、値、キー、値というハッシュになるというのも便利ですね。
この用法自体は知っていましたが、実際こういう使い方ができるんだなあと。
>>505さんのコードがわかりやすかったのでこれ使っていこうと思います。
>>501,502,503,504,505,506さんレスどうもありがとうございました。色々勉強になりました。
0509デフォルトの名無しさん
2009/04/07(火) 00:08:26A bit of magic: executing Perl code in a regular expression
の項だけど、、、
>この機能は実験的であると考えられており、予告なしに 変更されるかもしれないことを
>警告しておきます。
なので勉強する必要は無いと思うよ…
0510デフォルトの名無しさん
2009/04/07(火) 00:24:03とはいえそう使うことのあるものとも思えんが
0511デフォルトの名無しさん
2009/04/07(火) 00:33:22>ref $class
これ真になる事無いだろ。
インスタンスメソッドとしても機能させたいんだったら
もう一工夫必要じゃね?
0512デフォルトの名無しさん
2009/04/07(火) 00:38:31クラスからでもインスタンスからでも同じもの返して欲しいからそこだけ削除して
sub new {
my $class = shift;
return $singleton if $singleton;
return $singleton = bless {}, $class;
}
こうするだけでいいのか?
0513デフォルトの名無しさん
2009/04/07(火) 00:55:28スマン。
0514デフォルトの名無しさん
2009/04/07(火) 20:49:43ど変態の例
sub hoge { $hoge = shift }
sub foo { $foo = shift }
$str =~ s/((?:hoge|foo)\(.*?\))/$1/eeg;
0515デフォルトの名無しさん
2009/04/07(火) 21:03:43使用したモジュールってどのように付属すれば良いのでしょうか?
それともReadmeなどにCPANからこのモジュールをインストールしてくださいと
書いておくのでしょうか
0516デフォルトの名無しさん
2009/04/07(火) 22:15:260517デフォルトの名無しさん
2009/04/07(火) 22:18:40CPAN モジュールやその他のよく知られたライブラリ類は、特に事情がなければユーザに揃えてもらった方がよいでしょう。
ユーザ環境のモジュール配布元へのアクセスが制限されていたり、配布スクリプトがモジュールの特定のバージョンに依存するなどの事情がある場合は、その旨明記した上で各モジュールのライセンスが許せば同梱することもできます。
インストールスクリプト中で依存モジュールを CPAN からインストールさせることもできますが、大抵の単体配布では単に依存関係(必要なモジュールのリスト)を(できれば POD に)明記しておくだけで充分です。
0518デフォルトの名無しさん
2009/04/07(火) 23:12:09ありがとう御座いました
0519デフォルトの名無しさん
2009/04/08(水) 17:38:420520デフォルトの名無しさん
2009/04/08(水) 18:53:38$hoge =~ s,\Q\/:*?"<>|\E, ,sg;
0521デフォルトの名無しさん
2009/04/08(水) 19:45:04http://perldoc.jp/docs/perl/5.10.0/perlop.pod#item_tr_SEARCHLIST_REPLACEMENTLIST_cds_tr_y_transliterate__c__d__s
$hoge =~ tr{\\/:*?"<>|}{ };
0522デフォルトの名無しさん
2009/04/09(木) 01:08:47Class::Accessor::Fastを使用して
ハッシュのアクセサって作れるのでしょうか?
いろいろ試してみたのですがうまく行きませんでした…
↓イメージ的にはこんな感じ
package My::Class;
use base qw(Class::Accessor::Fast);
__PACKAGE__->mk_accessors( qw(hoge) );
package main;
my %hash = (
"a" => 'aaaaa',
"b" => 'bbbbb',
);
my $obj = My::Class->new();
#$obj->hoge(\$hash);
0523デフォルトの名無しさん
2009/04/09(木) 01:52:22http://d.hatena.ne.jp/goryugo/20090222/1235237948
↑の問題ってまだ残っているのでしょうか?
久しぶりにMechanizeを使ったプログラムを動かしたら
同じエラーが出るようになったのですがCommon.pmの中身が変わってしまっているようで
何処を修正すれば良いのかわからないのですが.....
0524デフォルトの名無しさん
2009/04/09(木) 02:05:450525デフォルトの名無しさん
2009/04/09(木) 02:40:290526デフォルトの名無しさん
2009/04/09(木) 02:47:34PATTERN か REPLACEMENT がある程度長ければ、/ の有無に関わらず {} 。
短ければ PATTERN にも REPLACEMENT にも現れない棒状の文字… | か ! か # 。
0527デフォルトの名無しさん
2009/04/09(木) 03:23:38$obj->hoge(\%hash);
0528PHPの神
2009/04/09(木) 06:53:49Pelってなんだよ
0529デフォルトの名無しさん
2009/04/09(木) 07:50:22確かに「Pel」は知られていないなw
冗談はともかく、日曜プログラマの自分からするとめちゃめちゃ知られてるような気がするんだ
けど。「Perl技術者の雇用を増やしたい」とは言ってるけど、それでも何がしたいのかよくわから
ない。まだ安定した地位を得ていないRubyとかならまだわかる。
まったくの妄想だけど、Ruby on Railsに仕事を奪われがちになってるとか? でもそれなら
そっちも覚えればいいだけだしなあ。
0530デフォルトの名無しさん
2009/04/09(木) 13:47:31うちだと、
$str =~ s{}a{}A{};
みたいにしてもエラーになる
0531デフォルトの名無しさん
2009/04/09(木) 14:12:06本気なのかネタなのか判断に苦しむなそれw
0532デフォルトの名無しさん
2009/04/09(木) 14:27:26普通に考えたらこんな感じ?
変な感じ…
家帰ったら試してみよう
0533デフォルトの名無しさん
2009/04/09(木) 17:05:11それはNG
$str =~ s}a}b};
こっちはok
0534デフォルトの名無しさん
2009/04/09(木) 17:07:18http://search.cpan.org/dist/perl-5.10.0/pod/perlop.pod#Quote_and_Quote-like_Operators____________________
http://perldoc.jp/docs/perl/5.10.0/perlop.pod
関係無いけど perldoc.jp の和訳は目次もname属性も削ってる上に
見出しが腐ってて不便極まりないな。
0535デフォルトの名無しさん
2009/04/09(木) 17:30:33$str =~ s{a}{A};
0536デフォルトの名無しさん
2009/04/09(木) 18:05:55@a1 = (1,9);
@a2 = (1,9);
@a3 = (1,9);
@a4 = (1,9);
foreach $a1 (@a1){
foreach $a2 (@a2){
foreach $a3 (@a3){
foreach $a4 (@a4){
if ($a1 + $a2 + $a3 + $a4 == 10){
print $a1.'+'.$a2.'+'.$a3.'+'.$a4."\n";
}
if ($a1 + $a2 + $a3 - $a4 == 10){
print $a1.'+'.$a2.'+'.$a3.'-'.$a4."\n";
(中略)
if ($a1 / $a2 / $a3 * $a4 == 10){
print $a1.'/'.$a2.'/'.$a3.'*'.$a4."\n";
}
if ($a1 / $a2 / $a3 / $a4 == 10){
print $a1.'/'.$a2.'/'.$a3.'/'.$a4."\n";
}}}}}
こんな感じで記述する手間がとても大変です
こういう場合に少ない記述で全組み合わせを試すいい方法はありますか?
0537デフォルトの名無しさん
2009/04/09(木) 18:41:26@a2 = (1,9);
@a3 = (1,9);
@a4 = (1,9);
@op = ('+', '-', '*', '/');
foreach $a1 (@a1){
foreach $op1 (@op){
foreach $a2 (@a2){
foreach $op2 (@op){
# 中略
$fomulae = $a1.$op1.$a2.$op2.$a3.$op3.$a4;
print "$fomulae \n" if (eval $fomulae == 10);
}}}}
こんな感じかな。
0538デフォルトの名無しさん
2009/04/09(木) 18:51:32演算子を変数に入れておkだと初めて知りました!
ありがとうございました
0539デフォルトの名無しさん
2009/04/09(木) 19:06:210540デフォルトの名無しさん
2009/04/09(木) 21:10:04環境がPERL5.8.* Jcode 2.6.5
PERL5.6.1 Jcode2.0から移したら
今までCGIで文字化けしなかったものが化けました。
$str = '�莞ゲマン';
$hoge = Jcode->new($str, euc)->h2z->euc;
print "$hoge";
今までは �潟zゲマン
と表示されていたのに、 ?ホゲマン
となります。
原因を調べていたら、5.8移行は機種依存文字は無視しないで?に変換してしまうとのことで。。。
これを �潟zゲマン となるように
解決したいのですが、どなたかご教授ください。
0541デフォルトの名無しさん
2009/04/09(木) 21:16:20他で聴くためこちらの回答は不要です
失礼しました
0542デフォルトの名無しさん
2009/04/09(木) 21:28:24引き続き回答お願いします。
0543デフォルトの名無しさん
2009/04/09(木) 21:50:52ということをよくやるけど、ローマ数字が元に戻せなくなるんだよな
0544デフォルトの名無しさん
2009/04/09(木) 22:06:000545デフォルトの名無しさん
2009/04/09(木) 22:37:020546デフォルトの名無しさん
2009/04/09(木) 22:48:06みたいなことをしても、見つからない
0547デフォルトの名無しさん
2009/04/09(木) 22:58:35ppm install Encode-EUCJPMS
0548デフォルトの名無しさん
2009/04/09(木) 23:00:35無いってよ
0549デフォルトの名無しさん
2009/04/09(木) 23:21:10I:\> ppm i Encode-EUCJPMS
====================
Install 'Encode-EUCJPMS' version 0.07 in ActivePerl 5.8.8.817.
====================
Files found in blib\arch: installing files in blib\lib into architecture depende
nt library tree
Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.dll
Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.exp
Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.lib
Installing C:\Perl\site\lib\Encode\EUCJPMS.pm
Successfully installed Encode-EUCJPMS version 0.07 in ActivePerl 5.8.8.817.
0550デフォルトの名無しさん
2009/04/09(木) 23:25:56ppm i failed: Can't find any package that provide Encode-EUCJPMS
なーにが違うんだろう
D:\>perl -v
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 18 registered patches, see perl -V for more detail)
0551デフォルトの名無しさん
2009/04/09(木) 23:30:44This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 25 registered patches, see perl -V for more detail)
Copyright 1987-2006, Larry Wall
Binary build 817 [257965] provided by ActiveState http://www.ActiveState.com
Built Mar 20 2006 17:54:25
ppm repは?もしかしてactivestateのリポジトリ無効にしてるとか無いよな?
0552デフォルトの名無しさん
2009/04/09(木) 23:40:11レトトトトツトトトトトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトソ
ウ id ウ pkgs ウ name ウ
テトトトトナトトトトトトナトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトエ
ウ 1 ウ 9817 ウ ActiveState Package Repository ウ
タトトトトチトトトトトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトル
(1 enabled repository)
大丈夫なのか、この画面は
0553デフォルトの名無しさん
2009/04/09(木) 23:43:13> ppm version
PPM 3.4
> ppm rep
Repositories:
[1] tcool
[2] ActiveState Package Repository
0554デフォルトの名無しさん
2009/04/09(木) 23:46:25ppm 4.01
Copyright (C) 2007 ActiveState Software Inc. All rights reserved.
ここがはっきり違う
Binary build 822 [280952] provided by ActiveState http://www.ActiveState.com
Built Jul 31 2007 19:34:48
ここ?
0555デフォルトの名無しさん
2009/04/09(木) 23:56:53てことはそっちの新しいリポジトリに入ってないんだな
今ちょっと調べてきたらtrouchelle(ttp://trouchelle.com/perl/ppmrepview.pl)のリポジトリに入ってるみたいなんで、
リポジトリ追加したらいいと思う
build822だからこれでリポジトリ追加して
ppm rep add trouchelle http://trouchelle.com/ppm/
ppm i Encode-EUCJPMS
で入ると思う
ま、ローマ数字扱えるかどうかは確信がもてないがw
0556デフォルトの名無しさん
2009/04/10(金) 00:03:55Downloading trouchelle packlist...done
Updating trouchelle database...done
Repo 2 added.
D:\>ppm i Encode-EUCJPMS
Downloading Encode-EUCJPMS-0.07...done
Unpacking Encode-EUCJPMS-0.07...done
Generating HTML for Encode-EUCJPMS-0.07...done
Updating files in site area...done
7 files installed
流石は名探偵
0557デフォルトの名無しさん
2009/04/10(金) 00:08:390558デフォルトの名無しさん
2009/04/10(金) 00:10:420559デフォルトの名無しさん
2009/04/10(金) 00:14:55#written in EUC
use Encode;
use Encode::EUCJPMS;
$str = "つ�I";
print e2s($str);
sub e2s() {
my $str = shift;
return encode('cp932', decode('euc-jp-ms', $str));
}
0560デフォルトの名無しさん
2009/04/10(金) 02:08:03どういうことですか?
0561デフォルトの名無しさん
2009/04/10(金) 11:17:05formulae 複数形
ってことでしょ。
0562デフォルトの名無しさん
2009/04/10(金) 17:37:50良いのでしょうか?
じつは非常大きい数値をもじれつとして扱いたいのですが数値が12行ほど有りますので
行ごとに" "で囲み . で連結という方法以外に何か効率的な方法が無いかと思い
よろしくおねがいします。
0563デフォルトの名無しさん
2009/04/10(金) 18:13:370564デフォルトの名無しさん
2009/04/10(金) 18:49:30123
456
789
EOF
$str =~ s/\n//g;
print $str;
0565デフォルトの名無しさん
2009/04/10(金) 21:19:23my @numbers = qw/
123456789012
123456789012
123456789012
123456789012
/;
my $joined_number = join "", @numbers;
print "$joined_number\n";
__END__
^D
123456789012123456789012123456789012123456789012
0567デフォルトの名無しさん
2009/04/11(土) 02:43:56わざわざ変数2個用意せんでも
my $num = join '', qw(
123456789012
123456789012
123456789012
123456789012
);
print $num . "\n";
でいいと思うんだけど
0568デフォルトの名無しさん
2009/04/11(土) 02:46:17元々は、定数としてコード中に書いてあるもんなんだし
0569デフォルトの名無しさん
2009/04/11(土) 03:03:180570デフォルトの名無しさん
2009/04/11(土) 03:07:250571デフォルトの名無しさん
2009/04/11(土) 05:22:45use constant LENGTHY_NUMERAL =>
1234567890 .
1234567890;
print LENGTHY_NUMERAL . " has " . length(LENGTHY_NUMERAL) . " digits\n";
0572デフォルトの名無しさん
2009/04/11(土) 05:54:49print join '', qw(
123456789012
123456789012
123456789012
123456789012
);
こういうことですか?
分かりません><
0573デフォルトの名無しさん
2009/04/11(土) 10:06:45その数*2の式にするには?
0574デフォルトの名無しさん
2009/04/11(土) 12:03:35* 2 したきゃ勝手に *2 すりゃいいだろ!
print join('', qw(
123456789012
123456789012
123456789012
123456789012
) ) * 2;
少しは頭使えよ
0575デフォルトの名無しさん
2009/04/11(土) 12:44:49$a = "aaa" "bbb"; # => 昔だと"aaabbb"になる
の構文はエラーになったんだな。
0576デフォルトの名無しさん
2009/04/11(土) 21:20:31今までjperlを使ってきたのですが
いい加減perlの新しいものに変えようかと思っています
乗り換えるにはソースをUTF-8に変える(日本語の正規表現使っています)
データファイルはsjisのままでいい
と思っているのですが、それでいいでしょうか?
0577576
2009/04/11(土) 21:28:270578デフォルトの名無しさん
2009/04/11(土) 22:19:40コマンドプロンプトに出力される文字コードはsjisじゃ無いと化ける。
0579デフォルトの名無しさん
2009/04/11(土) 22:23:52データはSJISで書きたいソースはUTF8で書いてという事だけど、普通に出来るよ。というか俺もそういうコード書いた事がある。
データ読み込み時にSJISからUTF8へ変換し、正規表現を使い色々な処理をし、
データ書き込み時にUTF8からSJISへ変換する。
0580デフォルトの名無しさん
2009/04/11(土) 22:29:06そもそも、うちのエディタがutfに対応しとらん
あんまりがちがちの体制にすると、perlの手軽さがどんどん無くなっていく
0581576
2009/04/11(土) 22:34:01それだと一番楽なんですが
0582デフォルトの名無しさん
2009/04/11(土) 22:44:060583デフォルトの名無しさん
2009/04/12(日) 01:50:12正規表現の中の'ー'とかの5bがどうしようもない
0584576
2009/04/12(日) 12:38:51ttp://www.aritia.org/hizumi/perl/perlwin.html
ここを見てスクリプトの先頭をこうゆう風に変えました
use utf8;
binmode(STDIN,":encoding(sjis)");
binmode(STDOUT,":encoding(sjis)");
binmode(STDERR,":encoding(sjis)");
$dbx_flag=1;
if($dbx_flag){
open(DBX,">:encoding(sjis)", "Make_Table.dbx");
}
こういうワーニングがいっぱい出ます
"\x{0082}" does not map to shiftjis at Make_Table.pl line 98, <> line 519.
対応すると思われるコードは次みたいな部分です
print DBX $_;
ディバッグの出力を見てみるとこういう分岐が全然正常に働いてないみたいです
if(/^[\s]*朝食[\s]*$/){
$eat_sw=$eat_asa;
next line;
}
どういう風に書き換えたらいいのでしょうか?
必要でしたらソースとデータをuploadします
0585デフォルトの名無しさん
2009/04/12(日) 13:28:19スクリプトの文字コード UTF-8 で書いてる?
0587576
2009/04/12(日) 14:21:43ttp://hardsoft.at.webry.info/200604/article_2.html
との折衷案を採って
use utf8;
use encoding "shiftjis";
use open ":encoding(shiftjis)";
use open ":std";
map{ binmode($_,":crlf"); } qw/STDIN STDOUT STDERR/;
$dbx_flag=1;
if($dbx_flag){
open(DBX,">Make_Table.dbx");
}
としたら正常に働きました
0588デフォルトの名無しさん
2009/04/12(日) 23:11:42そのサイトの結論が俺と同じでワロタ
0589576
2009/04/12(日) 23:30:13その意見に賛成します
新しいperlがあればjperlは使う必要が無いという意見をネットでよく見ましたが
jperlの方がよほど移植性の高いコードが書ける気がします
0590デフォルトの名無しさん
2009/04/12(日) 23:47:14あ、違う違う
スクリプトへのリンクのすぐ上ね
そのサイト、テンプレの内容もほとんど同じだし、問題点や対処法も自分がやってきたのとほぼ重なっているし
運用でカバーするのに限界を感じているのも一緒だし
10年以上Perlを使ってきたけど、そろそろいいかなあ、と
0591デフォルトの名無しさん
2009/04/13(月) 00:29:31このへんの違いを理解していない時点でダメ。
0592デフォルトの名無しさん
2009/04/13(月) 01:19:180593デフォルトの名無しさん
2009/04/13(月) 02:07:330594デフォルトの名無しさん
2009/04/13(月) 02:10:44☟ ☟ ☟ ☜ ☜ ☜ ☜ ☜ ☜ ☝
☟ ☟ ☟ ☟ ☜ ☜ ☜ ☜ ☝ ☝
☟ ☟ ☟ ☟ ☟ ☜ ☜ ☝ ☝ ☝
☟ ☟ ☟ ☟ ☞ ☝ ☝ ☝ ☝ ☝
☟ ☟ ☟ ☞ ☞ ☞ ☝ ☝ ☝ ☝
☟ ☟ ☞ ☞ ☞ ☞ ☞ ☝ ☝ ☝
☟ ☞ ☞ ☞ ☞ ☞ ☞ ☞ ☝ ☝
☞ ☞ ☞ ☞ ☞ ☞ ☞ ☞ ☞ ☝
とか
0595PHPの神
2009/04/13(月) 03:26:15phpだったら、こういうパスワード生成ページとか
かんたんに作れる。
0596デフォルトの名無しさん
2009/04/13(月) 03:28:120598デフォルトの名無しさん
2009/04/13(月) 08:52:58一気に移行しようとすると、大変だよ。
「手間」ということでは大したことはないが、ActivePerl の
知識がなければ、どこをどのように変えればいいのか解らないから。
オレは数年前に移行を済ませたが、その時はjperl と ActivePerl
を両方動くようにして、ActivePerlに少しづつ移行していった。
0599576
2009/04/13(月) 09:30:41ActivePerl 5.10 と ActivePerl 5.6 依存のjperl が共存できるのですか?試していませんでした
まあ、毎日使っていたスクリプトはawkの代用品を用意しての移行だったわけですが
perl でしか動かないようなスクリプトも有りますが、
perl 初心者でそういうものはごく少数なので
0600デフォルトの名無しさん
2009/04/13(月) 12:39:44http://www.activestate.com/activeperl/でダウンロードできるactiveperlと
http://www.perl.org/でダウンロードできるperlどちらをインストールしたらいいですか?
これら二つは同じものでしょうか?
0601デフォルトの名無しさん
2009/04/13(月) 13:42:30CGIをやろうとしているのならば、ActivePerlを選ぶとよい。
0602デフォルトの名無しさん
2009/04/14(火) 09:46:10からWindows 用のPerl をダウンロードしようとすると、
ActivePerlのページに飛ばされるわけだが。
0603BUElepmnX
2009/04/14(火) 11:22:260604デフォルトの名無しさん
2009/04/14(火) 16:21:53確かに ActivePerl のリンク *も* あるが、
他にも Strawberry Perl など10種類以上あるだろ。
0605デフォルトの名無しさん
2009/04/15(水) 12:25:16"hoge" =~ m/(?!hoge)h/ ? print "HIT!\n": print "スカ\n";
"hoge" =~ m/(?!hoge)/ ? print"HIT!\n": print "スカ\n";
実行してみると、確かに前者はスカなんですが後者は何故かHITしてしまいました。これ何故なんでしょう。
自分なりに考えてみたのですが、この先読み機能というものは先読み以外の部分で何かヒットした場合にのみ動くという仕様で
前者はhがヒットしたから先読みが始まった反面、後者は何もヒットしなかったので先読みが始まらず結果ヒットしてしまったという感じなんでしょうか?
しかし前者についてhがヒットしたのでその"前"に記述されてある(?!hoge)に判断が戻るというのはなんだか変な感じがします。
(後者の何もヒットしなかったから真というのも何か変な感じがします)
その辺りどうなっているのでしょう。上の推理は当っているんでしょうか。どなたか教えてください。
0606デフォルトの名無しさん
2009/04/15(水) 12:49:00"hoge" =~ m// ? print"HIT!\n": print "スカ\n";
基本に返ってみよう
0607デフォルトの名無しさん
2009/04/15(水) 12:51:05この方がわかりやすいかな
0608デフォルトの名無しさん
2009/04/15(水) 12:57:15後者:後続のhogeを伴わない空文字列
かな
$hoge = "hoge";
$hoge =~ s/(?!hoge)/@/g;
print $hoge; #=> h@o@g@e@
0609デフォルトの名無しさん
2009/04/15(水) 13:03:50"hoge" =~ m/(?!hoge)/ がマッチするのは "hoge" =~ m/o/ がマッチするのと全く同じ理由。
>>606-607
m//等の空パターンは特別扱いされる事を思い出して。
0610デフォルトの名無しさん
2009/04/15(水) 13:11:36書き込む前に矛盾に気づいてくれ
0611デフォルトの名無しさん
2009/04/15(水) 13:34:31hとoの間の空文字列にマッチしているだけのこと。
print $`, ':', $&, ':', $', "\n";
とかしてみりゃわかる。
0612605
2009/04/15(水) 23:01:47そこで>>605を実行すると1つ目の@に逹っした時点で先読みが行われhogeが検出されてしまい、
結果スカが表示されるのではないでしょうか?
0613デフォルトの名無しさん
2009/04/16(木) 00:46:55"hoge" =~ m/(?!hoge)h/ ? print "HIT!\n": print "スカ\n";
"hoge" =~ m/(?!hoge)/ ? print"HIT!\n": print "スカ\n";
$x = "hoge"; $x =~ s/(?!hoge)h/-/; print "'$x'\n";
$y = "hoge"; $y =~ s/(?!hoge)/-/; print "'$y'\n";
- に置換された部分にマッチしているんだょ。
気取って3項演算子でスマートに書いたりしないで
初心者っぽく書けばハマらずに済んだんだよ。
0614デフォルトの名無しさん
2009/04/16(木) 01:12:110615デフォルトの名無しさん
2009/04/16(木) 02:02:410616605
2009/04/16(木) 02:28:52ありがとうございました。
0617デフォルトの名無しさん
2009/04/16(木) 03:30:18んー、人によるとは思うけど……
例えば、
Func ( $foo ? 1 : 2 , $bar ? 1 : 2 ) ;
みたいに、引数として使う時とか。
あとは
my $hoge ;
if ( $foo ) { $hoge = "TRUE"; }
else { $hoge = "FALSE"; }
みたいな時にだいぶ短くなるんじゃないかな。
0618デフォルトの名無しさん
2009/04/16(木) 03:57:40if文より参考演算子+関数呼び出しのほうが
CPUが先読みし易くて早くなるって言ってた人がいたな
コンパイラの種類やら最適化でも変わってきそうだけど・・・
0619605
2009/04/16(木) 04:08:32投稿する際に3項演算子だと色々都合が良いかなと思い使いました。
0620デフォルトの名無しさん
2009/04/16(木) 06:35:25$TO = encode "To文字コード", decode "From文字コード", $FROM;
みたいなこと書かないといけないの?
0621デフォルトの名無しさん
2009/04/16(木) 07:29:23と書いた時の可読性の悪さだよな
単に値を返すだけならいいけど、むしろそういうのは稀で、
結構な長さの文を書いたり、入れ子にしたりする
0622デフォルトの名無しさん
2009/04/16(木) 12:08:48症状は変数の中身があり得ないことになっている 計算上 1000-100になるのが 0-100になってる。
何度読み返しても計算上はそうはならない。
一度サーバー上のデーターを全部消してアップしなおしたら直った。
サーバーがバグって正常に変数計算が無茶苦茶になるってことがあるのでしょうか?
0623デフォルトの名無しさん
2009/04/16(木) 12:15:1299.99999999999999%あなたのミス
その消したデータとやらのせいでしょ。
0624デフォルトの名無しさん
2009/04/16(木) 13:12:51すみません消したデータと再uPしたデータが微妙に違っていましたorz
0625デフォルトの名無しさん
2009/04/16(木) 14:25:37自分は間違ってない、サーバがおかしい、処理系がおかしい
から入る人が多いんだろうね
0626デフォルトの名無しさん
2009/04/16(木) 14:34:15ねーよw
0627デフォルトの名無しさん
2009/04/16(木) 14:40:22ちゃんとした技術者なら少ないよ
偏差値低い技術者・一般人に多いだけだよ
なにかと「周りのせいで」って言ってる奴 よくいんだろ
0628デフォルトの名無しさん
2009/04/16(木) 16:11:08逆じゃない?
一般人はそういう風に思いがちだけど(定番の「何もしてないのにPCが壊れた」とか)、
技術者は通常、そうではない。
だからこそ、たまに>>622みたいのが居ると、すごーく目立つ、ってことだと思う。
0629デフォルトの名無しさん
2009/04/16(木) 18:27:470630デフォルトの名無しさん
2009/04/17(金) 04:48:09あれって回収されたんだっけ?
0631デフォルトの名無しさん
2009/04/19(日) 01:23:10XMLを読み込んだ後に、getElementsByTagNameで取得したノードについて
toStringで内部のXMLを取得しようとすると、文字化けしてしまいます。
現在以下のテストコードを書いてみたのですが、文字化けの理由がさっぱり分かりません。
ソースコードは文字コードはUTF8で改行コードはLFで保存しています。
環境はosx上のperl5.8.8で、XML::LibXMLのバージョンは1.69です。
またperlとlibxmlのバージョンを揃えた環境を、linux(CentOS)上で作成して、
同じコードを走らせてみると、文字化けは発生しませんでした。
何処が間違っていますでしょうか。また他に何を確認すれば良いのでしょうか。
よろしくお願いします。
---
#!/usr/bin/perl
use strict;use warnings;use XML::LibXML;use Encode;
my $parser = XML::LibXML->new;
my $xmlStr =<<XML;
<?xml version="1.0" encoding="utf-8"?>
<root><item>あいうえお</item><item>abc</item></root>
XML
# LibXML::Documentは文字化けしない
my $xmlObj = $parser->parse_string($xmlStr);
print $xmlObj->toString, "\n"; # これは問題なし
# 問題の箇所
my ($item1, $item2) = $xmlObj->getElementsByTagName("item");
print( $item1->toString . "\n"); # これが文字化けする
print( $item2->toString . "\n"); # 英字はOK
---
0632デフォルトの名無しさん
2009/04/19(日) 03:47:450633デフォルトの名無しさん
2009/04/19(日) 17:47:18(環境5.8.8にて実行)
shared変数をハッシュリファレンスの配列としたく、下記のような
コードを組んだのですがうまくいきません。push直後、join直後に
Dumper見てもセットされてません。
配列の各要素に対してハッシュのリファレンスである旨を事前に
&share({});
みたいな形で伝えてあげなければならないのかな?と想像はして
いるのですが、どのようにすればよいかわかりません。
よろしくお願いします
-----------------
use threads;
use threads::shared;
use Data::Dumper;
my @array : shared;
my $test_sub = sub {
foreach my $i (0..3) {
push(@array, {'val1'=>$i, 'val2'=>$i});
}
};
my $th1 = threads->new(\&$test_sub);
my $th2 = threads->new(\&$test_sub);
$th1->join;
$th2->join;
0634デフォルトの名無しさん
2009/04/19(日) 19:24:23threads::sharedのドキュメントに、配列の要素も共有されたもの
じゃないとダメって書いてある
>>Shared variables can only store scalars, refs of shared variables, or
>>refs of shared data (discussed in next section):
:
>> # The following are errors:
>> # $var = \$bork; # ref of non-shared variable
>> # $hash{'bork'} = []; # non-shared array ref
>> # push(@array, { 'x' => 1 }); # non-shared hash ref
で、これに書いてあるように shared_cloneを使えばいいみたい。
push(@array, shared_clone({'val1'=>$i, 'val2'=>$i}));
0635631
2009/04/19(日) 19:54:45ありがとうございます。
ただuse utf8を追加しても、文字化けしてしまいます。
631のテストコードに以下のコードを追加してみたのですが、
どうもutf8フラグの問題では無いような気がします。
---
# UTF8フラグのテスト
my $text1 = $item1->toString;
print utf8::is_utf8($text1), "\n"; # これはTRUE
print $text1, "\n"; # 文字化け
utf8::decode($text1);
print utf8::is_utf8($text1), "\n"; # これはFALSE
print $text1, "\n"; # やっぱり文字化け。出力に変化なし
---
またXML::Simpleを試してみたところ、問題なく動作しました。
自信は無いですが、ちょっとソースコードを読んでみます。
0636デフォルトの名無しさん
2009/04/20(月) 00:18:270637633
2009/04/20(月) 22:55:29ありがとうございます!うまくいきました。
0638デフォルトの名無しさん
2009/04/21(火) 19:02:51文字列が含まれる行を抽出して
行番号とともに表示させたいのですがうまくいきません。
どこをいじればよいのでしょうか?
ソース###########################
#!/usr/bin/perl
$key="test[1]";
$i=0;
open(IN,"input.txt");
while(<IN>){
$i++;
if($_ =~ /$key/){
print "$i :$_";
}
}
close(IN);
$input=<STDIN>;
################################
input.txtの中身
test[0]
test[1]
test[2]
test[3]
0639デフォルトの名無しさん
2009/04/21(火) 19:19:180640デフォルトの名無しさん
2009/04/21(火) 20:16:43$key="test\[1\]";
これじゃだめでした・・・。
0641デフォルトの名無しさん
2009/04/21(火) 21:21:21どーでもいいけど $. も覚えたら?
0642デフォルトの名無しさん
2009/04/21(火) 21:21:44open(IN,"input.txt");
while(<IN>){
$i++;
if(/test\[1\]\n$/){
print "$i :$_";
}
}
close(IN);
0643デフォルトの名無しさん
2009/04/21(火) 21:58:27ありがとうございます!!
0644デフォルトの名無しさん
2009/04/21(火) 23:24:20$i=0;
open(IN,"input.txt");
while(<IN>){
$i++;
if($_ =~ /$key/){
print "$i :$_";
}
}
close(IN);
0645デフォルトの名無しさん
2009/04/22(水) 02:32:060646デフォルトの名無しさん
2009/04/22(水) 13:28:36下記のようにプログラムを書いて、
出力を100にすることはできないのでしょうか?
$b=10;
$a10=100;
print ('$a'.$b);
ご教授お願いします。
0647デフォルトの名無しさん
2009/04/22(水) 13:44:45自分でマニュアルを読むのをいやがる人のみならず、
自分で実行してみるのをいやがる人まで出現したぜ。
0648デフォルトの名無しさん
2009/04/22(水) 14:38:55質問のこたえ・・・できません。
646のプログラムがいったい何を意図しているのか、さっぱりわからん。
何をしたいのか、ぜんぜんワカラン。
もしかしたら、こういう事がしたいんじゃないかな、とエスパーしてみる。
$b=10;
$a[10]=100;
print $a[$b];
・・・だとしたら、マニュアルも入門書も解説サイトも、全く読んでなさそうだな。
0649デフォルトの名無しさん
2009/04/22(水) 14:45:16print(eval('$a'.$b));
とかw
0650デフォルトの名無しさん
2009/04/22(水) 14:46:54実行したところ、出力が$a10になりました。
私の求める出力は100なんです。。。
print ('$a'.$b); の'$a'.$bの部分で$a10となり、
print $a10となって、プリントされるのが100になって欲しいのです。
0651デフォルトの名無しさん
2009/04/22(水) 14:54:39求めている答えになりました!
649さんありがとうございます。すっきりしました。
ちなみに私の入門書にeval載って無かったです(涙
0652646
2009/04/22(水) 15:32:30ちょっと形を変えたのですが、
$a="$a";
$b=10;
eval($a.$b)=100;
print $a10;
と書いて実行してもエラーが出るのですが、
100を表示させたい場合どのようにすれば宜しいでしょうか?
ご教授お願いします。
0653デフォルトの名無しさん
2009/04/22(水) 15:42:03とか。
添え字じゃだめなんか
0654646
2009/04/22(水) 15:52:12駄目でしたorz
なにも表示しないです。
0655デフォルトの名無しさん
2009/04/22(水) 16:01:43$a="$a";
の$aの中身見てみ。
$a='$a' ;
でどうか
0656デフォルトの名無しさん
2009/04/22(水) 16:02:22すこしはデバッグしろ。
変数に何が入っているか一つ一つチェックするくらいやれ!
0657646
2009/04/22(水) 16:14:18解決できました。ご迷惑お掛けしました。
656さんのおっしゃる通りです。
自分でやれることはやらんないかんですね。。。
0658デフォルトの名無しさん
2009/04/22(水) 17:15:56あったまいいなぁ。よくわかったな・・・
0659デフォルトの名無しさん
2009/04/22(水) 17:17:40>自分でやれることはやらんないかんですね。。。
( ゚д゚)ポカーン
0660デフォルトの名無しさん
2009/04/22(水) 17:18:06$b=10;
$a10=100;
print ${'a'.$b};
0661デフォルトの名無しさん
2009/04/22(水) 18:43:040662デフォルトの名無しさん
2009/04/22(水) 18:48:50ほらよ
http://www.din.or.jp/~ohzaki/perl.htm#URI
0664デャtォルトの名無bオさん
2009/04/23(木) 20:13:47実際にコードを書いて試してみたけど違い見つかりません。
おそらく「きちんとUNIXを勉強しなさい」っていうラリー先生からのメッセージなんだとは思うのですが…。
0665デフォルトの名無しさん
2009/04/23(木) 20:36:44例えばrootで実行したプログラムの中で一般ユーザーhogeにset uidしてrootしか読めない
ファイルを-rで調べるとfalse、-Rならtrue。
UNIXのお勉強頑張って下さい。
0666デフォルトの名無しさん
2009/04/23(木) 20:42:26なるほど。なんとなくだけど分かった。ありがとう。
0667デフォルトの名無しさん
2009/04/25(土) 06:21:29発言、リロードが無い場合30秒でチャットルームをたたき出すって機能を作ろうと
して30秒計るタイマーをまず作ろうとしてそこでつまずきました。
alarm って命令語の使い方がさっぱり判りません。
0668デフォルトの名無しさん
2009/04/25(土) 06:23:09$SIG{ALRM} = \&time_out;
eval {
my $alarm_time = 5;
printf "%d秒以内に何か入力して下さい。\n", $alarm_time;
alarm $alarm_time;
my $input_string = <>;
alarm 0;
chomp $input_string;
printf "%sが入力されました。\n", $input_string;
};
sub time_out {
print "時間切れのため終了します。\n";
exit 1;
}
0669667
2009/04/25(土) 06:27:19#!/usr/bin/perl
print "Content-type: text/html\n\n";
$SIG{ALRM} = \&time_out;
eval {
my $alarm_time = 30;
printf "%d秒以内に何か入力して下さい。\n", $alarm_time;
alarm $alarm_time;
my $input_string = <>;
alarm 0;
chomp $input_string;
printf "%sが入力されました。\n", $input_string;
};
sub time_out {
print "時間切れのため終了します。\n";
exit 1;
}
0670デフォルトの名無しさん
2009/04/25(土) 08:00:43チャットサーバー作ろうとしてるんですか?
CGIやmod_perlで作ろうとしてるんだったら無駄ですよ、
良く考えましょう。
alarmの使い方はそんなもんかな?
チャットCGI作るんなら、前回発言時のタイムスタンプを
取っておいて、それと比較するしかない。
というか、初心者のお題としてチャットはちょっといかがな
ものかと思うよ。サーバー作るんじゃなきゃ汚い実装しかできないし。
掲示板の方がまだいい。
0671667
2009/04/25(土) 08:18:25CGIでチャットは無理なんですか?
0672デフォルトの名無しさん
2009/04/25(土) 08:23:47無理ではないが、向いてない。
HTTPは基本的にはストリーム通信じゃないから。
0673667
2009/04/25(土) 08:28:38ところでCGIで一定時間たつとファイルの中身を書き換えるタイマーみたいなものが作りたいのですが
どうすればいいですか?
たとえば time.txt というファイルの中身を 0 にしておいて
フォームか何かの送信を受けて 1 に書き換えた場合その1分後に自動的に0にもどるみたいな
0674デフォルトの名無しさん
2009/04/25(土) 08:43:54そういうのもCGIは向いてない。
一応forkしてCGIスクリプトを1分間走りっぱなしにすれば
可能だが、システムの負荷が高くなりそう。
そういうのはUNIXシステムならcronを使うべき。
0675デフォルトの名無しさん
2009/04/25(土) 09:45:15>>673
system "sh -c 'sleep 60; echo 0 > time.txt' & ";
0676667
2009/04/25(土) 09:45:56似たような用途のときはフォームの送信を受けた時に1に書き換えられた時間を記録して
次に呼び出した時、記録と現在時間を照合して1分たってたら0に書き換えるようにすればいいのですね?
0677667
2009/04/25(土) 09:47:3560秒間ねちゃうの?
0678デフォルトの名無しさん
2009/04/25(土) 10:09:56そういうことだと読んだんだが
0679デフォルトの名無しさん
2009/04/25(土) 13:55:27つーか板違い
WebProg板行けよ
0680デフォルトの名無しさん
2009/04/25(土) 19:36:460681デフォルトの名無しさん
2009/04/25(土) 23:18:28ボタンイベントはDownとUpの2回発行で1セット
0682デフォルトの名無しさん
2009/04/26(日) 09:03:28リストの内容を順番に出力したいのですが、どうすればできますか?
よろしくお願いします。
0683デフォルトの名無しさん
2009/04/26(日) 09:36:490684デフォルトの名無しさん
2009/04/26(日) 09:54:30配列をハッシュにぶら下げればいいだけ。
0685682
2009/04/26(日) 11:54:34open(TXT, "x.dat");
$status = 0;
my %hash;
foreach (<TXT>) {
chomp;
if ($status == 0) {
if (/^start (\S)/) {
my @list;
$hash{$1} = \@list;
$status = 1;
}
} elsif ($status == 1) {
if (/^end;/) {
$status = 0;
} else {
push(@list, "$_");
}
}
}
my @k = sort keys(%hash);
foreach (@k) {
my $lst = $hash{"$_"}; # リストをを取り出したい
print @$lst;
}
-------------- x.dat
start C
CCC
end;
start A
AAA
end;
0686デフォルトの名無しさん
2009/04/26(日) 12:19:50と書くべきところを省略して
close;
だけにしてたら、なんかハッシュがクリアされたけど、
そういう仕様?
0687デフォルトの名無しさん
2009/04/26(日) 12:35:22#!perl -w
use strict;
my $key;
my %hash;
open TXT, "x.dat" or die $!;
while (<TXT>) {
chomp;
if (/^start(\S)/) {
$key = $1;
} else {
push @{$hash{$key}}, $_ unless /^end;/;
}
}
for my $key (sort keys %hash) {
my $lst = $hash{$key};
print "@$lst\n";
}
俺が書くとこんなんなっちゃったけど
@list はスコープ外だと思う
0688デフォルトの名無しさん
2009/04/26(日) 12:37:230689デフォルトの名無しさん
2009/04/26(日) 13:21:17こんな書き方ができるとは…勉強になりました。
ありがとうございました。
0690デフォルトの名無しさん
2009/04/26(日) 14:14:05ルーズにも書ける、かっちりも書ける
ってところなのか?
0691デフォルトの名無しさん
2009/04/26(日) 14:45:04そして悪いところは
ルーズにも書けるし、かっちりも書けるところだ。
0692デフォルトの名無しさん
2009/04/26(日) 16:03:39なるほど
0693デフォルトの名無しさん
2009/04/26(日) 16:58:17perlゆえの弱点とかあんまないと思う
0694デフォルトの名無しさん
2009/04/26(日) 17:46:42ルーズにも書けるし、かっちりも書けるということ。
0695デフォルトの名無しさん
2009/04/26(日) 17:50:55そんなことしたらプロセスが山ほどできるがそういうのを負荷に含めない人?
0696デフォルトの名無しさん
2009/04/26(日) 17:52:04場合によって、っつーのもある。
1回しか使わないような文書処理とかは超ルーズに書く。use strictなんてしない。
0697デフォルトの名無しさん
2009/04/26(日) 19:09:430698デフォルトの名無しさん
2009/04/27(月) 00:27:10>>424あたりと同じ話か
0699デフォルトの名無しさん
2009/04/27(月) 20:28:12use warnings;
sub print_data{
my @lines;
my $data_line;
my $data_file = "/hoge/fuga/.foobar";
my $fp;
open($fp,"< $data_file") or die "Can't ope data file!";
@lines = $fp;
foreach $data_line(@lines){
print "$data_line";
}
close($fp);
}
こういうサブルーチンをかいて&print_dataを呼び出すと
GLOB(0x80014)とかいう文字が出力されるだけでファイルの内容が表示されないのですが
何処を修正すべきでしょうか?
ちなみに上の.foobarの中身は
Hello
となっています。
0700デフォルトの名無しさん
2009/04/27(月) 20:58:42@linesにファイルハンドル突っ込んでね?
0701デフォルトの名無しさん
2009/04/27(月) 21:52:27ありがとう御座います。
<$fp>という表記が正しくない物だとおもっていました。
Perlはもっと直感的なかんじで書いて、ちゃんと展開されるんですね。
ありがとう御座います、無事かいけつしました。
0702デフォルトの名無しさん
2009/04/27(月) 22:47:400703デフォルトの名無しさん
2009/04/27(月) 22:58:280704デフォルトの名無しさん
2009/04/27(月) 23:06:320705デフォルトの名無しさん
2009/04/28(火) 02:40:30同時に一行以上読み込ませるのは御法度だった時代があるからな。
0706デフォルトの名無しさん
2009/04/28(火) 02:52:54まだperl自体が存在していなかったな・・・
0707デフォルトの名無しさん
2009/04/28(火) 11:04:09(kもMも付かない正真正銘の256バイトじゃ)
のワンボードマイコンを工夫しながら使っておったんじゃ。
それをなんじゃ、今の若いもんは。
2Gじゃ足りんから4G乗せろ、などと.......フガフガ
0708デフォルトの名無しさん
2009/04/28(火) 11:32:540709デフォルトの名無しさん
2009/04/28(火) 12:15:030710デフォルトの名無しさん
2009/04/28(火) 12:39:520711デフォルトの名無しさん
2009/04/28(火) 12:49:040712デフォルトの名無しさん
2009/04/28(火) 13:22:300713デフォルトの名無しさん
2009/04/28(火) 13:26:25だから、rubyなどに対して、perlerの「遅い」とかいう悪口を見ると、ちょっと微笑ましくなる。
0714デフォルトの名無しさん
2009/04/28(火) 13:29:31awkより遅いってのは眉唾だな。
0715デフォルトの名無しさん
2009/04/28(火) 13:32:04立ち上げてナンボの言語だから、shellより重いってのも眉唾だな。
0716デフォルトの名無しさん
2009/04/28(火) 13:32:29処理系が「巨大」だからだよ。上の他のやつのレスとかまったく目に入ってないんだな、あんたは。
0717デフォルトの名無しさん
2009/04/28(火) 13:43:330718デフォルトの名無しさん
2009/04/28(火) 13:59:28awkとperlの起動コストって言うほど変わらなかったと思うぞ。
一旦起動したらperlの方がサクサクなのは言うまでもない。
0719デフォルトの名無しさん
2009/04/28(火) 14:02:45>awkとperlの起動コストって言うほど変わらなかったと思うぞ。
>一旦起動したらperlの方がサクサクなのは言うまでもない。
いずれも違うね。
まあ、昔のUNIXマガジンのバックナンバーでもめくってみてくれ。
0720デフォルトの名無しさん
2009/04/28(火) 14:22:180721デフォルトの名無しさん
2009/04/28(火) 16:15:15perlは止まったかと思うほど起動に時間かかる
0722デフォルトの名無しさん
2009/04/28(火) 19:56:400723デフォルトの名無しさん
2009/04/28(火) 20:25:040724デフォルトの名無しさん
2009/04/28(火) 20:26:180725デフォルトの名無しさん
2009/04/28(火) 21:42:30人からすると一見どうってことない行列計算が、すぐ爆発しちゃうからねえ。
2年でメモリが倍増するとすると、20年後にようやく10^3倍。
あの分野のプログラムがもっぱらメモリ削りに注力する状況は、
とてつもないブレークスルーがないと変わらないね。
0726デフォルトの名無しさん
2009/04/28(火) 21:52:140727デフォルトの名無しさん
2009/04/28(火) 22:06:38ヒント:仮想記憶
0728デフォルトの名無しさん
2009/04/28(火) 22:14:040729デフォルトの名無しさん
2009/04/28(火) 22:24:53100MBのファイルを丸ごとくわえ込むPerl scriptを書いても、
何の問題もないな。
0730デフォルトの名無しさん
2009/04/28(火) 23:15:100731デフォルトの名無しさん
2009/04/29(水) 01:11:02> 巨大行列の逆行列とか計算してるスパコンは、メモリ足りてるんだろうか
足りるように圧縮する。足りなかったら部分問題に分解する。
0732デフォルトの名無しさん
2009/04/29(水) 01:35:11分解を自動化させてたら、その分遅くなるだろうし
0733デフォルトの名無しさん ◆cR08PK3l1o
2009/04/29(水) 15:38:090734デフォルトの名無しさん
2009/04/29(水) 21:58:460735デフォルトの名無しさん
2009/04/30(木) 11:21:330736デフォルトの名無しさん
2009/05/01(金) 00:58:24v5.8.8 build817のWindows環境において、ImageMagickを導入したいと考えています。
ppmからはインストールできないみたいなのでImageMagickの公式からインストーラを落とそうと思うのですが、
配布されているものが多すぎて、どれを導入したら良いのか見当が付きません。
(Q8、Q16とは?dllとstaticのインストーラの違いとは?)
また、インストーラーによっても対応するPerlのバージョンも違うらしいのですが、
上記のバージョンのPerlでImageMagickを使用していらっしゃる方はいないでしょうか?
0737デフォルトの名無しさん
2009/05/01(金) 01:13:430738デフォルトの名無しさん
2009/05/02(土) 12:50:36とクッキーを食わせてるんですが、半角英数字ならまったく問題ないのですが
日本語だとなぜかIE以外のブラウザでは文字化けして取得されてしまいます。
どのようにすれば文字化けせずにちゃんと取得させるようにできるのでしょうか?
0739デフォルトの名無しさん
2009/05/02(土) 13:42:53誘導します
http://pc11.2ch.net/php/
0740デフォルトの名無しさん
2009/05/02(土) 14:05:42ごめんなさい。移動します。
0741デフォルトの名無しさん
2009/05/04(月) 00:09:270742デフォルトの名無しさん
2009/05/04(月) 22:47:48Attribute::Finalかな?
あるいは、
my $class = ref $self; # Scalar::Util::blessedでも可
croak 'オーバーライドしちゃいやん'
if $class ne 'SampleClass'; # __PACKAGE__ではなくベタ書き
それはそうと、Win32環境で、他のプロセスから
メッセージを受けるにはどうしたらいいですか?
0743デフォルトの名無しさん
2009/05/05(火) 02:16:01なるほど、Scalar::UtilではBGINブロックと実行ブロックの時間差を利用してパッケージをチェックするわけですね
頭いいなぁ、ありがとうございます
0744デフォルトの名無しさん
2009/05/05(火) 13:30:17cpanにうpできるようになるまでの流れってどんな感じなんですかね?
0745デフォルトの名無しさん
2009/05/05(火) 13:32:460746デフォルトの名無しさん
2009/05/05(火) 14:03:32うpするレベルのものを作ればいいだけ。
少々コードが下手でも誰も作ってなくて需要があるものならおk。
あとは他の人がサポートしてくれるさ。
0747デフォルトの名無しさん
2009/05/05(火) 17:07:31ガラクタでいいなら作ってるんですが、まだ人に評価してもらえるほどのスキルと知識はないと思います
>>746
とりあえず誰かに見てもらわなきゃいけないわけですよね
普通はこんなん作ってみたよーってブログなんかでうp→評判よければcpanにって流れなんでしょうか
0748デフォルトの名無しさん
2009/05/05(火) 18:28:43思いつくんだ?ある意味時代の最先端にいないと何が足りないのかって
気づかなくないか?たいていの作業は既存のモジュールでできるもんな
0749デフォルトの名無しさん
2009/05/05(火) 18:43:20それが分かるようになったら思いつく思います
0750デフォルトの名無しさん
2009/05/05(火) 19:03:41んで誰かがモジュール公開したら「自分でできるけどあるなら使ってやるか」→「それはあのモジュールが定番だよ」的な流れみたいな
0751デフォルトの名無しさん
2009/05/05(火) 19:47:37最近のだと、電話番号の判定モジュールとか最先端でも何でもないよ。
技術も(実際はどうか知らんが)ほとんど必要ない。作った人に根気があっただけ。
0752デフォルトの名無しさん
2009/05/05(火) 20:01:18LaTeXを直打ちだったり、エクセルの授業中にVB使って変換した奴をPerlスクリプトに流し込んで
楽しまくりだったりするだけで実社会の問題に気づかないんだよな。
「これはなさそうとだなぁ、つくったら喜ばれるんじゃね」とおもって探すと
あるんだよね...orz
0753デフォルトの名無しさん
2009/05/05(火) 20:22:000754デフォルトの名無しさん
2009/05/05(火) 20:56:08使い辛いものは作り直す
無いものは自分で作る
これぞhacker
0755デフォルトの名無しさん
2009/05/05(火) 20:57:58なっちゃうこともあるしね。
0756デフォルトの名無しさん
2009/05/08(金) 08:38:04お尋ねいたします。
やろうとしていることは、LWP::Simpleをuseして
$BUFF =get($TargetURL)
てな具合にて取得するという至って単純なものなんですが、この$TargetURLから送られてくるデータ
というのがhttpによって配信されるストリーミングデータでして、EOFが返されない限りはブラウザの
画面は真っ白けっけのまんまという次第であります(よって、終了時間になったり中断すると、変数の
中に溜まったデータが初めてブラウザ上に表示されるという次第)。
なんでこんなことをするのかというと、サーバー側から送られてくるデータの内容を
$BUFF =~ s/$Str01/$Str04/g;
みたいな感じで置き換えたり消したりした上で画面に表示させたいなぁ…と思ったからなんですが、
もしかして自分は、Perlではできないことをしようとしてきたのではあるまいか?とか思い至るようになり、
こうして諸先輩方のお教えを乞いに参上いたしました。
というわけで、Perlではできないのであれば諦めますが、そうでないなら「これがイカン」とか「ここを
もっとナニせなイカン」といったお話がありましたら、なにとぞよろしくお願いいたします。<(_ _)>
0757デフォルトの名無しさん
2009/05/08(金) 09:06:10HTTP::Proxy::BodyFilter使うと楽なんじゃないかな
0758デフォルトの名無しさん
2009/05/08(金) 14:14:31ストリームデータを加工して逐次表示したいならuse Socketして
シコシコ書くのが確実だと思う。$| = 1を忘れずに
0759デフォルトの名無しさん
2009/05/08(金) 14:38:28そこまで降りる必要はない。
0760デフォルトの名無しさん
2009/05/08(金) 14:47:48> やろうとしていることは、LWP::Simpleをuseして
SimpleじゃないことはSimpleではできないというのが道理。
LWP::UserAgentを使って、callbackを設定すればおk
0761デフォルトの名無しさん
2009/05/08(金) 17:42:42シンプルに書けるけど、突っ込んだことも出来る、というのが使えるパッケージ
一方、LWP::UserAgentは簡単なことをするにも行数が多くなる
とりあえず、Simpleで書いて、限界が見えたらUserAgentに書き換える、
みたいなことをよくやる
0762デフォルトの名無しさん
2009/05/08(金) 17:50:430763デフォルトの名無しさん
2009/05/08(金) 17:54:29わたしは基本的にURI::Fetchを使う。
0764デフォルトの名無しさん
2009/05/08(金) 20:00:210765デフォルトの名無しさん
2009/05/08(金) 20:14:030766デフォルトの名無しさん
2009/05/08(金) 20:39:51処理とテストをそれぞれファイル内にパッケージにして書いたら怒られた(´・ω・`)
でもmainにベタ書きじゃテストが書きにくいし汚くなるからイヤなんですよね
0767デフォルトの名無しさん
2009/05/08(金) 21:28:01みたいな制御構造って、どう書くのが普通?
ループの中だとredoがしっくり来るんだけど、
単発のgetを強化したい時
0768デフォルトの名無しさん
2009/05/08(金) 22:18:100769デフォルトの名無しさん
2009/05/08(金) 23:25:08テストの自動化ということなら、
ロジックを全て外部モジュールに追い出してそっちをテストするか、
それがダメならテストスクリプトからsystem関数とかで呼び出す、
ぐらいかなぁ
0770デフォルトの名無しさん
2009/05/08(金) 23:25:37何事もなければ1回で済むけど、例外的に繰り返す、みたいな意味にしたい
if (expr) {expr} と書くか
expr if expr;
と書くかみたいな話
0771デフォルトの名無しさん
2009/05/08(金) 23:28:340772デフォルトの名無しさん
2009/05/08(金) 23:43:28マイナーなモジュール探したら、こんなん出ました。
http://search.cpan.org/~danboo/Test-Command-0.02/lib/Test/Command.pm
あとは、IPC::Open3かIPC::Run辺りでデータ受け取りつつ、テストにかけるとか。
0773デフォルトの名無しさん
2009/05/09(土) 00:18:13nanntara;
&get() if(error);
}
>単発のgetを強化したい時
ってなんやねん
0774デフォルトの名無しさん
2009/05/09(土) 00:18:25ラベル名をユニークにするのがめんどい
大抵は意味なんか無いからなあ
その時の行番号にしたろうか
0775デフォルトの名無しさん
2009/05/09(土) 00:19:310776デフォルトの名無しさん
2009/05/09(土) 00:26:23どうでもいいな。
普通に1..10でループまわして、成功したらlastかければいい。
0777デフォルトの名無しさん
2009/05/09(土) 00:28:09どんどん駄目になっていく
0778デフォルトの名無しさん
2009/05/09(土) 01:02:40> とりあえずgetしてみて、エラーになってたら再チャレンジ、
> みたいな制御構造って、どう書くのが普通?
失敗したら再チャレンジじゃなく成功まで再チャレンジが普通じゃね
まぁ見た目の美学を求めるperlハッカーならこう書くだろうがね
↓
0779766
2009/05/09(土) 01:41:25外部に追い出すほどのロジックでないです(というか勝手にモジュール増やすと怒られそうです)
共用データベースから大量の変数を引っ張ってきているんでsystem関数で呼び出すと色々と不都合が起きそうな気はするんですが、
一番現実的ですかね
>>772
ありがとうございます
後付け条件で申し訳ないんですが、バイトでCPANに繋げられないような設定がされてるみたいなんです(’・ω・`)
せっかく探してもらったのに済みません・・・
もしやこういうスクリプトでのスタンダードなテスト方法って確立されてないんでしょうか
0780デフォルトの名無しさん
2009/05/09(土) 01:42:430781デフォルトの名無しさん
2009/05/09(土) 01:54:15> もしやこういうスクリプトでのスタンダードなテスト方法って確立されてないんでしょうか
お前はどういうスクリプトかまだ書いていない
0782デフォルトの名無しさん
2009/05/09(土) 02:24:180783デフォルトの名無しさん
2009/05/09(土) 02:40:21-d じゃ駄目なんかよ
俺は使ったこと無いけど
0784デフォルトの名無しさん
2009/05/09(土) 02:43:02> スクリプト(*.plなファイル)のデバッグというかテストってどうやるべき?
> 処理とテストをそれぞれファイル内にパッケージにして書いたら怒られた(´・ω・`)
どうすればいいのか。怒った人に聞け。
0785766
2009/05/09(土) 03:18:08あ、確かにそうでした
データベースのあるテーブルからすべての行について計算した結果をそれぞれ他のテーブルに書き込むスクリプトです
引数は取りません
問題は共用のテスト用データベースサーバーなのでテスト中に行が追加される可能性があることと、
勝手に都合のいいように変更しにくいということでしょうか
それがなければ>>769の通りsystem関数を使って行うのが一番ですかね…
と書いてて思い至ったんですが、使用するテーブルの中身をメモリやファイル上に退避→都合のいいようにデータベースをいじる→
別ファイルからsystem関数呼び出してテスト→テーブルを元通りに
で問題なさそうですね
質問したのに自己解決で申し訳ない
ありがとうございました
>>783
デバッグでは使ってもテストの労力は増えるので今回はその選択肢はないっす
すみません
>>784
確かにそれが一番ですね
ですが今日聞きそびれたのと、一般的にはどういうことをやっているのか知りたいというのもありまして…
0786772
2009/05/09(土) 03:29:11結局STDINもSTDOUTもSTDERRも関係無しと。
こんなものモジュール化してテストするだけ。
0787デフォルトの名無しさん
2009/05/09(土) 10:14:21いろいろお教えいただきありがとうございました。どうも、SimpleじゃないことをSimpleでやろうと
していたようですね。てなわけで皆様方のご指摘を参考に、また精進を重ねて参りまする。<(_ _)>
0788デフォルトの名無しさん
2009/05/09(土) 17:08:30nfsでマウントしているディレクトリのファイルにアクセスした時に
nfsサーバ側でトラブル起きていた場合はエラーメッセージを出力して
終了させたいのですがどのように書けばいいでしょうか?
eval
{
local $SIG{ALRM} = sub { die "timeout" };
alarm 2; #タイムアウトは2秒
if (-e $file_name) { print 'found';}
alarm 0;
};
alarm 0;
if ($@)
{
print 'error';
}
exit();
といった感じでタイムアウトでエラー処理をしようと思いましたがSIGALRMを拾えませんでした。
何かいい方法は無いでしょうか?よろしくお願いします。
0789デフォルトの名無しさん
2009/05/09(土) 19:46:060790788
2009/05/09(土) 22:34:40通常問題が無い事が前提のnfsサーバがダウンしている時のエラー処理が目的なのです。
なので普段はそのファイルへのアクセスは問題無く行えています。
nfsのマウントオプションがhard,intrなのでなんらかのシグナルが来るとは思うのですが
その前にタイムアウトで捕まえられれば・・・と思って書いたのですがうまくいってません。
別のシグナルを捕まえなければいけないのか、softでマウントしないといけないのか・・・
何か情報をいただけないでしょうか。
よろしくお願いします。
0791788
2009/05/09(土) 22:39:05・2秒のタイムアウトが動かない
・apacheのタイムアウトで強制終了される
といった感じです。よろしくお願いします。
0792デフォルトの名無しさん
2009/05/09(土) 23:44:33nfsよー知りませんが
0793デフォルトの名無しさん
2009/05/09(土) 23:51:14if( -e FILE ){
あった
}else{
なかった
}
じゃいかんの
0794788
2009/05/10(日) 00:29:33レスありがとうございます。
elseについては試してませんが、あるか無いかの判断に2秒かかるとも思えないのと、
apacheでタイムアウトを起こす前に処理が帰ってきていないようなのです。
恐らくnfs側でタイムアウトして、なんらかのシグナルを送ってきてるのだが
私がそのシグナルをperlで受け取る方法を知らないのが問題なのだと思います。
0795デフォルトの名無しさん
2009/05/10(日) 00:51:10でなくて、あれこれ想像するだけで、問題を切り分けてデバッグしていないのが問題。
0796デフォルトの名無しさん
2009/05/10(日) 02:16:04ですよね
できました!ありがとう
0797デフォルトの名無しさん
2009/05/10(日) 03:05:24$ENV{PERL_SIGNALS} = 'unsafe';するといいよ
0798デフォルトの名無しさん
2009/05/10(日) 17:03:40my $でスカラー変数を宣言しているのですが、そのあとに{}や=>が入っていてよくわかりません
ハッシュとは違うのでしょうか?
my $test = {
AAA => 'krnaa',
BBB=> '454',
};
0799デフォルトの名無しさん
2009/05/10(日) 17:08:46で調べて味噌
0800デフォルトの名無しさん
2009/05/10(日) 17:29:340801デフォルトの名無しさん
2009/05/10(日) 20:08:02いつごろのperlからあるの?
0802デフォルトの名無しさん
2009/05/10(日) 20:40:120803デフォルトの名無しさん
2009/05/10(日) 20:57:095の機能もそれとは知らずにばんばん使ってるけど、
無名まわりは知らなくても何となく読めるから整理されてない
0804デフォルトの名無しさん
2009/05/10(日) 22:11:15そんなんもあったのかと個別に新発見してきたけど、
まとめて覚えた方が効率的だよな
5の新機能を使うと互換性が無くなると思って、
極力4の範囲内で書いてた筈がいつのまにかすっかり5
0805デフォルトの名無しさん
2009/05/10(日) 23:04:510806デフォルトの名無しさん
2009/05/10(日) 23:08:590807デフォルトの名無しさん
2009/05/10(日) 23:19:050808デフォルトの名無しさん
2009/05/10(日) 23:41:060809788
2009/05/10(日) 23:49:45示したコードではファイルが見つからなかったら何も表示されずに正常終了しますよね?
でもapacheのエラーログにタイムアウトと表示されているのです。
それでもelseを書いてテストした方がいいですか?
>>797
レスありがとうございます。
使ったことが無いのですがこれから調べて試してみます。
どなたか、perlでnfsがらみのエラー処理のコードを書いた事がある方はいませんか?
nfsサーバのトラブルに対応した例をネットで探したのですが見つからないのです。
よろしくお願いします。
0810デフォルトの名無しさん
2009/05/10(日) 23:55:56そもそもテストならApache経由じゃなくてコマンドラインから直でやってみればっ
0811デフォルトの名無しさん
2009/05/11(月) 00:30:23「ファイルを粒でgzip圧縮して、それを最後にtarでまとめる」
のではなく、
「ファイル全部をtarでまとめて、それを最後にgzip圧縮する」
方法はどうすればいいでしょうか。
単にファイル群をadd_filesメソッドの引数に突っ込んで、
最後にwrite($file, COMPRESS_GZIP)すればいいだけの話ですか?
0812デフォルトの名無しさん
2009/05/11(月) 00:57:42やってみれば
0813デフォルトの名無しさん
2009/05/11(月) 19:36:55perlで書かれたCGIファイルいじってHTMLページのリニューアルしてるんだけど
firefoxでは表示されるのにIEじゃ500エラーになるんですが
何が原因ですか??
パーミッション、perlのパス、文法は問題無いんです。
EUCで書かれてるみたいなので、文字コードが原因なのかなと思うのですが
どこをいじればいいのかわからないのですが。。
0814デフォルトの名無しさん
2009/05/11(月) 19:42:52置いたディレクトリは、ApacheでOptions ExecCGIされてる?
とりあえず、hello world置いて実行できるか試してみては?
あと、apacheのログ確認。
0815デフォルトの名無しさん
2009/05/11(月) 20:50:580816デフォルトの名無しさん
2009/05/12(火) 06:58:03まずは、apacheのerror.logを貼れ。
話はそれからだ。
0817デフォルトの名無しさん
2009/05/12(火) 09:20:380818デフォルトの名無しさん
2009/05/12(火) 10:55:030819デフォルトの名無しさん
2009/05/12(火) 17:30:240820デフォルトの名無しさん
2009/05/12(火) 18:23:120821デフォルトの名無しさん
2009/05/12(火) 18:28:540822デフォルトの名無しさん
2009/05/12(火) 20:57:01TemplateとCGIを利用してプログラムの作成を行っております。
そこで、TemplateにCGIで受け取ったパラメータを渡したいのですがうまくいきません。
my %foo;
$foo{$_} = $cgi->param( $_) for $cgi->param();
$param = {
foo => \%foo;
}
という作業を行うと問題なく渡せるのですが、%fooを作成しない方法はありませんでしょうか?
こんなことかしら?
tu-kaうまくいかなかったときのコードを晒さないでどうしろと♪
0824デフォルトの名無しさん
2009/05/12(火) 22:17:45[%
USE CGI;
CGI.param('name');
%]
0825デフォルトの名無しさん
2009/05/12(火) 22:20:05my $foo
$foo->{$_} = $cgi->param( $_) for $cgi->param();
これで解決。
0826デフォルトの名無しさん
2009/05/12(火) 22:34:10$param = {
foo => { $cgi->Vars() },
}
0827デフォルトの名無しさん
2009/05/13(水) 05:00:14他人にソースを渡して使ってもらう場合、モジュール依存の処理はどうしたらいいかなあ。
向こうでCPANから拾ってきてくれるなら何使ったっていいだろうけど……
比較的インストールされてる可能性が高い(できれば標準の)モジュールだけに絞るべきか…。
0828デフォルトの名無しさん
2009/05/13(水) 06:13:10Perlに詳しくない人はCPANって言われてもさっぱりだろうからなぁ
0829デフォルトの名無しさん
2009/05/13(水) 06:43:27100ぐらいのモジュール試してarc依存だったのは2〜3割くらいだった
0830デフォルトの名無しさん
2009/05/13(水) 18:57:20&sub_routine
&sub_routine->()
両者は同じ意味でしょうか?
"->"の意味がよくわからず・・・。
0831デフォルトの名無しさん
2009/05/13(水) 19:05:48&sub_routine->()は&sub_routineの返す値をサブルーチンへの
リファレンスだと思ってさらにそれを呼び出すから全然違うよ。
0832デフォルトの名無しさん
2009/05/13(水) 19:40:08以上
0833デフォルトの名無しさん
2009/05/13(水) 20:27:45内部的にはデリファレンスだけど、意味としては関数オブジェクトだし
他のオブジェクト指向言語からの類推で何となく読めてしまうので、
厳密な意味の理解に至らない
0834デフォルトの名無しさん
2009/05/13(水) 21:27:080835830
2009/05/14(木) 00:48:30アドバイスどうもです。
リファレンスについて調べました。
C言語ではポインタに当たるものらしいですね。
これを踏まえて書き直すと、下記のように。
&sub_routine
\&sub_routine->()
つまりポイントとしては
「アロー演算子は、
アドレスを指し示すリファレンスを
デリファレンスする働きをもつ 」
ということでしょうか。
0836デフォルトの名無しさん
2009/05/14(木) 01:39:22と思っても、
perlではデリファレンスとメソッドは同じこと、と思っても困らない
0837デフォルトの名無しさん
2009/05/14(木) 07:38:30> C言語ではポインタに当たるものらしいですね。
停留所でしか止まれないけどな。
0838デフォルトの名無しさん
2009/05/14(木) 09:26:27&NAME; # Makes current @_ visible to called subroutine.
0839デフォルトの名無しさん
2009/05/14(木) 09:28:13同じじゃないの?
0840デフォルトの名無しさん
2009/05/14(木) 10:42:18g(1,2);
sub f {
print "@_\n";
}
sub g {
print "&f:";
&f;
print "&f():";
&f();
}
% perl foo.pl
&f:1 2
&f():
0841デフォルトの名無しさん
2009/05/14(木) 10:47:25なんて()が無いと、1,2が入るのか教えてください
0842デフォルトの名無しさん
2009/05/14(木) 11:21:40http://perldoc.perl.org/perlsub.html
> NAME(LIST); # & is optional with parentheses.
> NAME LIST; # Parentheses optional if predeclared/imported.
> &NAME(LIST); # Circumvent prototypes.
> &NAME; # Makes current @_ visible to called subroutine.
4行目に注目。
0843デフォルトの名無しさん
2009/05/14(木) 15:58:480844デフォルトの名無しさん
2009/05/14(木) 16:07:32俺もそう思う。
しれっとかいてあるけど
&NAME(LIST); # Circumvent prototypes.
なんてのもあるしな。
結論としては&つける書き方はやめとけ。
0845デフォルトの名無しさん
2009/05/14(木) 16:26:18英辞郎レベル11
0846デフォルトの名無しさん
2009/05/14(木) 16:56:40&NAME(LIST);
って書き方しかしない
0847デフォルトの名無しさん
2009/05/14(木) 17:37:13青らくだ原著だと、「usually the & is optional」と書いてある。
訳本には「通常&はなくても良い」と、あたかもあっても良いかのように書いてあるが、
通常は使わないというのが5の流儀ということでいいと思う。
どうしても使わなきゃなのは以下のような場合とか。
$func = sub {return 1};
&$func;
$func(); だと動かない。
0848デフォルトの名無しさん
2009/05/14(木) 17:40:420849デフォルトの名無しさん
2009/05/14(木) 17:54:040850デフォルトの名無しさん
2009/05/14(木) 18:09:304の当初は裸のワードが当然のように許されていたので、
裸のワードと区別するために必要だった。
今はuse strictしとけば関数名タイプミスしても裸のワードと
間違われる心配はない。
0851デフォルトの名無しさん
2009/05/15(金) 14:00:42愚直なところがPerlのいいところだと思う
0852デフォルトの名無しさん
2009/05/16(土) 01:08:21スピードupも兼ねてカナをintでなんとか表現出来ないかなと思ったのです
が何か良い方法はないでしょうか?
最初、カナをunpackで分けて足してなんてどうかなと試してみましたが、
sortの基準が数字は右から、文字列は左からなので単純に足すわけにもい
かず、私ではとても無理でした。
もしかしたらDBの所で聞いた方が良い内容かも知れませんが、perlで変更して
入れる方法がいいのかなと思ったのでこちらにしました。
宜しくお願い致します。
0853デフォルトの名無しさん
2009/05/16(土) 01:20:22明らかにDBだろう・・・
0854デフォルトの名無しさん
2009/05/16(土) 03:22:24PerlRequireについての質問です。
# /etc/httpd/conf/httpd.conf
PerlRequire /etc/httpd/conf/startup.pl
#/etc/httpd/conf/startup.pl
use strict;
1;
たったこれだけなんですが、startup.plの中のuse strictが動いてくれません。
スクリプト内に書くとちゃんと読み込みできます。
なぜかわかる方いますか?
スクリプトはCGIではなくmod_perlとして動いてます。
0855デフォルトの名無しさん
2009/05/16(土) 03:29:24#/etc/httpd/conf/startup.pl
use strict;
$unko = 1; # ←ここでエラーが出るなら、use strict; が生きてるんじゃないの?
1;
0856デフォルトの名無しさん
2009/05/16(土) 07:58:200857デフォルトの名無しさん
2009/05/16(土) 09:35:33ああ。なんとなくわかりました。
strict.pmはプレロードできないんすね。strictだけ反映しないんでなんでかと思いました。
0858デフォルトの名無しさん
2009/05/18(月) 01:17:41EncodeがCannot decode string with wide charactersエラー吐きまくり;;
utf8フラグを毎回外さないといけないんですか?フラグ付けたり外したり自作モジュールがたくさんあるから整合性つけるのが大変><;
何か代替案ありませんか?
0859デフォルトの名無しさん
2009/05/18(月) 01:27:400860デフォルトの名無しさん
2009/05/18(月) 01:32:04PHPに全スクリプト移植なんて考えただけでも恐ろしい。却下
しっかし、文字コードの肝心要のEncodeモジュールがutf8フラグに対応してない(decodeね)なんて、なんてお粗末なんだ・・・
0861デフォルトの名無しさん
2009/05/18(月) 01:55:53あんたがどこかで大きな勘違いをしているんだと思う。
そんなことで困っているやつを見たことないし、おれもないもん。
0862デフォルトの名無しさん
2009/05/18(月) 02:01:050863デフォルトの名無しさん
2009/05/18(月) 02:19:420864デフォルトの名無しさん
2009/05/18(月) 07:25:53EUC-JPとShift-JISが既に判別不可能。UTF-8なんか混じるともうだめぽ。
ASCIIのみで構成された非ASCII文字列なんかも判別不可能だな。
現状、その辺に転がってる判別ロジックは確率的にこっちだろjk、と判別をつけている。
しかしShift-JISの半角カナの奇数文字数文字列なんかはマジでEUC-JPと
区別がつかない時がある。半角カナが文字化けするからダメだと
言われる所以だ(その認識は間違ってる訳だが)
0865デフォルトの名無しさん
2009/05/18(月) 18:04:22コード組む以前の努力不足
0866デフォルトの名無しさん
2009/05/18(月) 18:18:39HTTP1.0だとクライアントからどの文字コードが帰ってくるか不明なんだよねー。
0867デフォルトの名無しさん
2009/05/18(月) 18:24:34特定の文字埋め込んでおいて呼ばれたらその文字調べりゃわかる場合もある
0868デフォルトの名無しさん
2009/05/18(月) 18:29:19HTTP1.0の時代のCGIはみんなそうやって対策してたよねー。
0869デフォルトの名無しさん
2009/05/18(月) 18:34:240870デフォルトの名無しさん
2009/05/18(月) 18:35:130871デフォルトの名無しさん
2009/05/18(月) 18:40:28目的の文字コードと合わなかったら、はねればいい。
つか、webprogの話だな。
0872デフォルトの名無しさん
2009/05/18(月) 18:48:50ぬぬっ!勝ち負けがあったのか。参戦したかったぜ。
0873デフォルトの名無しさん
2009/05/18(月) 21:47:26>>871が現実
すべての場合に対応したい気持ちは分かるがね
0874デフォルトの名無しさん
2009/05/18(月) 22:27:12非対応ブラウザは排除ですかそうですか。
仕事だとそうも行かないのが現実だと思いますが。
0875デフォルトの名無しさん
2009/05/18(月) 22:33:34そもそもencodeされてるのとされてないのが混在するようなプログラムがおかしいと
思うが、手を抜きたければ
sub mydecode {
return is_utf8($_[1])? $_[1]: &decode;
}
とかすれば?
0876デフォルトの名無しさん
2009/05/18(月) 23:00:00だから<STDIN>からの入力文字コードが不明な場合なんかだよ。
不明だからencodeもできないだろ。
0877デフォルトの名無しさん
2009/05/18(月) 23:11:17もとの質問(858)ちゃんと読んだ?
0878デフォルトの名無しさん
2009/05/19(火) 00:20:210879デフォルトの名無しさん
2009/05/19(火) 09:40:42元の質問は>>862かと思ったぜ。ちゃんとアンカーつけてくれよ・・・。
0880デフォルトの名無しさん
2009/05/21(木) 02:54:38うまくいかない文字とは半角スペースや�Xのような文字です
例えば半角スペースなら+となって、�Xなら%e2%85%a4となるのが正しくエンコードされた結果のようです(あるwebサイト上のプログラムでエンコードを試したところ、このような結果がでて、このエンコードされた文字列をYahooApiで普通に使えました)。
自分が使用しているサブルーチンだと半角スペースが%2bとなり、�Xが%ef%bf%bdXとなってしまいます。
どうかご教授願います。
以下が使用しているサブルーチンです
sub urlencode{
my $value="$_[0]";
$value=Jcode->new($value)->utf8;
$value =~ s/\s/+/g;
$value =~ s/([^\w ])/'%'.unpack('H2',$1)/eg;
$value =~ tr/\s/+/;
return "$value";
}
0881デフォルトの名無しさん
2009/05/21(木) 04:06:12半角スペースを2bにしたくないのならこれは不要。
�Xは恐らく文字コード判別に失敗して正しくマッピング出来てないと思う。
入力文字コードが分かっているなら
$value=Jcode->new($value、'sjis')->utf8;
のようにして問題を切り分けてみると良いかも
0882デフォルトの名無しさん
2009/05/21(木) 13:14:37Jcode::getcode(�X)で調べたところsjisとなっておりました。
その後以下のコードにして半角スペースについては解決しましたが、やはり�Xとか�Vとかがうまくエンコードできません。
念のため$value=Jcode->new($value,'sjis')->utf8;のsjisのところをいろいろ変えて試してみましたがやはりダメです。
URLエンコードができるwebサイトを3つ見つけて、そのうち2つのサイトでは�Xは%e2%85%a4と望みどおり変換されましたが、残りのサイトは下のプログラムの実行結果と同じで%ef%bf%bdと返されます。
このことから、おそらくよくある変換ミスだとは思うのですが・・・
ちなみにwindowXPでコマンドプロンプトからperlを動かしています。
my $title='';
$title='�X ';
$title=&urlencode($title);
print "$title\n";
sub urlencode{
my $value="$_[0]";
$value=Jcode->new($value,'sjis')->utf8;
$value =~ s/([^\w ])/'%'.unpack('H2',$1)/eg;
$value =~ s/\s/+/g;
return "$value";
}
0883デフォルトの名無しさん
2009/05/21(木) 15:28:10�XはMS拡張文字だからsjisではなくcp932だった。
0884デフォルトの名無しさん
2009/05/21(木) 15:49:32機種依存文字ってとこまではわかったのですが、そこから進めなかったんです
cp932にすれば�Xみたいな文字や普通の日本語も望みどおり変換されて、漢字やひらがなも変換されますね
ありがとうございました
0886デフォルトの名無しさん
2009/05/21(木) 16:15:59・・・ググれよ。
0887デフォルトの名無しさん
2009/05/21(木) 17:03:22$ftp = Net::FTP->new($address, Debug => 0);
$ftp->login($id, $pw);
#処理本体
sleep(3600);
}
みたいなことをして、定期的にftpするスクリプトを走らせてるんだけど、
普通に使ってる分にはうまくいくけど、windowsを休止状態にして、復帰すると、
Can't call method "login" on an undefined value at なんたら
で $ftp->login の行で落ちてる
何故エラーになるのかと、とりあえず終了しないようにするには、どうしたらいい?
0888デフォルトの名無しさん
2009/05/21(木) 17:16:30基本的な原因は、その前のnew()で失敗しているからでそ
なぜ失敗するのかとかはゲイツOSの休止状態を知らないのでわからん。
0889デフォルトの名無しさん
2009/05/21(木) 18:17:40今休止状態なのか起動してるのかを安全に調べて、
起動するまでsleepする、みたいな処理はどう書いたらいいんだろう
0890デフォルトの名無しさん
2009/05/21(木) 18:21:55スクリプトが既に動いている
0891デフォルトの名無しさん
2009/05/21(木) 18:24:233600秒ごとにタスクスケジューラで叩く。
0892デフォルトの名無しさん
2009/05/21(木) 18:49:13安全なgetあたりで様子を見る、というのを思いついた
でも、タスクスケジューラの方がよっぽどスマートだ
0893デフォルトの名無しさん
2009/05/21(木) 20:36:19MySQL5を使うのにPerlをインタフェースにしようとしていて
use DBI;
@dbs = DBI->data_sources("mysql");
で、localhostのデータベース名を取得しようとしたんですが、何も代入されません
なぜなんでしょう?
もしかしたら、ものすごく単純なとこで間違えてるかもしれませんが
MySQLは5.0.81、Perlは5.8.9、DBIは1.6.7、DBD::mysqlは4.005
参考にしたもの:
http://dev.mysql.com/doc/refman/4.1/ja/perl-dbi-class.html
0894デフォルトの名無しさん
2009/05/22(金) 01:53:27http://cnw.hp.infoseek.co.jp/oracle/ora09.html
「多くのドライバが、空文字、もしくは不完全なリストを返すことが多いので、注意しましょう。」
0895デフォルトの名無しさん
2009/05/22(金) 08:54:060896893
2009/05/22(金) 20:30:53うーむ、なんか適当なメソッドだなー
試行錯誤の結果、
DBI->data_sources("mysql",{user=>$user,password=>$pass})
としたら、とりあえずうまくいきました
localhostのときは"mysql"だけでいいみたいな書き方だったけど、実は
そうじゃなかったみたいです
ありがとうございました
>>895
MySQLからshow databasesする代わりに、Perlのコマンドラインツールで
見れないかと思って
0897デフォルトの名無しさん
2009/05/22(金) 20:36:16用語が適当ですみません
0898デフォルトの名無しさん
2009/05/23(土) 00:01:030899デフォルトの名無しさん
2009/05/23(土) 11:45:51自分の世界しな知らない人
0900デフォルトの名無しさん
2009/05/23(土) 11:46:42自分の世界しか知らない人
0901デフォルトの名無しさん
2009/05/23(土) 11:52:36それはそうと、ちょっと利口な事務のおねーちゃんがAccessでちょっとしたもの作っちゃってて
びっくらこいたぜ。Accessの功績は大きいな。
0902デフォルトの名無しさん
2009/05/23(土) 12:01:04Excelの功績も大きいな。
0903デフォルトの名無しさん
2009/05/23(土) 17:17:21そりゃもう大騒ぎよ。
0904デフォルトの名無しさん
2009/05/23(土) 23:02:10まぁプログラマーって事務仕事しないんだろうけど・・・
あいつらはマジ強力
0905デフォルトの名無しさん
2009/05/23(土) 23:04:110906デフォルトの名無しさん
2009/05/23(土) 23:37:09Win32::OLEを使ってAccessのデータベース(***.mdb)を操作したいのですが、読み込みのところで困ってます。
・やりたいこと
クエリーPriceから@BrandIdが55のもの一覧を取得したい
・問題がありそうな部分(WHEREの付け方がおかしい?)
$rs=$objDB->Execute("SELECT * FROM Price WHERE @BrandId = 55;");
・このようにWHERE以降をカットするとエラーが出ません
$rs=$objDB->Execute("SELECT * FROM Price;");
・エラーの種類
Can't call method "EOF" on an undefined value at testr.pl line 26.
Active Perl 5.10.0を使ってます。
よろしくお願いします。
0907デフォルトの名無しさん
2009/05/24(日) 00:02:13>Can't call method "EOF" on an undefined value at testr.pl line 26.
26行目見ろよ
0908デフォルトの名無しさん
2009/05/24(日) 00:21:110910デフォルトの名無しさん
2009/05/24(日) 01:23:19年の第何週という情報からその週が何月何日から何月何日かを求めたいのですが、
わかりません。
例:2009年第2週→1/5〜1/11(週は月曜始まり)
0911デフォルトの名無しさん
2009/05/24(日) 01:24:34年の第何週という情報からその週が何月何日から何月何日かを求めたいのですが、
わかりません。
例:2009年第2週→1/5〜1/11(週は月曜始まり)
どのたか教えていただけませんでしょうか?
0912デフォルトの名無しさん
2009/05/24(日) 02:10:17すぐ作れるなら自分で作る派だからよく覚えてないけど。
適当な算出方
(2009 - 1970) * 60 * 60 * 24 * 365;
2 * 60 * 60 * 24 * 7;
(2 - 1) * 60 * 60 * 24 * 7;
なんか世の中には4年に一回うるう年とかあるし、4年に一回ってその内のどこ?って感じだし、
100年に一回はうるう年ないとか、うるう秒とか、わけのわからんルールがいっぱいあってこれ以上は知りません。
運がよければ誰か偉い人が答えてくれます
0913デフォルトの名無しさん
2009/05/24(日) 02:23:33どう表現するんだ?
0914デフォルトの名無しさん
2009/05/24(日) 06:13:25for my $n (1..53) {
print join(',',hoge( 2000, $n ))."\n";
}
sub hoge {
my ($y,$n)=@_;
my $s=timelocal(0,0,0,1,0,$y)+((24*60*60)*(($n-1)*7-(localtime(timelocal(0,0,0,1,0,$y)))[6]+1));
return map{sprintf("%d/%d",(localtime($s+($_*24*60*60)))[4]+1,(localtime($s+($_*24*60*60)))[3])}(0..6);
}
こんな感じかな?
0915デフォルトの名無しさん
2009/05/24(日) 07:46:58foreach (range('a', 'z') as $letter) {
print $letter;
print "<br>";
}
?>
こういうことができるのが、PHPのすごいところ。
おなじことをperlでやったら、
「正規表現を駆使した渾身の一作」
で、何十行書かないといけないことやら。
0916デフォルトの名無しさん
2009/05/24(日) 08:18:50perl -e 'print "$_<br>" foreach('a' .. 'z')';
で何か不都合があるの?
0917デフォルトの名無しさん
2009/05/24(日) 13:40:28デカい釣り針だな。
0918デフォルトの名無しさん
2009/05/24(日) 13:48:01あからさまにレベルが低すぎるからPHPを貶めるためにわざとやってるんだと思いたい。
0919デフォルトの名無しさん
2009/05/24(日) 14:14:00PHP@プログラム板
http://pc12.2ch.net/test/read.cgi/tech/1232712334/717
0920デフォルトの名無しさん
2009/05/24(日) 14:40:10本人は全然おもしろくないことに気づいてないようだが
0921初心者
2009/05/24(日) 22:45:39教えてください
my ( $hoge );
みたいに変数を()で囲むのはどういう意味があるんでしょうか?
0922デフォルトの名無しさん
2009/05/24(日) 22:51:19みたいにできる
0923初心者
2009/05/24(日) 22:56:07ありがとうございます
ググってもなかなか出なくて困ってたんですよ
0924デフォルトの名無しさん
2009/05/24(日) 23:29:07リスト
0925名無し秀鵬
2009/05/25(月) 00:39:27my ($hoge) = $page =~ /^(\d+)/g;
見つかった中身が $hoge が入る
my $hoge = $page =~ /^(\d+)/g;
見つかった個数が $hoge に入る
まとめて宣言したいなら () 付き。
ただし、似た用途同士でまとめとかないとぐちゃぐちゃになって、
可読性が低下するので注意です
1つだけ宣言したいなら () 無し。
って感じでしょか
By 中級になれない者より
0926デフォルトの名無しさん
2009/05/25(月) 01:05:04ディレクトリの所有者、パーミッションを調べるにはどうしたらよいでしょうか。
ファイル情報はいろいろ出てくるのですがディレクトリ情報はみつかりませんでした。
どうかよろしくお願いします。
0927デフォルトの名無しさん
2009/05/25(月) 01:24:14stat
0928デフォルトの名無しさん
2009/05/25(月) 02:02:09さっそくありがとうございました。
ファイルもディレクトリも一緒なんですね。
ふぅ
0929デフォルトの名無しさん
2009/05/25(月) 03:03:16のqwって何でつけるの?
qwが配列化ってのまでは調べたんだが、
パッケージ名を生で書くとスペース区切りのリストが帰ってきたりするの?
0930デフォルトの名無しさん
2009/05/25(月) 03:26:55/gで見つけたら、@hogeに入れる
0931デフォルトの名無しさん
2009/05/25(月) 04:12:36四行目が何を言ってるかわからないけど、
継承元が複数あるってことが納得できないってこと?それともPerlの文法的な話?
例えば、
our @ISA = qw( Foo::Bar );
だったら納得いく?
0932デフォルトの名無しさん
2009/05/25(月) 04:25:25ありがとうございます。
質問の仕方が悪かった。ごめんなさい。
そもそも
use base が具体的にどういう仕事をしてるのかよくわかってなくて、
そこら辺をあわせて知りたかったんだ。
ISAでググってみた感じだと、
つまりuse baseで指定したパッケージ内で宣言された関数を
自パッケージからも使えるようにするってこと?
ってことは、
use base qw(Foo);
は
use base (Foo::A, Foo::B);
みたいなものだと理解すればいいの?
0933デフォルトの名無しさん
2009/05/25(月) 09:46:340934デフォルトの名無しさん
2009/05/25(月) 11:12:49Foo::BarAとFoo::BarBは、まったく別のクラスなんだから、Fooだけでどちらも継承とかは出来ないよ
というより、Fooというのも、存在するならばクラスなわけだし。
あんまり難しく考えず、継承というのは複数のクラスから出来るものなのだから
一個でも複数でも指定できるようにしている
ってことで理解した方がいい。
コンテキストで配列かリファレンスか判断する、なんて処理を実装してるような言語なんだし。
あ、ここまで書いてて、>>932の勘違いした一つの理由がようやく分った。
(A, B, C, D) という書き方と、 qw(A B C D) という書き方はまったく同一だよ
qw|A B C D| でもいいよ。qw/A B C D/でもいい。
ようするにqwってのはスペース区切りでカッコ内を配列にするってだけ。
0935おしえてください。
2009/05/25(月) 12:38:42ttp://asakura.g.hatena.ne.jp/asakura-t/comment?date=20070405
ここに書いてあるようにやってもうまくいかない。
use SQL::Abstract::Fulltext::MySQL;
$rs = $rs->search({
-fulltext => {
-match => 'detail',
-against => $tag,
-boolean => 1,
},
});
とすると [SQL::Abstract::_where_op_in_hash] Fatal: unknown operator: -fulltext
と言われてしまう・・・
何が間違っているのでしょう?
0936デフォルトの名無しさん
2009/05/25(月) 20:26:56qw(A B C)
と等価なのは
('A', 'B', 'C')
だろ?分かってると思うけど
0937デフォルトの名無しさん
2009/05/25(月) 20:31:240938デフォルトの名無しさん
2009/05/25(月) 21:23:28quote wordsだろ確か。
らくだ本くらい読んどけ。
0939デフォルトの名無しさん
2009/05/25(月) 21:43:100940デフォルトの名無しさん
2009/05/25(月) 22:13:050941デフォルトの名無しさん
2009/05/25(月) 23:00:330942デフォルトの名無しさん
2009/05/25(月) 23:29:51教えていただけるとありがたいのですが、
perlで日本語の複数の漢字(utf8)のデータが入ったファイルを読み込んで、
unicodeのコード番号をそれぞれ別ファイルに書き込むということは可能でしょうか?
0943デフォルトの名無しさん
2009/05/25(月) 23:49:07可能です
0944デフォルトの名無しさん
2009/05/26(火) 09:25:342 [unknown (0x9A8)] perl 2328 _cygtls::handle_exceptions: Error while dumping state
(probably corrupted stack)
Segmentation fault (core dumped)
CygwinとPerlのどっちに問題があるんでしょうか?
そもそもPerlでスレッド使うのが間違ってるとか?
0945デフォルトの名無しさん
2009/05/26(火) 10:30:11ネイティブのperlで短いコードを書いてテストしてみればわかるかも知れないやろ。
0946デフォルトの名無しさん
2009/05/26(火) 14:29:54CMSで吐き出されたコードをきれいに整形したいと思っています。
行いたいことは、
吐き出されたコードから、ホワイトスペースの削除
空行の削除
再インデント
です。
どうかよろしくおねがいいたします。
0947デフォルトの名無しさん
2009/05/26(火) 14:34:49CPAN HTML 整形 でググった。
http://d.hatena.ne.jp/toritori0318/20090207/1234025307
こんなん出た。
まず自分で探してみた?
0948デフォルトの名無しさん
2009/05/26(火) 14:44:010949デフォルトの名無しさん
2009/05/26(火) 17:13:54やってみれ。っつーかHTMLのタグ1個分の正規表現書いてみれ。
それだけで力尽きるからww
0950デフォルトの名無しさん
2009/05/26(火) 18:22:07(1) 通常のassertマクロはリリース時には削除されるが、リリース時でも削除されないassertマクロの名前
(2) 与えられた文字列をエラーメッセージとして、強制終了するマクロの名前
お願いします。
0951デフォルトの名無しさん
2009/05/26(火) 18:24:52そして間違っているに一票。
0952950
2009/05/26(火) 18:26:160953デフォルトの名無しさん
2009/05/26(火) 20:13:170954デフォルトの名無しさん
2009/05/26(火) 22:40:560955デフォルトの名無しさん
2009/05/26(火) 23:29:05書いても書かなくてもいい部分が多すぎ
0956デフォルトの名無しさん
2009/05/27(水) 00:01:39とりあえずこれで行こう」なものが永続化しちゃったものですから〜
0957デフォルトの名無しさん
2009/05/27(水) 02:09:38不満が生じて新たな機能を盛り込む方法が強引だから、どんどんおかしくなった
どうせ人間が手が書いたりなんかしないし、という前提もある
0958デフォルトの名無しさん
2009/05/27(水) 06:54:58それはない。昔はみんな手で書いてたし、その頃から
HTMLはおかしくなってた。
HTMLはマークアップ言語だという前提を完全に無視して
シェア獲得のために独自拡張を競ったNetscape社とMicrosoft社が主犯格。
0959デフォルトの名無しさん
2009/05/27(水) 08:41:590960デフォルトの名無しさん
2009/05/27(水) 09:50:49いや、HTMLをSGML準拠にしようとする試みはずっと続けられてきた。
ただNetscape社とMicrosoft社は完全にこれらを無視。今に至る。
まあ、標準化されたものが実用を無視したものだったから仕方なかったのだけれども。
0961デフォルトの名無しさん
2009/05/27(水) 10:01:490962デフォルトの名無しさん
2009/05/27(水) 15:16:35tableタグとか便利なんだけど規格に無いし・・
0963デフォルトの名無しさん
2009/05/27(水) 18:54:000964デフォルトの名無しさん
2009/05/27(水) 19:17:060965デフォルトの名無しさん
2009/05/27(水) 19:24:19誰一人としてMSだけを責めていない罠。皆両方悪いと言うておる。
0966デフォルトの名無しさん
2009/05/27(水) 20:56:14#!/usr/bin/perl
open(IN,"test.txt");
while(<IN>){
@data = split(/[\s+]/, $_);
print "$data[0],$data[1],$data[2]\n";
}
close(IN);
#######################################
#test.txtの中身
1 2 3
4 5 6
10 11 12
13 14 15
###########
0967デフォルトの名無しさん
2009/05/27(水) 20:57:45splitを使っての区切り方がわかりません。
test.txtは桁数をそろえてデータが格納されており、
(test.txtは1行目と2行目の先頭に1個の空白があり二個の空白で数字が区切られている。
3行目と4行目は1個の空白で区切られている。)
>>966のスクリプトでは出力が以下のようになってしまいます。
,1,
,4,
10,11,12
13,14,15
この出力を
1,2,3
4,5,6
10,11,12
13,14,15
としたいです。
ちょっとあせってて日本語になっていないかもしれませんが
よろしくお願いします。。
0968デフォルトの名無しさん
2009/05/27(水) 21:07:38$_ =~ s/^\s+//;
my @data = split /\s+/, $_;
print "$data[0],$data[1],$data[2]\n";
}
0969デフォルトの名無しさん
2009/05/27(水) 21:12:53ああなるほど!!
ありがとうございます!!
0970デフォルトの名無しさん
2009/05/27(水) 23:05:390971デフォルトの名無しさん
2009/05/27(水) 23:07:32別解
#!/usr/bin/perl -w
print join(',', split), "\n" while <DATA>;
__DATA__
1 2 3
4 5 6
10 11 12
13 14 15
0972名無し募集中。。。
2009/05/27(水) 23:38:320973デフォルトの名無しさん
2009/05/28(木) 00:20:560974デフォルトの名無しさん
2009/05/28(木) 10:16:070975デフォルトの名無しさん
2009/05/28(木) 10:17:46ワンライナーに多用も何もないだろ。このくらいは充分許容範囲だと思うが。
0976デフォルトの名無しさん
2009/05/28(木) 10:20:400977デフォルトの名無しさん
2009/05/28(木) 13:54:130978デフォルトの名無しさん
2009/05/28(木) 21:12:090979デフォルトの名無しさん
2009/05/28(木) 21:27:56$ans = system("bin/popup.exe $mes");
みたいにして使う感じの
0980デフォルトの名無しさん
2009/05/28(木) 21:46:28どうせ1つだと判っている時に、
($tmp) = みたいに一旦リストで受けたり、
( )[0] みたいに全体を括弧でくくるのがなんか嫌だという時、
先頭の要素のスカラーとして評価させる書き方って無いのかな
shift?
0981デフォルトの名無しさん
2009/05/28(木) 21:52:13そのpopup.exeがどういうのか知らんが、メッセージを表示するだけ(入力なし)なら
$ans = system("msg.exe * $mes");
0982デフォルトの名無しさん
2009/05/28(木) 21:59:55ぜひ入力付きで実装して欲しかった > ゲイツ
0983デフォルトの名無しさん
2009/05/28(木) 22:55:540984デフォルトの名無しさん
2009/05/28(木) 23:15:29プロンプトを表示して文字列一つ入力させて帰ってくるだけの簡単な外部ツールくらい、
delphiあたりでマウスだけで1分で作れそうなものなのに
意外と作ってる人がいない
0985デフォルトの名無しさん
2009/05/28(木) 23:45:18あんま、言いたくない台詞だが、さすがに言いたくなった。
0986デフォルトの名無しさん
2009/05/29(金) 00:26:100987デフォルトの名無しさん
2009/05/29(金) 01:11:31やったな!! ヒーローになるチャンスじゃん!!
0988デフォルトの名無しさん
2009/05/29(金) 02:09:080989デフォルトの名無しさん
2009/05/29(金) 19:36:550990デフォルトの名無しさん
2009/05/29(金) 19:46:46(1)
<td width="35%" align="right"><div style="font-size:12px">37台</DIV></td>
<td width="35%" align="right"><div style="font-size:12px">400円</DIV></td>
<td width="40%" align="right"><div style="font-size:12px">1076個</DIV></td>
<td width="40%" align="right"><div style="font-size:12px">1/27</DIV></td>
このHTMLタグから「37」「400」「1076」「27」という4つの値を取得するにはどのようにすればよろしいでしょうか?
単位(台、円、個、1/)は無視です。
(2)
<img src="imgview.cgi?p=129900905271010/IMG090527/E/IAD0826M.PNG"></td>
<img src="imgview.cgi?p=129900905280910/IMG090528/E/IAD0826M.PNG"></td>
<img src="imgview.cgi?p=129900905291900/IMG090529/E/IAD0826M.PNG"></td>
同じく、src=の後のURLを取得するにはどのようにすればよろしいでしょうか?
(3)
(2)の「129900905271010」の部分は、6〜11桁目が年月日で、12〜15桁目が時間になっています。
この年月日と時間を取得したいのですがどのようにすればよろしいでしょうか…?
また、取得後に「年」はYYではなくYYYYの4桁に変換したいのですが…
桁数などは固定になっており、変動する部分は各数値です。
2日ほど前からPerlを使用し始めたばかりで、いまいち正規表現というものが理解できない状態です…
申し訳ありませんが、どうかよろしくお願い致します。
0991デフォルトの名無しさん
2009/05/29(金) 20:25:30規則性が無いようだから、個別に抜くのがよいのでは
$dai=$1 if /(\d+)台/;
$yen=$1 if /(\d+)円/;
$kosu=$1 if /(\d+)個/;
$bunbo=$1 if /1\/(\d+)/;
0992デフォルトの名無しさん
2009/05/29(金) 20:32:13my $str = <<'EOS';
<td width="35%" align="right"><div style="font-size:12px">37台</DIV></td>
<td width="35%" align="right"><div style="font-size:12px">400円</DIV></td>
<td width="40%" align="right"><div style="font-size:12px">1076個</DIV></td>
<td width="40%" align="right"><div style="font-size:12px">1/27</DIV></td>
EOS
while ($str =~ m|(?<=>)([^<]+)(?=</DIV>)|g) {
my $num = $1;
print $num =~ /^([0-9]+)[^0-9]*\z/ ? "$1 (単位)\n"
: $num =~ /([0-9]+)\z/ ? "(単位) $1\n"
: "無し\n"
;
}
print $str = join("\n", <<'EOS' =~ /\bsrc="([^"]+)"/g) . "\n";
<img src="imgview.cgi?p=129900905271010/IMG090527/E/IAD0826M.PNG"></td>
<img src="imgview.cgi?p=129900905280910/IMG090528/E/IAD0826M.PNG"></td>
<img src="imgview.cgi?p=129900905291900/IMG090529/E/IAD0826M.PNG"></td>
EOS
while ($str =~ m|\?p=[0-9]{5}([0-9]{10})/|g) {
my @date = $1 =~ /[0-9]{2}/g;
printf "%d年%d月%d日 %d時%d分\n", $date[0] + 2000, @date[1..4];
}
0993990
2009/05/29(金) 22:34:06レスありがとうございます。
共に動作確認致しました。
今回は、>>992の方法を取らせていただきます。
あと、もしよろしければ、今回のパターンの「m|(?<=>)([^<]+)(?=</DIV>)|g」のご説明をお願いできませんでしょうか?
「m|\?p=[0-9]{5}([0-9]{10})/|g」の方はなんとなくわかったのですが、上記のパターンがいまいち理解できません。
動作は正常動作するので問題ないのですが、お手数でなければご教授していただけませんでしょうか?
度々申し訳ありませんがよろしくお願い致します。
0994デフォルトの名無しさん
2009/05/29(金) 23:26:05いくらなんでも自分で調べりゃ分かる事だぞ・・・
「Perl 正規表現」で検索くらいはしたんでしょうね?
0995992
2009/05/30(土) 00:05:56'>' と '</DIV>' に挟まれた、一文字以上の '<' 以外の文字。
今回の処理内容だと先読み/後読み言明を使う必然性は無い。
うまいやり方を考えながら書いてた残骸で、結局キャプチャする
方向で収まったから m|>([^<]+)</DIV>|g で問題無い。
http://perldoc.jp/docs/perl/5.10.0/perlreref.pod
http://perldoc.jp/docs/perl/5.10.0/perlretut.pod
0996990
2009/05/30(土) 01:11:50ご説明ありがとうございます!
正規表現は難しい(ややこしい)ですね…慣れるまで時間がかかりそうです…
でも、分解していけばなんとなく分かってきたような気がします。
'>'は記号文字'>'が含まれ、
'([^<]+)' は記号文字'<'以外の文字にマッチし、
'</DIV>'はそのまま'</DIV>'にマッチする。
繋げると、
'>'にヒットし、'<'以外の1文字以上の文字にマッチして、'</DIV>'で終わる
という文字列にマッチするという感じですね。
結果、'>abcdef</DIV>'というような文字列にマッチする感じですね。
色々と調べてはいたのですが、複雑で理解にかなり時間がかかりました…
'|'は、'/'が本来では正規表現の書式(?)そのものに使用されるものですが、
'</DIV>'に、'/'が使用されているので'/'の代わりに'|'を使用するという情報にたどり着きました。
|を使用しない場合は m/>([^<]+)<\/DIV>/g という感じになると思います。
(間違っていれば指摘お願いします;)
この度は、とてもよい勉強になりました!
どうもありがとうございます。
0997デフォルトの名無しさん
2009/05/30(土) 06:16:42Perlについての質問箱 40箱目
http://pc12.2ch.net/test/read.cgi/tech/1243631674/
0998デフォルトの名無しさん
2009/05/30(土) 09:33:28乙
0999デフォルトの名無しさん
2009/05/30(土) 11:08:39乙
1000たまご ◆EGGMAN.HlI
2009/05/30(土) 11:08:5310011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。