Perlについての質問箱 41箱目
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2009/08/07(金) 03:03:00"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/08/07 現在の最新版: 5.10.0
▼ 前スレ
Perlについての質問箱 40箱目
http://pc12.2ch.net/test/read.cgi/tech/1243631674/
リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-6 あたり
0002デフォルトの名無しさん
2009/08/07(金) 03:03:43Perl プログラミング講座: 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/08/07(金) 03:04:24CPAN.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/08/07(金) 03:05:04# このレスは、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/08/07(金) 03:05:451 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/08/07(金) 03:06:2621 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/
39 http://pc12.2ch.net/test/read.cgi/tech/1234181856/
40 http://pc12.2ch.net/test/read.cgi/tech/1243631674/
0007デフォルトの名無しさん
2009/08/07(金) 07:25:46どこかおかしくはないでしょうか?
Perlについての質問箱 40箱目
http://pc12.2ch.net/test/read.cgi/tech/1243631674/232
232 名前:デフォルトの名無しさん[sage] 投稿日:2009/06/18(木) 16:48:15
---- test.pl ----
use strict;
require 'config.pl';
print config::param('hoge');
print config::param('fuga');
---- config.pl ----
package config;
use strict;
sub param {
return (
hoge => 'abcdefg',
fuga => '12345',
)[$_[0]];
}
1;
設定を1つに纏めたいなら、ourとか考えずに上記のようにしろ。
万が一の確立で、そんな面倒なソースがまわってきたら嫌だ。
0008デフォルトの名無しさん
2009/08/07(金) 08:01:38前スレで色々指摘されてんじゃん。
---- config.pl ----
package config;
use strict;
sub param { ${ { hoge => 'abcdefg', fuga => '12345' } }{$_[0]} ; }
1;
で動く様になるけど、、、
>>1乙
0009デフォルトの名無しさん
2009/08/07(金) 08:14:53�d
動きました。
0010デフォルトの名無しさん
2009/08/07(金) 10:20:010011デフォルトの名無しさん
2009/08/07(金) 10:49:17package config;
use strict;
sub param {
return {
hoge => 'abcdefg',
fuga => '12345',
}->{$_[0]};
}
1;
こういう事をしたかったんだろうね。
でもこれ呼び出す度に変数定義コストが掛かる上に例え同じkeyでも
違うアドレスの値を返すという駄目の見本のようなコード
0012デフォルトの名無しさん
2009/08/07(金) 10:54:29Perl6が出てから半年後ぐらいじゃないの?
0013デフォルトの名無しさん
2009/08/07(金) 14:16:58コスト?知らんがな。
0014デフォルトの名無しさん
2009/08/07(金) 15:13:10あんな人を馬鹿にした態度なんだろ。
あのレベルでPerlを生業としてるとはとても思えない。
0015デフォルトの名無しさん
2009/08/07(金) 15:36:15GetOptions使用時に
GetOptions( "startup|first!" => \$startup ,
のようにパイプラインが使われていることがあるのですが、
どういう意味があるのですか?
0016デフォルトの名無しさん
2009/08/07(金) 15:41:31http://search.cpan.org/dist/Getopt-Long/lib/Getopt/Long.pm#Options_with_multiple_names
001715
2009/08/07(金) 16:14:52ありがとうございます。
0018デフォルトの名無しさん
2009/08/07(金) 17:38:40ob_start();
print "aaa¥n"; #なにも表示されない
$output = ob_get_clean(); # $output eq "aaa¥n"
よろしくお願いします。
0019デフォルトの名無しさん
2009/08/07(金) 18:14:17Exporterを使うのかと思いましたが、できませんでした。
ためしたコード:
package Foo::Bar::Baz::MyClass;
use Exporter qw(import);
our @EXPORT_OK = qw(MyClass);
として、
use Foo::Bar::Baz::MyClass qw(MyClass);
my $obj = MyClass->new();
としましたが、Undefined subroutine &Foo::Bar::Baz::MyClass というエラーに成りました。
0020デフォルトの名無しさん
2009/08/07(金) 18:22:49オブジェクト指向について勉強しなおすといいと思うよ。
0021デフォルトの名無しさん
2009/08/07(金) 18:23:27STDOUTを書き換えればできたと思う。
ソース、おぼろげな記憶。
0022デフォルトの名無しさん
2009/08/07(金) 18:25:150023デフォルトの名無しさん
2009/08/07(金) 18:35:39ファイルに退避させることはできるな。
#!/usr/bin/perl
*TAIHI = *STDOUT;
open(IN, '>/tmp/foo');
*STDOUT = *IN;
print "hello, world!\n";
*STDOUT = *TAIHI;
print "hi, there!\n";
メモリに退避する方法は良く分からん。open2使ったけど
うまくいかんかった。
0024デフォルトの名無しさん
2009/08/07(金) 18:49:03use IPC::Open2;
*TAIHI = *STDOUT;
$pid = open2(\*OUT, \*IN, 'cat');
*STDOUT = *IN;
select STDOUT;
print "hello, world!\n";
*STDOUT = *TAIHI;
close(IN);
print "hi, there!\n";
$output = join("", <OUT>);
print $output;
こうか。結構めんどいな。つーかINとOUTを逆にしてて動かないだけだった。
0025デフォルトの名無しさん
2009/08/07(金) 18:49:470026デフォルトの名無しさん
2009/08/07(金) 18:53:10use strict;
my $buffer;
sub ob_start
{
open(MEM, ">", \$buffer) or die;
select(MEM);
}
sub ob_get_clean
{
select(STDOUT);
return $buffer;
}
ob_start();
print "hogehoge\n";
print ob_get_clean();
0027デフォルトの名無しさん
2009/08/07(金) 19:04:28うおーそれ見ると俺完全にズレてるな。精進しねーと。thx。
0028デフォルトの名無しさん
2009/08/07(金) 20:47:08どうもありがとうございます。さっそく試してみます。
0029デフォルトの名無しさん
2009/08/07(金) 20:49:04ob_get_clean()のなかでMEMをcloseしてないようですが、close(MEM) をいれたほうがいいですか。
それともなくてもかまわないでしょうか。
0030デフォルトの名無しさん
2009/08/07(金) 21:29:32Data::Dumperの表示は
$VAR1 = [
'A',
'B'
];
こんなかんじなので、['A', 'B'] みたいにコンパクトに表示してくれるライブラリを探しています。
ちょうどRubyのinspectみたいなのが希望です。
0031デフォルトの名無しさん
2009/08/07(金) 22:05:05ttp://search.cpan.org/~ovid/aliased/
>30
$Data::Dumper::Indent = 0;
0032デフォルトの名無しさん
2009/08/07(金) 22:24:17さんくすです
0033デフォルトの名無しさん
2009/08/08(土) 11:16:10Perlベストプラクティス - Yahoo!オークション
http://page11.auctions.yahoo.co.jp/jp/auction/n73044025
0034デフォルトの名無しさん
2009/08/08(土) 11:44:140035デフォルトの名無しさん
2009/08/08(土) 18:17:21何か仕様変わったんですかね?
0036デフォルトの名無しさん
2009/08/12(水) 13:57:10%hash = (hash-key1 => 0, hash-key2 => 2);
print keys %hash; #=> 0
0037デフォルトの名無しさん
2009/08/12(水) 14:12:15文字列は0だから、0 - 0で0。hash-key2も同じ。
0038デフォルトの名無しさん
2009/08/12(水) 14:12:590039デフォルトの名無しさん
2009/08/12(水) 14:19:12�d
0040デフォルトの名無しさん
2009/08/13(木) 20:17:58スクリプト対策されたんじゃね?
もしくはHTTPヘッダを精査されてるとか
リファラーがないと無効なページがあるとか?
0041デフォルトの名無しさん
2009/08/14(金) 14:57:59$tripkey = substr($tripkey,1);
$salt = substr($tripkey.'H.',1,2);
$salt =~ s/[^\.-z]/\./go;
$salt =~ tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/;
$trip = crypt($tripkey,$salt);
$trip = substr($trip,-10);
$trip = '◆'.$trip;
print "$trip";
この3行目は
$tripkeyとH.を連結したものから2文字目と3文字目を取り出して
代入しているということなのですか?
0042デフォルトの名無しさん
2009/08/14(金) 18:36:05【堅牢】トリップの新方式を考えてみませんか【互換性】 ★2
http://qb5.2ch.net/test/read.cgi/operate/1245724530/l50
0044デフォルトの名無しさん
2009/08/14(金) 20:03:13そう。だから$saltにはstがはいってる。
なんでH.を連結してるのかよくわからんけど
0045デフォルトの名無しさん
2009/08/15(土) 16:52:33分けたいのですが、どうすればいいでしょうか?
$text = "abcひらがなdef漢字ghiハンカクjkl";
(asciiとそうでない文字に分ける処理)
(例えば順に@textに格納)
@textに、("abc", "ひらがな", "def", "漢字", "ghi", "ハンカク", "jkl")が入っている。
0046デフォルトの名無しさん
2009/08/15(土) 17:55:49decodeしてsplitして必要なら先頭要素を読み飛ばして再度encode
0047デフォルトの名無しさん
2009/08/16(日) 11:12:17なってしまいます。
どうすれば半角カタカナをうまくmime_encodeできるでしょうか?
http://isoya.at.webry.info/200801/article_5.html
use Encode;
my $text = qq{ハンカクカタカナ};
# cp932 => MIME-Header-ISO_2022_JP
Encode::from_to($text, 'cp932', 'MIME-Header-ISO_2022_JP');
print $text, "\n";
# MIME-Header-ISO_2022_JP => cp932
Encode::from_to($text, 'MIME-Header', 'cp932');
print $text, "\n";
0048デフォルトの名無しさん
2009/08/16(日) 13:55:26UTF-8なMIMEヘッダに対応してないMUAがありそうな気もするけど
# cp932 => MIME-Header-ISO_2022_JP
Encode::from_to($text, 'cp932', 'MIME-Header-ISO_2022_JP');
↓
# cp932 => MIME-Header
Encode::from_to($text, 'cp932', 'MIME-Header');
0049デフォルトの名無しさん
2009/08/16(日) 15:57:38utf8でブロック使え。あるいはEUC-JPで\x20-\x7F拾え。
>>47
ISO-2022-JPに半角カナなんてないから。
それで半角カナにエンコードできる実装はカス(それが読めるメーラーも含めてな)。
0050デフォルトの名無しさん
2009/08/16(日) 17:31:45use Encode qw(decode encode);
my $text = "abcひらがなdef漢字ghiハンカクjkl";
my $code = "cp932";
my $text_utf8 = decode($code, $text);
my @text;
push @text, encode($code, $1) while( $text_utf8 =~ /(\p{InBasicLatin}+|[^\p{InBasicLatin}]+)/g );
0051デフォルトの名無しさん
2009/08/17(月) 00:29:28がちがちに防御した書き方しなくても、
perlが手抜きしてなければ動くのに
0052デフォルトの名無しさん
2009/08/17(月) 01:55:470053デフォルトの名無しさん
2009/08/17(月) 08:10:54binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
my $jp; ←DBから引っ張ってきたベタUTF-8(のはず)
utf8::decode($jp); # これがあってもなくても
"$jp 日本語\n"; # 文字化けする。
"$jp"; # 大丈夫
"日本語"; # これも大丈夫
XML::RSSでおかしくなります。助けてください。
0054デフォルトの名無しさん
2009/08/17(月) 08:41:38> "$jp 日本語\n"; # 文字化けする。
> "$jp"; # 大丈夫
> "日本語"; # これも大丈夫
日本語がEUCかSJISになってる
0055デフォルトの名無しさん
2009/08/17(月) 08:44:50>>49-50
ありがとうございます。
utf8にdecodeしてから処理すればいいんですね。
0056デフォルトの名無しさん
2009/08/17(月) 09:05:20$jpが本当にUTF-8かあやすぃ
jcode.plとか何でもいいけど
文字コードをちゃんと調べてみるべき
0057デフォルトの名無しさん
2009/08/17(月) 09:58:26無理やりするなら、JISコードにして自分でbase64エンコードするとか。
use Encode;
my $text = qq{ハンカクカタカナ};
# cp932 => MIME-Header-ISO_2022_JP
Encode::from_to($text, 'cp932', '7bit-jis');
use MIME::Base64;
$text = '=?ISO-2022-JP?B?' . encode_base64($text, "") . '?=';
print $text, "\n";
# MIME-Header-ISO_2022_JP => cp932
Encode::from_to($text, 'MIME-Header', 'cp932');
print $text, "\n";
0058デフォルトの名無しさん
2009/08/17(月) 09:59:51vimでutf8モードで保存してます。
>>56
確認済みです。ちなみにprintだとutf8と混在で表示できてます。
printだとうまく行くんですが、XML::RSSだと通らないという
不思議な現象に悩まされてます。
そもそもXML::RSSが実体参照を吐いて生UTF-8を吐いてくれません。
0059デフォルトの名無しさん
2009/08/17(月) 10:04:49なんか不思議なことしてないか?
0060デフォルトの名無しさん
2009/08/17(月) 15:56:11何がしたいのかさっぱり分からん・・・・。
ISO-2022-JPは半角カナ含まないっつってるのに宣言してるし、
EncodeのMIME-Headerを根本的に勘違いしてる気がするし、
それじゃデコードしても文字化けするだけだと思われ。
0061デフォルトの名無しさん
2009/08/17(月) 17:06:58その1。
Tkアプリで起動時に、「初期化中です」的なミニウィンドウを
メインウィンドウの前に表示して、終わったら消したいので
Toplevelを置いたのですが。
focusしてToplevelのタイトルバーは青く(アクティブに)なるのに、
肝心のウィンドウ本体がメインウィンドウに隠れてしまいます。
use strict;
use warnings;
use Tk;
use Win32; # …その2で追加
my $w = new MainWindow;
$w->Toplevel->focus;
Win32::MsgBox('nullpo'); # …その2で追加
MainLoop;
その2。
あと、試しに上のコードを書いてだめな後に、Win32のメッセージボックスを
おまけ的にくっつけてみたのですが、これを実行すると先に「nullpo」が
出てから、TkのToplevelにメインウィンドウが重なって出てきます。
その1でToplevelをちゃんとメインウィンドウの上に表示する方法と、
その2で実行順が一見逆転する理由が知りたいです。
環境:WindowsXP SP3、ActivePerl 5.8.1、Tk::VERSION 800.024
006261
2009/08/17(月) 17:51:11my $w = new MainWindow;
$w->update;
my $aho = $w->Toplevel;
$aho->focus;
$aho->update;
Win32::MsgBox('・ω・');
MainLoop;
newした後で逐一updateしないと画面には出ないみたいですね。
画面に出せば順番に重なるっと。すいませんでした。
0063デフォルトの名無しさん
2009/08/17(月) 19:41:48試しに、>>57でエンコードしたのをWindows Live MailやGmailで受信してもうまくデコートして
半角カナを表示した。
メール業界的には半角カナを認めてるってことか?
0064デフォルトの名無しさん
2009/08/17(月) 20:54:34浮気相手の子供だから認知しない、と言われても
生まれてしまった子は育てないわけにはいかないだろ。
0065デフォルトの名無しさん
2009/08/17(月) 21:09:16日本語を知らないヤツらが日本語の規格を決めたのだから使い勝手が悪いのは仕方ない。
そこでマイクロソフトはSI/SOコードで半角カナに切り替えられるよう拡張した。
このISO_2022_JP_MSは、マイクロソフトという一企業のローカルルールなわけだから
他のOS(UNIXとか・・・)が従う義務は当然無い。
しかし、デスクトップ アプリケーション分野でメシを食ってる企業にとって
Windowsという巨大市場を無視するわけにはいかない。
認めるとか認めないとか、そういう以前に
半角カナは、今そこにあるわけだから。
半角カナを捨てるということは、Windowsを捨てることと同じなんだよ。
0066デフォルトの名無しさん
2009/08/17(月) 21:29:090067デフォルトの名無しさん
2009/08/18(火) 02:37:03print "ok\n" if (0) or (1); #=> ok
これが直感的な答えと違う動作をするような気がしてたのですが
0068デフォルトの名無しさん
2009/08/18(火) 02:55:18if 修飾子は制御構造。or は演算子。基本からやり直せ。
http://perldoc.jp/docs/perl/5.10.0/perlsyn.pod
http://perldoc.jp/docs/perl/5.10.0/perlop.pod
0069デフォルトの名無しさん
2009/08/18(火) 03:02:540070デフォルトの名無しさん
2009/08/18(火) 03:22:40違うんです
Perl のパーサの仕様でif文の後に(が来た場合に予期しない動きをすることがあると思い込んでたんです
で、実験をしてみたところ予想に反してうまく動いたので何か他のものと勘違いしてたのではないかという結論に至ったのです
そんでうまく絞り込めるような検索ワードが思いつかなかったのでここで聞いてみたのです
何か心当たりないですか?
0071デフォルトの名無しさん
2009/08/18(火) 04:36:42あるわけないだろw
if (0); としてしまうと or が成り立たなくなるため 0 or 1 と解釈するしかない思います。
今手元にはないから確かめられないけど、Perlってのはそんなもんです。
つーかコンパイルフェーズで制御構造も演算子も全部畳み込まれるよ
検索はしても、パーサーの詳細なんてきっと出てきません。
あえて言うならドキュメントのどっかに書いてあるかもしれません
0072デフォルトの名無しさん
2009/08/18(火) 04:42:38ファイルから読み込んだ文字列を出力するのですが、その際能やソ等の文字を能\、ソ\という風に置き換えたい、
そういう時はどういう風に記述すればいいですか?
$str =~ s/[〜]\\/\\\\/;
こういう記述で書けば良いと言う事はなんとなく分かるのですが[]の中身が分かりませんでした。
検索してみてもヒットする量が膨大すぎて思うような回答を見つけることが出来ませんでした。
0073デフォルトの名無しさん
2009/08/18(火) 06:12:43my @char_5c =
qw(― ソ Ы �\ 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄 兔
喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 �x �x �\ �\ );
my $re_5c;
$re_5c .= "\Q$_\E|" for @char_5c;
chop $re_5c;
my $str = "〜〜〜〜";
$str =~ s/($re_5c)/$1\\/g;
0074デフォルトの名無しさん
2009/08/18(火) 06:50:48これ↓でどうだろう?
$str =~ s/([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])/
my $c = $1; $c =~ \/.\\\/ ? "$c\\" : $c/eg;
0075デフォルトの名無しさん
2009/08/18(火) 07:00:04http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
何に出力するのにそんな付け足しが必要なのかは分からんが
0076デフォルトの名無しさん
2009/08/18(火) 07:14:53おま・・・・・。
半角カナは弊害が多すぎて日本人の権威たる村井先生達がわざわざISO-2022-JPから
削っていただいてくれたわけだが。
それでも使う馬鹿や使える馬鹿クライアントが多いから困ってるわけだが。
ちなみにWindows用のクライアントの一部はISO-2022-JPを騙ってjis-7bitなぞ認識しないぞ。
相手が読めない可能性があるメール送るのは阿呆のすること。
そんなに半角カナ使いたければ添付ファイルにでも放り込んでおけ。
Windowsはcp932使ってるからISO-2022-JPの議論とは全く別。
>>72
んなことする前にEncode覚えろ。
0077デフォルトの名無しさん
2009/08/18(火) 07:17:03Unicodeには半角カナあるからな(文字コードが字幅を制限するってのが
いまいち理解に苦しむが)。
0078デフォルトの名無しさん
2009/08/18(火) 08:49:310079デフォルトの名無しさん
2009/08/18(火) 09:41:36研究室に小森っきりで実社会を知らないヤツのオナニーに付き合わされちゃタマランよ。
0080デフォルトの名無しさん
2009/08/18(火) 10:28:20今は "$dirname/$filename" としているのですが、これはWindowsでも期待通りに動きますか。
ちなみに「perl join」でぐぐったら、配列のjoinばかりでてきました(当然か)。
よろしくお願いします。
0081デフォルトの名無しさん
2009/08/18(火) 10:45:03日本語の文字コードは滅茶苦茶で先人達はほんと何やってたんだよって感じ。
負の遺産押し付けないで欲しいわ〜。こんなのでもなんとか扱えるように
perlがんばったなとは思うけど。
0082デフォルトの名無しさん
2009/08/18(火) 11:26:17http://search.cpan.org/dist/perl/pod/perlport.pod#Files_and_Filesystems
> DOS, OS/2, VMS, VOS, and Windows can work similarly to Unix with / as path
> separator, or in their own idiosyncratic ways
0083デフォルトの名無しさん
2009/08/18(火) 11:42:53http://ja.wikipedia.org/wiki/ISO-2022-JP
でも読んでろ。業界の常識だぞ。
>>81
〜は、そもそも全角チルダなのに字形が同じという阿呆な理由でMicrosoftが波ダッシュに割り当てたのが
問題の始まり。UN*X系やMacOSのIMEはきちんと対応してる。
まあこれは、縦書きの波ダッシュの字形を間違えて横書きに適応したUnicode策定側にも
責任があるが。つーわけで現状、波ダッシュと全角チルダが混在してる状況なのでいつか大変なことになると思われ。
WindowsはVistaから波ダッシュと全角チルダが見分けが付かなくなるようになったので、
水面下で問題は進行する。
つーかなんだかんだいってコガイダンはすげーよ。
0x5c問題(半角円記号問題)もMicrosoftがISO/IEC 646と純正ASCIIを混同したのが原因。
まあこれは歴史的に仕方ないと思うが。さすがにPerlも含むコンパイル等が動かないと困るので、
0x5cは円記号でもバックスラッシュでもあるという不思議な状況がこれからも続くと思われ。
スレチスマソ。
0084デフォルトの名無しさん
2009/08/18(火) 11:57:22thank you very much.
もうひとつ質問です。
["foo", ["bar", ["baz"]]]
を
["foo", "bar", "baz"]
に展開してくれるような関数はありませんか。
「perl flatten」でぐぐったけどそれらしいのは見つからず。
0085デフォルトの名無しさん
2009/08/18(火) 12:10:32再帰使いたかったからこんなん書いてみた。
#!/usr/bin/perl
use Data::Dumper;
$var = ["foo", ["bar", ["baz", 'buz'], ['baa',['foobar']]]];
print Dumper [ flatten($var) ];
sub flatten{
my($var) = @_;
my @foo;
map {ref eq 'ARRAY' ? flatten($_) : $_} @$var;
}
0086デフォルトの名無しさん
2009/08/18(火) 12:10:37Perlの調べ物にGoogleなんかを使うから見つからんのだ
http://search.cpan.org/search?query=flatten
0087デフォルトの名無しさん
2009/08/18(火) 12:16:12http://search.cpan.org/~obradovic/List-Flatten-0.01/lib/List/Flatten.pm
俺のコードの劣化版でワロタ。
0088デフォルトの名無しさん
2009/08/18(火) 12:26:36ソース見たら、これだけだねw
sub flat(@) {
return map { ref eq 'ARRAY' ? @$_ : $_ } @_;
}
これを再帰させて中まで展開すれば>>84の答になるか
sub flat(@) {
return map { ref eq 'ARRAY' ? flat(@$_) : $_ } @_;
}
0089デフォルトの名無しさん
2009/08/18(火) 12:27:540090デフォルトの名無しさん
2009/08/18(火) 12:46:58おおーさんくすです。
0091デフォルトの名無しさん
2009/08/18(火) 13:01:19my @foo; はどんな意味があるんですか?
0092デフォルトの名無しさん
2009/08/18(火) 14:21:34残骸です。見なかったことにしてください。
0093デフォルトの名無しさん
2009/08/18(火) 14:35:44了解
0094デフォルトの名無しさん
2009/08/18(火) 14:47:06>sub flat(@) {
>return map { ref eq 'ARRAY' ? flat(@$_) : $_ } @_;
>}
map にわたす { } では、配列とスカラのどちらを返すべきなんでしょうか。
flat(@$_) だと配列だし、$_ だとスカラですよね。
どっちでもいいということ?もしそうだとして、コンテキストはスカラと配列のどちらになるんでしょう?
Perl勉強中につき、ヘルプミー
0095デフォルトの名無しさん
2009/08/18(火) 15:19:29perldoc -f map に書いてあるよ。
mapはリストコンテキストで評価される。
つまりmapの { } が返すのは、スカラーでも、配列でも、ハッシュでもなんでもok
最終的にぜんぶフラットに連結されて1つのリストになる。
0096デフォルトの名無しさん
2009/08/18(火) 15:24:23つまり map の { } のなかで $_ (スカラー)を返しても、それはリストコンテキストで評価されるから、
結局は ($_, ) とみなされる、ということですね。なるほど。
ありがとうございました。
0097デフォルトの名無しさん
2009/08/18(火) 15:28:36> 0x5c問題(半角円記号問題)もMicrosoftがISO/IEC 646と純正ASCIIを混同したのが原因
嘘は良くない
0098デフォルトの名無しさん
2009/08/18(火) 16:46:51my $tmp_os_info = $^O;
この記述の $^O; とはいったい何を表しているんでしょうか?
ビット演算で ^ を使うというのまでは分かったんですが、そのような動きを
していそうにも見えません。
0099デフォルトの名無しさん
2009/08/18(火) 16:49:470100デフォルトの名無しさん
2009/08/18(火) 17:02:252.正規表現を使わずに文字列を検索する
0101デフォルトの名無しさん
2009/08/18(火) 17:09:450102デフォルトの名無しさん
2009/08/18(火) 17:29:02ありがとうございます!
0103デフォルトの名無しさん
2009/08/18(火) 18:07:00のように、クロージャ(?) をとる関数はどうやって定義すればいいですか。
0104デフォルトの名無しさん
2009/08/18(火) 18:30:09その実社会を知らないオナニー野郎呼ばわりの村井純がいなければ、
今の日本のインターネットは無いも同然なわけだが…。
ってか、色々な官庁や巨大な電話業界と戦って、通信回線にデータを
流すことを認めさせ、さまざまな組織を回線で繋いでネットワークを
作っていったわけで、道の無いところに道を開いてきたというか、
めちゃくちゃ実践派だぞ?
まあ、アプリケーション層の人間から見れば、また違った感想なのかも
しれないけど。
0105デフォルトの名無しさん
2009/08/18(火) 18:34:59プロトタイプで&
List::UtilモジュールのList/Util/PP.pmとか参考にするといいんじゃないかな。
0106デフォルトの名無しさん
2009/08/18(火) 21:59:56配列の配列をデバッグ出力したいんですけど。
0107デフォルトの名無しさん
2009/08/18(火) 22:54:040108デフォルトの名無しさん
2009/08/18(火) 23:05:26ありがとうございます。
0109デフォルトの名無しさん
2009/08/19(水) 01:47:22正規表現を使うか
indexとsubstrで抽出するかって感じ
普通に正規表現が簡単
0110デフォルトの名無しさん
2009/08/19(水) 01:51:30Data::Dumper より YAML のが便利
タイプが少ないしなによりログ取りたいときに出力が簡単
0111デフォルトの名無しさん
2009/08/19(水) 09:24:47Web::Scraper。
>>104
最近の若いのは村井純(とその大いなる功績)も知らないのな。
ISO-2022-JPから半角カナを省いたのはどう考えても正解だろ。
半角カナなんて弊害ばかりで互換性とAA以外に何か存在意義があるわけ?
0112デフォルトの名無しさん
2009/08/19(水) 10:18:56TE: deflate,gzip;
が勝手に付加されてしまい、レスポンスがgzip圧縮で返ってきてしまいます
gzipの変換で不要なトラブルに遭いたくないのでTE: deflate,gzip;を付加しないようにしたいのですが、どうすればよいでしょうか
0113デフォルトの名無しさん
2009/08/19(水) 10:53:41結局規格なんか決めても世の中が従わなかったら失敗なんだよな。
混乱がよけいひどくなっただけ、という見方もできる。そしてこれだけの
AAが生み出された今となってはAAを保存できないISO-2022-JPは
イマイチだな。過去の遺物でいんじゃね?
0114デフォルトの名無しさん
2009/08/19(水) 10:56:30そいつがAA級戦犯か!
0115デフォルトの名無しさん
2009/08/19(水) 11:21:30use LWP::UserAgent;
push(@LWP::Protocol::http::EXTRA_SOCK_OPTS, SendTE => 0); #最初に実行しとく
ネットで見つけて使ってるけど、これでほんとにいいのか俺もよくわかってないw
0116デフォルトの名無しさん
2009/08/19(水) 11:30:50サンクスです。プロトタイプなんてPerlにあるんですね。
0117デフォルトの名無しさん
2009/08/19(水) 14:15:16世の中は一部を除いて従いませんでしたよ。GmailでAA送ってみ。
つーかISO-2022-JPで半角カナ使う人間がどれだけ馬鹿にされてきたか知らないんだな。
顔文字程度ならともかくいわゆるAAは特定のフォントセット・ポイント数で見られることを前提としてるから、
いまやPC同士メールくらいにしか用途がなく、等幅フォントや任意のポイントで見られる場面が
比較的多いISO-2022-JPとは無関係の世界だろ。
>>114
だれうま。
0119デフォルトの名無しさん
2009/08/19(水) 16:40:05■html側(shift_jis)
<form action="bbs.cgi" method="post">
<textarea name="comment" rows=4 cols=30></textarea>
<input type=submit value=発言>
</form>
↓「あいうえお」と入力
■bbs.cgi(EUC_JP)
use CGI;
$query = CGI->new;
@params = $query->param();
foreach $param (@params) {
$in{$param} = $query->param($param);
}
↓
$in{comment}の中身は「??????????」
のような動作になってしまいます。
URLエンコード/デコードのせいかと思ったのですが、受け取り時点でこんな化け方をされるとどうすれば良いのやら……
何か解決法は無いでしょうか。
0120デフォルトの名無しさん
2009/08/19(水) 17:17:35携帯を持ってないから確認できないや。
0121デフォルトの名無しさん
2009/08/19(水) 17:45:07>>1
0122デフォルトの名無しさん
2009/08/19(水) 17:54:51携帯はキャリア内ならそのまま出せるんじゃないかな?
RFCに準拠しないメールアドレスとかもOKなぐらいだし。
PCのメーラーは、全角カナに変換してから送信とかが
多いような気がするけど。
>>111
ついでにAAも頼む。
0123デフォルトの名無しさん
2009/08/19(水) 18:11:59おうふ
申し訳ない、いってきます
0124デフォルトの名無しさん
2009/08/19(水) 19:35:06たとえば map() という名前の関数を組み込み関数とは別の用途で使いたくて、sub map ... と上書き定義したのですが、
その場合にもとの組み込み関数をどうやって呼び出すかがわかりません。
ちなみにPythonだと組み込み関数を上書きしても、もとのを __builtins__.map() のような感じで呼び出せるので、
同じことがPerlでもできるのではないかと思い、質問しました。
0125デフォルトの名無しさん
2009/08/19(水) 19:49:53http://search.cpan.org/dist/perl/pod/perlsub.pod#Overriding_Built-in_Functions____
> To unambiguously refer to the built-in form, precede the built-in name with
> the special package qualifier CORE::. For example, saying CORE::open() always
> refers to the built-in open(), even if the current package has imported
> some other subroutine called &open() from elsewhere.
0126デフォルトの名無しさん
2009/08/19(水) 21:08:33read()
という関数を呼び出すとき、
&read()にすると自作関数
read()にすると組み込み関数が呼び出される
0127デフォルトの名無しさん
2009/08/19(水) 21:53:38CORE::hoge でもいけるよ
0128デフォルトの名無しさん
2009/08/19(水) 23:41:28&mapとmap()は別に認識されるのでは?
0129デフォルトの名無しさん
2009/08/20(木) 04:40:38あと、宣言位置がおかしくてもむりくり呼び出される仕様。
間違ってたらすまん。
0130デフォルトの名無しさん
2009/08/20(木) 08:37:17再現させてみてないけど、ちょっと前C書いてた手癖で
sub xxx(){ ... } って書いちゃったけど普通に引数受け取ってたってことがあったな。
これって仕様か?
0131デフォルトの名無しさん
2009/08/20(木) 11:36:26ありがとうございました。CORE::map() で呼び出せました。
0132デフォルトの名無しさん
2009/08/20(木) 11:50:35このとき、f { } arg ではなくて f arg { } のように、クロージャを
最後の引数にしたいのですが、どうやったらできるでしょうか。
たとえば、クロージャを最初の引数にとるような関数は定義できたのですが、
sub f (&$) {
my ($code, $arg) = @_;
$_ = $arg;
&{$code}();
}
f { print "arg=$_¥n" } 123; #=> arg=123
こうではなくて、クロージャを最後の引数にするような関数が定義できません。
(定義して呼び出そうとすると syntax error になりました)。
sub g ($&) {
my ($arg, $code) = @_;
$_ = $arg;
&{$code}();
}
g 123 { print "arg=$_¥n" }; #=> syntax error
よろしくお願いします。
0133デフォルトの名無しさん
2009/08/20(木) 12:14:38perlsub(1)より。
An "&" requires an anonymous subroutine, which, if passed as the first argument,
does not require the "sub" keyword or a subsequent comma.
「if passed as the first argument」だから、subと「,」を省略できるのは最初の引数の
ときだけ。
0134デフォルトの名無しさん
2009/08/20(木) 13:30:36了解しました。ありがとうございます。
0135デフォルトの名無しさん
2009/08/20(木) 13:55:12もしそうなら、'**/*.pm' のような書き方をサポートした関数やライブラリがあればおしえてください。
0136デフォルトの名無しさん
2009/08/20(木) 14:02:44http://search.cpan.org/dist/makepp/Mpp/Glob.pm#Mpp::Glob::zglob
0137デフォルトの名無しさん
2009/08/20(木) 15:24:28ありがとうございます。
0138デフォルトの名無しさん
2009/08/20(木) 21:25:52sub hoge($$){ ($hoge, @huga) = @_; …
でパッケージ内でしか呼び出さんかったら普通に動いて
パッケージ外で呼び出すと@hugaには第三引数しか入らんというわけわからん仕様につい最近悩まされた記憶がある
0139デフォルトの名無しさん
2009/08/20(木) 23:34:50ここで聞いてよいかいまいちわかりませんが・・・
現在、Perl+XercesでXMLを処理しています。
XMLデータが変数(ex. $xml)に文字列として格納されている場合、
それをDOMParserに渡して、パースする方法を
教えていただけないでしょうか。
$parse = XML::Xerces::DOMParser->new();
$parse->parser($xml);
こう書いてしまうと、上手くパースしてくれず、
InputSorce系のクラスを使えばパースできるような記述までは
JAVAやCのソースから推測できるのですが、
Perlについての記述が少なすぎて、
どう使ってよいのか(書式やクラスの指定など)
分からず悩んでいます。
0141デフォルトの名無しさん
2009/08/21(金) 13:33:290142デフォルトの名無しさん
2009/08/21(金) 18:24:05foreach (@{$aaa->{verkanri}}) {
$aaa->{$_."_ver"} = [];
$aaa->{$_."_cmt"} = [];
}
上記の処理について質問があります。
まずaaa->{verkanri}にqwで囲まれた文字列たち"zip-open"、"folder-check"、"start-up"、"close-out"が
格納されるのは分かるのですが、その後の処理にて
$_に"zip-open"、"folder-check"、"start-up"、"close-out"が順番に格納され
$aaa->{zip-open_ver} = []
$aaa->{zip-open_cmt} = []
$aaa->{folder-check_ver} = []
$aaa->{folder-check_cmt} = []...
となりますよね、でもperlって変数にハイフンを使うことが出来ないはず。
なにか特殊な規則でもあるのでしょうか?
0143デフォルトの名無しさん
2009/08/21(金) 18:28:32$aaa->{bbb} = [];
$aaa->{"bbb"} = [];
上記2つの違いは何なのでしょうか?
0144デフォルトの名無しさん
2009/08/21(金) 18:39:15"を省略しただけ
0145デフォルトの名無しさん
2009/08/21(金) 19:24:14変数名にはハイフンを使えないが、ハッシュのキーにはそのような制限は無い。
0147139
2009/08/21(金) 23:56:56$mem = XML::Xerces::MemBufInputSource->new("$xml",length($xml));
を追加して
$memをパーサに食べさせれば無事パースできました。
0148デフォルトの名無しさん
2009/08/22(土) 01:24:47同一の添え字となる要素両方を用いた適当な条件をテストし、
パスしたものだけを、それぞれ、@passed_s, @passed_tに格納する、
というようなフィルタをスマートに書くにはどうしたもんですかね。
考えたのは、
my @source_s = (0..9); my @source_t = reverse(0..9);
を例として、
use List::MoreUtils qw(pairwise);
my @conditions = pairwise { $a * $b > 15 ? 1:0 } @source_a, @source_b;
my @passed_s = map { $conditions[$_] ? $source_s[$_]:() } 0..$#conditions;
my @passed_t = map { $conditions[$_] ? $source_t[$_]:() } 0..$#conditions;
とか、
my @temp = map { $source_s[$_] * $source_t[$_] > 15 ? [$source_s[$_], $source_t[$_]]:() } 0..$#source_s;
my @passed_s = map $_->[0], @temp;
my @passed_t = map $_->[1], @temp;
@passed_a = (3, 4, 5, 6); @passed_b = (6, 5, 4, 3); # この例での結果
配列のスキャン回数、perlの苦手な添え字式アクセス、表面上のコード行数、中間変数
これらをバランスさせるような書き方はないでしょうか。
0149デフォルトの名無しさん
2009/08/22(土) 01:26:38でした。
0150デフォルトの名無しさん
2009/08/22(土) 01:37:17形式でデータを持っておいて、
my @passed_st = grep $_->[0] * $_->[1] > 15, @source_st;
てするのがいいんだろうな、きっと。
0151デフォルトの名無しさん
2009/08/22(土) 06:26:07my @src_s = (0..9);
my @src_t = reverse @src_s;
my @num = grep $src_s[$_] * $src_t[$_] > 15, 0..$#src_s;
my @pass_s1 = @src_s[@num];
my @pass_t1 = @src_t[@num];
my(@pass_s2, @pass_t2);
for (grep $src_s[$_] * $src_t[$_] > 15, 0..$#src_s) {
push @pass_s2, $src_s[$_];
push @pass_t2, $src_t[$_];
}
0152デフォルトの名無しさん
2009/08/22(土) 13:32:03配列スライスでできそうに思っていたけど、思いつかなかったんだ。
ありがとう。
頭が錆びてきているのかな。。。
0153デフォルトの名無しさん
2009/08/23(日) 19:12:470154デフォルトの名無しさん
2009/08/26(水) 11:30:57use strict;
my $func_name = 'plus';
print Foo->$func_name(1, 2); #=> 3
package Foo;
sub plus { shift; $_[0] + $_[1] }
0155デフォルトの名無しさん
2009/08/26(水) 12:24:55というのも、requireでいくつかのサブスクリプトに分散してサブルーチンを作っているんですが、
サブルーチンへの分岐がスルーされるという現象に見舞われています。
ところが、requireの記述の順序を変えるとこれがスルーされなくなる代わりに、それまで処理され
ていた別のサブルーチンが処理されなくなるという具合です。
さらに、処理が行われないサブルーチンを含むスクリプト定義をコメントアウトし、メインルーチンでは
処理が行われないサブルーチンへの分岐をそのままにした状態で実行してもエラーにならないのです。
個々のサブルーチンについては、特にエラーは出ないのですが…
0156デフォルトの名無しさん
2009/08/26(水) 12:48:03補足です。requireはメインルーチン文頭に条件分岐なしで記述してあります。
0157デフォルトの名無しさん
2009/08/26(水) 13:05:39>Perlにはサブルーチンの数に制限がありますか?
Perlよくしらないけど、ないんじゃないかなあ。
問題は別のことが原因だとおもう。たとえばサブスクリプトで同じ名前の関数を
定義しているために、読み込む順番によって上書きされたりしなかったりとか。
0158デフォルトの名無しさん
2009/08/26(水) 13:16:20http://fireball.loafer.jp/kes/perl/article_134.html
0159デフォルトの名無しさん
2009/08/26(水) 13:34:530160デフォルトの名無しさん
2009/08/26(水) 13:51:20アロー演算子の後のスカラー変数は動的なメソッド呼び出しをするという機能なんだ。
賢くなった。
�d
0161デフォルトの名無しさん
2009/08/26(水) 15:53:12まさにその通りでした…(恥)orz
0162デフォルトの名無しさん
2009/08/26(水) 15:54:320163デフォルトの名無しさん
2009/08/27(木) 12:05:48$href<one>と山括弧にしたのですか?
404 Blog Not Found:perl - $@%&*のよしあし
http://blog.livedoor.jp/dankogai/archives/50772506.html
0164デフォルトの名無しさん
2009/08/28(金) 23:50:15過去のVersion0.90〜0.82も試しましたが結果は同じでした。
・Windows XP Professional SP3
・CYGWIN_NT-5.1 hostname 1.5.12(0.116/4/2) 2004-11-10 08:34 i686 unknown unknown Cygwin
・This is perl, v5.8.5 built for cygwin-thread-multi-64int
・$ perl -MCPAN -e 'print $CPAN::VERSION;' 1.9402
t/Builder/try...........................NOK 6
# Failed test at t/Builder/try.t line 36.
# got:
# expected: 23
t/Builder/try...........................ok 8/0# Looks like you failed 1 test of 8.
t/Builder/try...........................dubious
Test returned status 1 (wstat 256, 0x100)
DIED. FAILED test 6
Failed 1/8 tests, 87.50% okay
全文
ttp://textup.no.land.to/w/1251470681/
0165デフォルトの名無しさん
2009/08/29(土) 00:23:40use Encode;
open(FH,'c:\hoge.txt');
binmode(FH,':utf8');
my $x = <FH>;
$x =~ s/ア//g;
print encode('utf8',$x);
close(FH);
hoge.txt(utf8で記述されている)から一行抜き出して、その文から「ア」を削除したいんですけど、
こんな感じのソースを書いてみたら案の定期待した通りには動きませんでした。
どうすれば期待通りの挙動になってくれるんでしょうか、誰か教えてください
0166デフォルトの名無しさん
2009/08/29(土) 00:51:280167デフォルトの名無しさん
2009/08/29(土) 08:57:561. t/以下を読んで原因を探って解決。
2. バギーでも少々動けばいいやと思うなら cpan -if Test::Simple。
0168デフォルトの名無しさん
2009/08/29(土) 13:02:19>>4は読んでますけど関係無いですよね?
Dos窓はきちんとutf8で動かしてるし、単純にutf8なソースの中で正規表現を使う方法だけ知りたいんです。
0169デフォルトの名無しさん
2009/08/29(土) 13:45:53自分のコードと、どこがどう違うか
1行1行しっかり吟味しろ
0170デフォルトの名無しさん
2009/08/29(土) 17:46:46---------------------
a = 0
処理
a = a++
---------------------
上記のようにa++を使うような感じで
数字+アルファベット+特殊記号のアンダーバー_
37文字を100万値まで繰り返し使いたいです
変数aの次にb
bの次はc・・・・
zの次は0
0の次は1・・・
9の次は_
_の次はa
aの次はb
a〜z 0〜9 _
これを繰り返す方法教えてください
37進数って言うのかな?
0171デフォルトの名無しさん
2009/08/29(土) 17:53:09my @ary = ('a'..'z', '0'..'9', '_');
my $len = scalar @ary;
for my $i (0..100) {
print $ary[$i % $len];
}
0172デフォルトの名無しさん
2009/08/29(土) 17:57:40配列に37文字組み込んでってことですね
大変参考になりました
即レス頂きありがとうございました!
0173デフォルトの名無しさん
2009/08/29(土) 20:27:120174デフォルトの名無しさん
2009/08/30(日) 01:08:32まだ初心者だけど、>>171を参考に作ってみた。
package Base37;
use strict;
use warnings;
use Carp;
use overload (
'++' => \&inc,
'--' => \&dec,
'+' => \&plus,
'-' => \&minus,
'=' => \©,
'""' => \&str,
);
my @base = ('0'..'9', 'a'..'z', '_');
sub new {
my $class = shift;
my $symbol = shift || $base[0];
my $pos = index( (join q{}, @base), $symbol );
croak "`$symbol' can't be used. `@base' are available." if $pos < 0;
bless {pos => $pos}, $class;
}
0175デフォルトの名無しさん
2009/08/30(日) 01:09:31sub inc {
my $self = shift;
$self->{pos}++;
$self->{pos} %= @base;
Base37->new( $base[$self->{pos}] );
}
sub dec {
my $self = shift;
$self->{pos}--;
$self->{pos} %= @base;
Base37->new( $base[$self->{pos}] );
}
sub plus {
my ($self, $other) = @_;
if (ref $other ne 'Base47' ) {
$other = Base37->new($other);
}
my $pos = ( $self->{pos} + $other->{pos} ) % @base;
Base37->new( $base[$pos] );
}
0176デフォルトの名無しさん
2009/08/30(日) 01:10:45sub minus {
my ($self, $other, $is_reversed) = @_;
my $pos;
if (ref $other ne 'Base47' ) {
$other = Base37->new($other);
}
if ( $is_reversed ) {
$pos = $other->{pos} - $self->{pos};
}
else {
$pos = $self->{pos} - $other->{pos};
}
$pos %= @base;
Base37->new( $base[$pos] );
}
sub copy { Base37->new( $base[shift->{pos}] ) }
sub str { $base[shift->{pos}] }
package main;
my $a = Base37->new('z');
$a++;
print "$a\n"; #=> _
$a++;
print "$a\n"; #=> 0
0177名無しさん@そうだ選挙に行こう
2009/08/30(日) 04:22:410178名無しさん@そうだ選挙に行こう
2009/08/30(日) 05:30:03ざっと探してみたけどperlじゃ36進数のサンプルないぞ
さすがにCとVBはあったけど
で、37進数やろ
お前が37進数やってみればいいやろプロさんwww
0179名無しさん@そうだ選挙に行こう
2009/08/30(日) 06:42:370180名無しさん@そうだ選挙に行こう
2009/08/30(日) 12:09:26最小の労力で逆転させるにはどうすれば
0181名無しさん@そうだ選挙に行こう
2009/08/30(日) 12:37:25\*import = cgi_fixup();
って何をしているのです?
そもそも、\*import ってのが何を表しているのかがさっぱりわからん。
http://blog.livedoor.jp/dankogai/archives/50805754.html
reverse
0183名無しさん@そうだ選挙に行こう
2009/08/30(日) 14:15:030184名無しさん@そうだ選挙に行こう
2009/08/30(日) 17:44:31use bigint;
$SEED=0;
for $sec (0..0xffff){
$SEED=$sec;
$mapSEED=&dq9_rand;&dq9_rand;$rand=&dq9_rand;
$loc1=&loc($rand,47);
$loc2=&loc($rand,131);
$loc3=&loc($rand,150);
printf "$sec秒:SEED=%04X 場所(%X,%X,%X)\n",$mapSEED,$loc1,$loc2,$loc3;
}
sub dq9_rand{
$SEED = ($SEED * 1103515245 + 12345) & 0xffffffff;
$ret =($SEED >> 0x10 & 32767);
return $ret;
}
sub loc{
$r=shift;
$upper=shift;
$diff_1=$upper; # 差分+1 = $upper-下限1+1
return ( 1 + ($r % $diff_1 ) );
}
0185名無しさん@そうだ選挙に行こう
2009/08/30(日) 17:53:17なんかこんなの出てきたぞ。意味わからんけど動いてるんじゃね
0秒:SEED=0000 場所(19,21,59)
1秒:SEED=41C6 場所(9,1B,40)
:
中略
:
65535秒:SEED=0CA6 場所(18,79,36)
0186名無しさん@そうだ選挙に行こう
2009/08/30(日) 19:22:460187デフォルトの名無しさん
2009/08/30(日) 23:11:59ごめん、その通りなんだ
初めていじるので全く意味がわからない・・・
0188デフォルトの名無しさん
2009/08/30(日) 23:30:43漢字についての取り扱いでよそからコピペした時だったので、
しばらく悩んだ
0189187
2009/08/31(月) 00:00:570190デフォルトの名無しさん
2009/08/31(月) 22:24:36基礎らしい二分検索のプログラム書こうとチャレンジしてるんだが方法が思いつかない。
ソート済の対象ファイルを配列に取り込んで、配列個数調べて
個数nの半分の値の所で比較して比較して……って感じで流れは分かるんだけど
一応検索で該当箇所見つけ出してそこに1行突っ込む、って部分は出来たんだけど……
0191デフォルトの名無しさん
2009/08/31(月) 22:26:48perlの文法がわからなくてプログラムコード化できないのか?
0192デフォルトの名無しさん
2009/08/31(月) 22:35:570,0,0
0,0,1
0,0,2
0,1,0
0,1,1
0,1,2
0,2,0
.
.
.
みたいな3×4×5=60個の組み合わせを全部表示するようなプログラムを作りたい。
forループ3回まわせばそりゃ楽なんだが、再帰でやってみようとしてもどうも
うまくいかない・・・。どんな風に書けばいいかな?
0193デフォルトの名無しさん
2009/08/31(月) 22:44:24ソートされているデータを、まず要素の真ん中で検索し、比較対象が上か下か調べる
それを更に上と下で区切ったほうのさらに真ん中で同様の処理
繰り返し最後の値が見つけ出すまでやる・・・・で良かったかな
配列取り込んで、配列の数出して、
それを1/2してまではなんとかなるけど、
そこから先、どのように書いたらいいかが見当付かないんです・・・・
0194デフォルトの名無しさん
2009/08/31(月) 23:47:12これでどうだ
sub foo {
my ($n, @rest) = @_;
return map {
my $i = $_;
@rest ? map { "$i, $_" } foo(@rest) : "$i\n"
} (0 .. $n-1);
}
print foo(3, 4, 5);
0195デフォルトの名無しさん
2009/09/01(火) 01:10:58そこまで分かってるなら、あとはコーディングするだけじゃん。
perlの文法がわからないの?
だったら入門書や解説サイトを読めばいいやん。
0196デフォルトの名無しさん
2009/09/01(火) 01:47:37if関数で ひたすら大か小かで判定するかしか思い浮かばなくて……
whichでその大か小かの判定だけさせた無限ループにして
一致した時点でlastで抜ける みたいな感じでいいのでしょうか……
0197デフォルトの名無しさん
2009/09/01(火) 01:52:530198デフォルトの名無しさん
2009/09/01(火) 01:59:35バイナリ検索は、配列を切ったりはったりせずに、インデクスの上下でせめていくといいよ
とりあえず再帰を使った例を出しとく。でも普通は効率化のため再帰じゃなくループにする
sub search
{
my ($arr, $data, $min, $max) = @_;
return (0, $min) if ($min >= $max); # サーチ失敗フラグ+挿入すべきインデクス
my $i = int(($min + $max) / 2);
return search($arr, $data, $min, $i) if ($arr->[$i] > $data);
return search($arr, $data, $i+1, $max) if ($arr->[$i] < $data);
return (1, $i); # サーチ成功フラグ+見つかったインデクス
}
my @array = grep { $_ % 3 } (1 .. 10000); # テスト用:3の倍数を除く10000以下の自然数
foreach my $data (0, 100, 3000, 7777, 10001) # この5つの数を検索してみる
{
my ($found, $index) = search(\@array, $data, 0, scalar(@array));
if ($found) { print "$data を発見しました(位置=$index)\n"; }
if (!$found) { print "$data はありません(挿入すべき位置=$index)\n"; }
}
0199デフォルトの名無しさん
2009/09/01(火) 23:24:28Perl Internalsについて - Unknown::Programming
http://d.hatena.ne.jp/fbis/20080627/1214537750
Internals::HvREHASH
Internals::SvREADONLY・・・これはわかった
Internals::SvREFCNT・・・これもわかった
Internals::hash_seed
Internals::hv_clear_placeholders
Internals::rehash_seed
0200デフォルトの名無しさん
2009/09/02(水) 09:52:55hash_seedはハッシュDBの構造が理解できれば何のことかすぐわかるはず。
0201デフォルトの名無しさん
2009/09/02(水) 22:07:37例えば、
my %hogehoge;
foreach(0..10){
push(@{$hogehoge{pos}},[$_,$_+1]);
}
されたものがある場合、どうやって$hogehoge{pos}を表示すればいいのでしょうか?
0202デフォルトの名無しさん
2009/09/02(水) 22:37:25foreach (@{$hogehoge{pos}}){
print $_;
}
あるいは
$hogehoge{pos}->[0]; # 連番で
0203デフォルトの名無しさん
2009/09/02(水) 23:29:50それだと、こうなってしまうのですが・・・
ARRAY(0x1004f668)ARRAY(0x1004f830)ARRAY(0x1004f890)ARRAY(0x1004f8f0)ARRAY(0x1004
f950)ARRAY(0x1004f9b0)ARRAY(0x1004fa10)ARRAY(0x1004fa70)ARRAY(0x1004fad0)ARRAY(0
x1004fb30)ARRAY(0x1004fb90)
0204デフォルトの名無しさん
2009/09/03(木) 01:45:42そりゃ、そのまま吐いたらそうなるなぁw
こうかな。
for my $pos_ref (@{$hogehoge{pos}}) {
warn $pos_ref->[0];
warn $pos_ref->[1];
}
そもそもその前にpushしてるのが直感的な感じしないからこうしちゃうなぁ
my @array = map { [$_, $_+1] } (0..10);
$hogehoge{pos} = \@array;
で、>>202が言ってるみたいに->[0]でやるかなぁ
0205デフォルトの名無しさん
2009/09/04(金) 09:53:49print "@$_" for @{$hogehoge{pos}};
0206デフォルトの名無しさん
2009/09/04(金) 10:00:28}
0207デフォルトの名無しさん
2009/09/04(金) 10:14:27デバッグで値を見たいとかではなくて?
my %hogehoge;
foreach(0..10){
push(@{$hogehoge{pos}},[$_,$_+1]);
}
use Data::Dumper;
use Dumpvalue;
print Dumper($hogehoge{pos});
Dumpvalue->new->dumpValue($hogehoge{pos});
0208デフォルトの名無しさん
2009/09/04(金) 16:00:18CPANに上がってる英文マニュアル見たがさっぱり、自動翻訳してもっとわけわかめになった。
0209デフォルトの名無しさん
2009/09/04(金) 21:06:08/ \
【検索した?】 NO → なら、ねぇよ。氏ね。
\
NO → 氏ね。
0210デフォルトの名無しさん
2009/09/05(土) 20:42:45初心者サイトとかを回りながら、ファイルを読み込んで表示するだけのcgiを作ろうとしたんだけど
ファイルを二個読み込もうとするとインターナルサーバエラーとか言われる
IO::FILE使わなければ問題なく動くんだけどなぜなの? IO::FILEは二回呼び出せないの?
0211デフォルトの名無しさん
2009/09/05(土) 20:43:27#! /usr/bin/perl
use CGI;
use IO::File;
$logfile = 'data.log'; # ログファイルの名前
$logfile_02 = 'data_02.log'; # ログファイルの名前
$all_data = read_all_data(\$logfile);
$all_data_02 = read_all_data(\$logfile_02);
$q = new CGI;
print $q -> header(-Charset=>'sjis');
print $q -> start_html(-title => "test");
print @$all_data;
print @$all_data_02;
exit;
sub read_all_data{
my $logfile = shift;
my $io = IO::File->new($$logfile, 'r');
my @lines = $io->getlines;
$io->close;
return \@lines;
}
0212デフォルトの名無しさん
2009/09/06(日) 01:09:29$$って
0213デフォルトの名無しさん
2009/09/06(日) 02:37:24できた! ありがとん
でもなぜ$$logfileじゃだめなんだぜ?
my $logfile = shift; にファイル名へのリファレンス格納→$$logfileでデリファレンスっていう流れだと思ったのに……
何か根本的に間違ってんのかな
0214デフォルトの名無しさん
2009/09/06(日) 06:36:13区別されてますよね?
数値なのか文字列なのかをプログラム内で判断する方法ってあるんですかね?
困っているわけではなく、単なる興味本位なのですが。
use Devel::Peek;
$num = 0;
$str = '0';
Dump $num;
Dump $str;
____________________________________________________
SV = IV(0x1828220) at 0x287dac
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 0
SV = PV(0x289e34) at 0x183271c
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x285144 "0"\0
CUR = 1
LEN = 4
0215デフォルトの名無しさん
2009/09/06(日) 07:10:02気にしたこと無かったけどぐぐったら見つけた
http://oshiete1.goo.ne.jp/qa1737534.html
こんなやり方あるんだねー
0216デフォルトの名無しさん
2009/09/06(日) 07:50:08Devel::Peekができてるんだから出来るんだろうよ。
ソース読んでみ。
ちなみにこの挙動については友人と議論したことがあるが、
数値か文字列か区別できたところで使いどころがない。
そもそも仕様外だから危なっかしくて使えねー。
ちなみに数値にしたけりゃ +0すりゃいいし、文字列にしたけりゃ .''すりゃいい。
0217デフォルトの名無しさん
2009/09/06(日) 08:09:31> でもなぜ$$logfileじゃだめなんだぜ?
デリファレンス
0218デフォルトの名無しさん
2009/09/06(日) 08:16:46ちょっと違うような。。。
>>216
Devel::PeekはXSで書かれているんで自分にはよくわからんです。
0219デフォルトの名無しさん
2009/09/06(日) 08:18:20おすすめはblessしたクラス内で扱うこと。
トリッキーな使い方は可読性、可搬性を下げるのみ。
自己満足はできるかもしれないが。
0220デフォルトの名無しさん
2009/09/06(日) 10:48:10それがperlの特徴なのに。(スクリプト系言語はたいていそうなてる)
これじゃまるで、パンツの見えないミニスカートを買ったのに
パンツの見せ方を教えてください、って言ってるようなもん。
0221デフォルトの名無しさん
2009/09/06(日) 12:51:42今やりたいことは、あるウェブページ中にある画像のURLだけを取ってきたいと思っています。
$contents = get($url); # LWP::Simple
$contents =~ /(http:\/\/[^"]+[.]jpg)/; # jpgだけゲット
$image = $1;
↑こうやりますと最初にマッチしたものは取り出せるのですが、
2番目以降もまとめて上手く配列などに取り出せないでしょうか。
0222デフォルトの名無しさん
2009/09/06(日) 12:59:340223デフォルトの名無しさん
2009/09/06(日) 13:20:57ありがとうございます。
置換のときは使っていたのですが、こんな風にも使えるのですね
0224デフォルトの名無しさん
2009/09/06(日) 15:00:28print "$1はうんこ\n";
}
0225デフォルトの名無しさん
2009/09/06(日) 16:45:39簡単な方法は、$foo ^ $foo の結果を見ること。
0だったら$fooは数値、空文字列だったら$fooは文字列。
数値をお互いにXORするとゼロになるし、
文字列をお互いにXORするとナルストリングになる。
>>221
本当に画像だけ取って来たいなら素直にWWW::Scraper使え。
それだと本文中のURLも拾うぞ。それでもいいなら構わんが。
0226デフォルトの名無しさん
2009/09/06(日) 17:13:52最近、こういう言い回しが増えたよね。
べつにひねくれて星を睨んで「○○」を使わないワケじゃないと思うよ。
ただ「○○」という便利なものが存在するとは知らなかっただけだと思うよ。
なんかさ、「素直に○○使え」って言い回しするヤツって
女子校生が「ちょ〜〜〜やばいしぃ〜〜」とか言ってるのと同じ臭いがする。
オツムが弱そう。バカっぽいな。
0227デフォルトの名無しさん
2009/09/06(日) 18:30:40素直に○○する、ってのは、(深く考えず)○○した方が物事がすんなりと運ぶ、という意味なんだが。
辞書があるなら引くといい。
0228デフォルトの名無しさん
2009/09/06(日) 18:35:230229デフォルトの名無しさん
2009/09/06(日) 18:47:04素直にやばいしぃ〜〜
0230デフォルトの名無しさん
2009/09/06(日) 19:11:04ほー、WWW::Scraperで画像をスクレーピングできるとは知らなかった。
Web::Scraperは知ってたけど。
0231デフォルトの名無しさん
2009/09/06(日) 19:20:01韓国の辞書も北朝鮮の辞書も持ってません
0232デフォルトの名無しさん
2009/09/06(日) 21:30:07画像->画像表示を示すURI、WWW::Scraper -> Web::Scraperの間違いだな。
訂正サンクス。
>>231
「単品で迷うなら素直にランチにしなよ」とか普通に使う用途なんだが、
こんな簡単な日本語取り違えるとはゆとりのなせる業か。
>オツムが弱そう。バカっぽいな。
0233デフォルトの名無しさん
2009/09/06(日) 21:40:07空文字列じゃなく "\x00" x 文字列長 になるんじゃないかな
print length 'foo' ^ 'foo', '/', unpack 'H6', 'foo' ^ 'foo'; # 3/000000
>>214
内部的にどう扱われているかでなく、数値コンテキストに置いた時に
解釈可能な文字列かどうかを判定したいなら Scalar::Util::looks_like_number()
http://cpansearch.perl.org/src/GBARR/Scalar-List-Utils-1.21/lib/Scalar/Util/PP.pm
0234デフォルトの名無しさん
2009/09/06(日) 21:47:31そのようだな。補足サンクス。Cと混同していたようだ。
0235デフォルトの名無しさん
2009/09/06(日) 21:53:24で?
その”普通に使う用途”が載ってるのは、韓国の辞書?北朝鮮の辞書?
0236デフォルトの名無しさん
2009/09/06(日) 22:01:59引くに引けないのはわかるけど、負け戦で頑張っても意味無いよ。
黙って日本語を勉強しなおすといい。
0237デフォルトの名無しさん
2009/09/06(日) 22:03:40日本の辞書の例:
http://dic.yahoo.co.jp/dsearch?enc=UTF-8&p=%E7%B4%A0%E7%9B%B4&dtype=0&dname=0na&stype=0&pagenum=1&index=11591609974300
>>226は第2義しか頭にないらしい。
日本人なら文脈からして4義が5義と考えるのが普通。
0238デフォルトの名無しさん
2009/09/06(日) 22:04:560239デフォルトの名無しさん
2009/09/06(日) 22:07:360240デフォルトの名無しさん
2009/09/06(日) 22:49:12やっぱりチョンの会社の辞書を出したか。今は日本に帰化してるが。
0241デフォルトの名無しさん
2009/09/06(日) 22:55:57問題点は他にあったんじゃ?
0242デフォルトの名無しさん
2009/09/06(日) 23:32:31レスありがと
211だけど、仰るとおりperlのプロセスがループしてた
正常な状態だったら問題なく動いたわ
かなり時間を費やしてしまった……
基本的に引数は参照渡しでいいんだよね?
0243デフォルトの名無しさん
2009/09/06(日) 23:34:02どこでそんなの習ったんだ?
0244デフォルトの名無しさん
2009/09/06(日) 23:36:47どこかのサイトに書いてあった記憶がある
片っ端から初心者向けサイト回ってたからどことは言えないけど
オレが勘違いしてるのかな
0245デフォルトの名無しさん
2009/09/06(日) 23:59:09Perlの関数呼び出しは値渡しじゃなくて変数渡しだから、わざわざリファレンスにする必要はないよ。
@_には引数がコピーされて入っているのではなく、引数そのものの別名になっている。
0246デフォルトの名無しさん
2009/09/07(月) 00:02:330247デフォルトの名無しさん
2009/09/07(月) 00:17:22変数を渡すときはそのままでも値がコピーされなくて
配列とかハッシュはコピーされちゃうからメモリが勿体無いと
勉強になったわ
0248デフォルトの名無しさん
2009/09/07(月) 03:17:01サブルーチンの引数として配列やハッシュを複数渡すと、単一のフラットなリストとして @_ に展開されますが、エイリアスとしての動作は変わらないため値のコピーは発生しません。
>246 が言う必要性とは、「単一のフラットなリスト」にされては困る場合、すなわち引数を渡された関数内で個々の配列を峻別して処理しなければいけない場合に、参照渡しが必須になるという意味です。
ちなみにハッシュのキーに限り、キーそれ自体は変数ではないため、エイリアスの内容を変更しても元のハッシュのキーは変化しません。
0249デフォルトの名無しさん
2009/09/07(月) 04:52:06>空文字列じゃなく "¥x00" x 文字列長 になるんじゃないかな
じゃあ、結局データが文字列か数値かを知りたいときはどうするのがいいんでしょうか。
今まさに1と"1"を別に扱いたい場面に直面しています。
0250デフォルトの名無しさん
2009/09/07(月) 05:25:56データ構造を作り直して回避する。
0251233
2009/09/07(月) 05:56:07いや俺に訊かれても。その二つを区別しなきゃいけない状況に陥った事なんて無いし。
sub is_num { ($_[0] ^ $_[0]) !~ /^\x00/ }
print is_num($_) ? 'num' : 'str', "\n" for 0, '0', '+1e3', +1e3;
…とでもしときゃいいんじゃない。すっごくアホ臭いけど。
0252デフォルトの名無しさん
2009/09/07(月) 06:35:52質問があります。
(1) READMEの推奨される書き方やフォーマットはありますか。
(2) Changesの推奨される書き方やフォーマットはありますか。
(3) テストファイルが t/*.t のようですけど、test/*.pl にするのはよくないですか。
(4) パッケージのファイル名と、ライブラリ名が異なっていてもいいでしょうか。
たとえば Foo というライブラリを提供するパッケージとして、
Foo-entry-1.0.0.tar.gz # 機能限定版
Foo-full-1.0.0.tar.gz # 機能強化版
のように用途別・目的別に別々のパッケージを用意しようとしているんですが
こういうのはまずいでしょうか。何か問題があれば教えてください。
0253デフォルトの名無しさん
2009/09/07(月) 07:32:29だから$foo ^ $fooの結果。0と0x00 x nは違うから。
正直、正規のプログラミングで1と"1"を区別したってろくなことないよ。
コアな部分をいじるようなスクリプトでない限り(Dumperみたいにね)、
Perlでそんな場面に遭遇するってことはあなたの設計がおかしい。
>>251
$foo ^ $foo eq '0' ? '数値' : '文字列'でおk。
>>252
とりあえずお前はこれは読んどけ。10回くらい読め。
http://perldoc.perl.org/perlnewmod.html
質問の内容からしてPAUSE使うのは100年早い気がする。
いちAuthorより。
0254デフォルトの名無しさん
2009/09/07(月) 07:38:21ズブの素人だろうから、「基本的にPerlにそんなことはできない」と言い切った方が良かったかな。
1と'1'を区別したい理由かコードか何か晒してみ?多分瑕疵があるから。
0255デフォルトの名無しさん
2009/09/07(月) 07:41:49小学館ってチョンの会社だったの?
0256デフォルトの名無しさん
2009/09/07(月) 07:47:09参考に、どういうケースなのか教えて欲しい。
0257デフォルトの名無しさん
2009/09/07(月) 07:51:52>>249ではないが、友人が自作フレームワーク作ってて、引数の型によって
挙動を変えたいっつー場面で数値と文字列の比較の話を出してきた。
当然止めとけと言っておいた。
ドキュメント化されてない部分だからいつ仕様が変わってもおかしくないしな。
0258デフォルトの名無しさん
2009/09/07(月) 08:55:52たとえばPerlでJSONのバリデータを作ろうとしたけど、1と'1'が区別できなくてまじ困る。
たとえば「name は文字列である」というスキーマを定義したとして、
{ "name": "1" } # これはvalid
{ "name": 1 } # これはだめ
としないといけない。
でもPerlでは1と'1'の区別をどうすればいいのかわからないから、正しい検証ができない。
#自分が使わないからといって、他の人も同じだとは思わないでください。お願いします。
0259デフォルトの名無しさん
2009/09/07(月) 09:43:18設計が悪い。
0260デフォルトの名無しさん
2009/09/07(月) 09:51:43http://search.cpan.org/~makamaka/JSON-2.15/lib/JSON.pm
読んでみ。数値も文字列で格納することがあることが分かる。
どうしても必要ならJSONを自分でパースしてチェックすればいい。
JSONのレイヤーの問題なんだからPerlのレイヤーに落としてチェック
しようとする発想が間違っている。
0261デフォルトの名無しさん
2009/09/07(月) 10:10:20use JSON::Syck;
use Perl6::Say;
$foo = JSON::Syck::LoadFile('test.json');
say $foo->{foo} ^ $foo->{foo} eq '0' ? '数値' : '文字列';
--test.json--
{ foo : 1 }
--結果--
数値
--test.json--
{ foo : 0.5 }
--結果--
文字列
やっぱり発想自体が間違ってたね。
ちなみに0.5はともかくPerl/PHPやCも含む大抵の処理系では0.1は文字列にする方が正確。
↓こんなことになるからね。それがなぜか分かれば君も一歩大人。
for($i = 0; $i < 1; $i += 0.1){say "$i"}
0262デフォルトの名無しさん
2009/09/07(月) 11:32:390263デフォルトの名無しさん
2009/09/07(月) 11:43:21これには同意するが、スクリプト言語で文字の1と数値の1を見分けたい、ってのは
やっぱ何かが間違ってる
0264デフォルトの名無しさん
2009/09/07(月) 12:09:03> これには同意するが、スクリプト言語で文字の1と数値の1を見分けたい、ってのは
> やっぱ何かが間違ってる
間違ってるのはそこじゃなくてアプローチ。
東京から熱海にいくのに「飛行機でいきたいので簡単な方法を教えてください」というようなもんだ。
そりゃ羽田-静岡富士山経由してもいけるが
新幹線を使おうよ。小田急+JRでもいい。
って話。
0265デフォルトの名無しさん
2009/09/07(月) 12:47:250266デフォルトの名無しさん
2009/09/07(月) 12:53:15>スクリプト言語で文字の1と数値の1を見分けたい、ってのは
>やっぱ何かが間違ってる
えーなんで?
*Perlでは*間違っているということなら同意するけど、スクリプト言語一般に広げないでほしい。
つーか、integerとstringの見分けがつかない言語が存在するなんて初めてしったわ。
PHPですらis_string()とかあるのに。
0267デフォルトの名無しさん
2009/09/07(月) 14:17:090268デフォルトの名無しさん
2009/09/07(月) 15:08:15> つーか、integerとstringの見分けがつかない言語が存在するなんて初めてしったわ。
見分けがつかないんじゃなくて、区別されてないんだろ。
0269デフォルトの名無しさん
2009/09/07(月) 15:16:31Perlの出自を考えれば文字列と数値を区別しないのも当然といえば当然。
0270デフォルトの名無しさん
2009/09/07(月) 15:27:310271デフォルトの名無しさん
2009/09/07(月) 16:04:06括弧や句読点、長音記号等を 90度横倒しにして表示する良い方法が無いでしょうか?
0272デフォルトの名無しさん
2009/09/07(月) 16:09:100273デフォルトの名無しさん
2009/09/07(月) 16:20:56単に縦書き用フォントを使えばいい。
何でも横倒しにすりゃいいってもんじゃないぞ。句読点もそうだが、
波ダッシュ字形問題が、縦書き用フォントを横にするだけでおkと思った
馬鹿外人のせいで起こってしまったことを忘れるな。
0274271
2009/09/07(月) 16:28:52ご指摘、ご教示ありがとうございます
読み込んだ横書きテキストデータ中の文字を
横書きで問題が出る字形だけ
縦書き字形に変換するという方法で
なんとかやってみようと思います
0275デフォルトの名無しさん
2009/09/07(月) 16:41:07だから全部縦書き字形にしろって。お前なら絶対見落とすから。影響受けるのは記号だけじゃねーぞ。わかるか?
こういうのは意固地にならずに安直に安全側に転ぶように設計するのが鉄則。
何度も書くが、波ダッシュ問題は問題が出ない字形だと思ってそのまま横倒しにして起きた事故なんだから。
0276デフォルトの名無しさん
2009/09/07(月) 17:08:47×say $foo->{foo} ^ $foo->{foo} eq '0' ? '数値' : '文字列';
○say +($foo->{foo} ^ $foo->{foo} eq '0') ? '数値' : '文字列';
0.1は数値と扱われるようですね。'0.1'で文字列でした。失礼しました。
0277デフォルトの名無しさん
2009/09/07(月) 17:10:10○say +($foo->{foo} ^ $foo->{foo}) eq '0' ? '数値' : '文字列';
0279デフォルトの名無しさん
2009/09/07(月) 18:21:16じゃUTF-8変換とか恐ろしくて使えないな。今後もShift_JISとかEUC-JPで頑張ってください。
多分バグが出る可能性よりも君がミスる可能性の方が高い。
0280デフォルトの名無しさん
2009/09/07(月) 19:51:04>数値も文字列で格納することがあることが分かる。
なんでこんなことするの?
>どうしても必要ならJSONを自分でパースしてチェックすればいい。
「すればいい」じゃなくて、Perlでは「自分でパースしてチェックするしかない」だよね。
>JSONのレイヤーの問題なんだからPerlのレイヤーに落としてチェック
>しようとする発想が間違っている。
えー、数値と文字列が区別できるような言語なら何の問題もないのに。
Perlではそれができないのを、「発想が間違い」とかいってごまかさないでほしい。
0281デフォルトの名無しさん
2009/09/07(月) 20:06:21> なんでこんなことするの?
魔法を使うため
0282デフォルトの名無しさん
2009/09/07(月) 20:21:59果たしてそれはバリデータなのか、物体Xではないのか。
0283デフォルトの名無しさん
2009/09/07(月) 20:40:28といったデータを、json_validate($json_obj, {"/PI" => "float", "/unko/*" => "int"});
みたいにチェックする場合じゃないの
0284デフォルトの名無しさん
2009/09/07(月) 21:18:42その処理系は知らないから分からないが、Cライクな型を調べるものとして、
1000桁の数値であってもJSONとしてはvalidなのだから、
やはり文字列で判定すべきではないのか。
0285デフォルトの名無しさん
2009/09/07(月) 21:35:51>とりあえずお前はこれは読んどけ。10回くらい読め。
>http://perldoc.perl.org/perlnewmod.html
どうもです。でもそれには知りたい内容は一切かかれてませんでした。
(1)READMEを書きなさいとはありましたが、フォーマットについては言及なし。
(2)Changesについては一切言及なし。
(3)テストを書きなさい、Test::SimpleとTest::Moreがおすすめ、とはあるが、推奨するファイル名については言及なし。
(4)パッケージのファイル名についても言及なし。
10回読めと言うくらいなら、もうちょっと関連するものを紹介してくれてもいいような。
で、他のCPANパッケージをいくつかダウンロードしてみたところ、
(1)READMEファイルの書き方はバラバラ。好きな書き方でいいみたい。
(2)Changesはそれ以上にバラバラ。
(3)テストスクリプトはどのパッケージも t/*.t だった。これに従ったほうがいいみたい。
(4)パッケージ名とライブラリは厳密に一致している(みたいだけど確証はなし)。
あとバージョン名の付け方が、X.X.X ではなく X.X という形式のが非常に多いんですけど、
Perlでは「5.8.6」よりも「5.86」という形式のほうが好まれるんでしょうか。
0286デフォルトの名無しさん
2009/09/07(月) 21:50:230287デフォルトの名無しさん
2009/09/07(月) 22:05:09> 見分けがつかないんじゃなくて、区別されてないんだろ。
区別せずに都合よく使えるようにしてあるんだよ。
厳格に区別するほうがよほど簡単なのに。
0288デフォルトの名無しさん
2009/09/07(月) 22:07:11> 波ダッシュ字形問題
ってなんですか?
涙っしゅ??
0289デフォルトの名無しさん
2009/09/07(月) 22:38:380290デフォルトの名無しさん
2009/09/07(月) 22:45:58>区別せずに都合よく使えるようにしてあるんだよ。
区別せずに使えるのは利点だとしても、区別できない(見分けがつかない)のは欠点だよな。
0291デフォルトの名無しさん
2009/09/07(月) 22:54:32変数アクセス履歴を残しておけばいいわけだな
0292デフォルトの名無しさん
2009/09/07(月) 23:14:53module-starterをインストールすると、READMEのフォーマットがわかるの?
わかってないのに無理して回答するのやめようぜ。初心者が混乱するだけだから。
もしわかっててその回答なら、あまりにとんちんかんすぎる。
0293デフォルトの名無しさん
2009/09/08(火) 00:11:14プラグインModule-Starter-PBP入れてね。
0294デフォルトの名無しさん
2009/09/08(火) 01:02:28(3)の理由はこれだ。
http://search.cpan.org/dist/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm#make_test
0295デフォルトの名無しさん
2009/09/08(火) 01:07:39今回の議論で望まれている動作とは異なるかもしれませんが、運が良ければ CPAN の Variable::Strongly::Typed が参考になるでしょう。
0296デフォルトの名無しさん
2009/09/08(火) 01:58:57それぞれ別の挙動をとるようには出来ますか?
それとも、単にスカラだけ引数に取るようにして
リストやハッシュは呼出側で参照にしてから
渡してもらうほうが賢明なのでしょうか?
0297デフォルトの名無しさん
2009/09/08(火) 02:11:28スカラー変数をブレスされたリファレンスのように扱えるオブジェクトは
どういう仕組みでできているのでしょうか
ソース読んだけど意味不明。。。
0298デフォルトの名無しさん
2009/09/08(火) 03:51:48やっぱ use overload でいろんな演算子とかを独自に定義するんでないか
0299デフォルトの名無しさん
2009/09/08(火) 08:37:44> それとも、単にスカラだけ引数に取るようにして
> リストやハッシュは呼出側で参照にしてから
> 渡してもらうほうが賢明なのでしょうか?
その方が確実かなあ。
もっと確実なのはサブルーチンを分けることなんだけど、なんでひとつにまとめたいのさ?
0300デフォルトの名無しさん
2009/09/08(火) 09:12:42ありがとうございます
調べてみます
0301デフォルトの名無しさん
2009/09/08(火) 09:44:37sub X(\$) {...}
0302デフォルトの名無しさん
2009/09/08(火) 09:51:43必要でないからあえて削除されたんだよ。
型にこだわることで起こる煩わしさのほうが多いから。
それにバリデータなんてどっかで誰かがもう作ってるだろ。
あえてパールで作り直すのは自由だけど、能力不足を棚にあげて言語のせいにされてもね。
ガタガタいうなら適切と思う言語を選べばいい。
言語のせいにするやつは、言語を変えてもできないだろうから。
0303デフォルトの名無しさん
2009/09/08(火) 10:00:09> えー、数値と文字列が区別できるような言語なら何の問題もないのに。
区別できないところに大きなメリットがある。
例えばPHPはPerlと同じく自動型変換を可能としたが、型は残したままにしたために
大変な混乱を大量のバグを生んだ。
で、区別ができないとどう困るのか具体的な返事がまだないのだが?俺は15年くらいPerl書いてるけど
困ったことなぞ一度もないぞ。
>>285
読んだんなら続きは責任もって答えてやる。
書いてないってことはREADMEやChangesにはフォーマットなし。自由に書いてよし。ってことだ。読み取れないのか。
パッケージとファイル名は基本的に一致すべしと考えておけ。で、名前空間の汚染は非常に嫌われるからなるべく少なく。
この辺はIRCでソース晒して相談するといい。あまり糞なパッケージに普遍的な名前をつけられると他が迷惑する。
バージョンのつけ方は好きに汁。5.10.1みたいのでもいいし、5.00503みたいのでもいい。後者の書き方をすると
普通バージョン番号とパッチ番号(005/03)とみなされる。最初は謙虚に0.0.1とか0.00001にしとけ。
0304デフォルトの名無しさん
2009/09/08(火) 10:19:36ググるくらいできんのか。
http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5#Unicode.E3.81.AB.E9.96.A2.E9.80.A3.E3.81.99.E3.82.8B.E5.95.8F.E9.A1.8C
>>290
それ欠点じゃなくてわざとだから。判定モジュールくらい簡単に作れる。上に判定方法も書いた。
型を区別するとPerlスクリプティングにダメージがあるためそんなモジュールは必要とされていないし使われていないだけ。
>>295
今ならMooseで
isa => 'Str',
isa=> 'Int',
でしょ。
>>296
同名関数の複数定義ができればいいんだが、Perlでは無理なので後者が賢明。
>>299
そりゃ同じ機能ならまとめたいだろうし、最近はそういう風潮にあると思うが。
foo({ a => 1,b => 2 })と、foo([ a => 1, b => 2])で挙動をスイッチするような実装とか最近よく見かけるぞ。
0305デフォルトの名無しさん
2009/09/08(火) 10:34:51-- Larry Wall, プログラミングPerl, O'Reilly, 1997, p43
Perlは内部的にスカラーを数値や文字列で扱ってるだけで、「型が区別できない」わけではない。
「数値や文字列はあっても、数値型や文字列型なんかない」のである。そこんとこ間違えないように。
0306デフォルトの名無しさん
2009/09/08(火) 11:13:56それなら、データがJSONレベルで数値だったか否かは全く問題にならないのでは?
JSON表現の "1" と 1、このどちらも、Perlレベルでは文字列としてでも整数値としてでも正常に扱えるんですから
どうしてもJSONレベルでのValidateを望むのであれば、
JSONデコーダから作るしかないのですね。Ruby等、データに型が備わっている言語であれば、
確かにJSONデコーダとJSONレベルのValidatorは完全に分離可能でしょう。
でも、Perlにはそれが出来ない。仕方のないことです
0307デフォルトの名無しさん
2009/09/08(火) 12:04:55後から判別できるような情報を残しておくことは可能。
既存のパーサーが区別しないというだけの話で
言語のせいにしたところで問題が解決するわけではない。
数値と文字列の区別がある言語であってもパーサーが区別しなければ同じこと。
0308デフォルトの名無しさん
2009/09/08(火) 12:26:56>書いてないってことはREADMEやChangesにはフォーマットなし。自由に書いてよし。ってことだ。読み取れないのか。
書かれてないから質問しているのに・・・
「書いてないってことはフォーマットなし」なんて読み取れるわけないでしょ。
書かれてないことは「不明」だと判断するのが普通じゃね?どういう頭の構造してるんだよ。
そのページはCPANパッケージの作り方についてすべてを網羅しているの?
もしそのページに書かれてないことは自由に判断していいなら、テストスクリプトのファイル名だって、
パッケージのファイル名だって、自由にしてもいいことになるだろ。でも実際にはそうじゃないじゃん。
書かれてないことは「不明」なんだから、分かっている人に聞いてみて意見をあおぐのが常識的な行動じゃないか?
「書いてないから何をやってもいい」というおまえみたいな考えこそ大迷惑。
しかしまー、あれだ、自分が紹介したページが見当はずれだったことはまるで反省せず、
「読み取れないのか」と言い放つなんて、なんという傲慢ぶり。まるでdank○gai。
0309デフォルトの名無しさん
2009/09/08(火) 12:39:35流れ見てると全くもって君の言うとおりだと思うけど、最後に例えでその名前を出すのはダメだろうw
0310デフォルトの名無しさん
2009/09/08(火) 12:40:08>1000桁の数値であってもJSONとしてはvalidなのだから、
>やはり文字列で判定すべきではないのか。
なんで1000桁の数値なら文字列にしないといけないの?
1000桁だろうと、数値は数値としてもっておけばいいじゃん。
C言語じゃあるまいし、スクリプト言語なら桁数の多い数値でもふつうに扱えるようになっていてもらわないと。
0311デフォルトの名無しさん
2009/09/08(火) 12:51:23ありがとうございます。素直にスカラを取るようにします。
0312デフォルトの名無しさん
2009/09/08(火) 13:12:40WebアプリケーションでASINをJSONで吐いてJSからあれこれするときに
{ASIN=>$asin} みたいなので、$asin =~ /^[0-9]+$/ だったりすると
{"ASIN":1234} みたいなJSONを吐き出しやがって閉口した覚えがある。
これだけならまだいいんだが $asin =~ /^0[0-7]+$/ だと
8進数に変換されてえらいことになった。
手元で試したら再現しなかったので最近のJSON.pmは大丈夫ぽいが。
0313デフォルトの名無しさん
2009/09/08(火) 15:55:55まぁ、perlは非常に弱いLvで変数の型を決め付けてるぞ。
文字型と判断されるか数値型と判断されるかで、挙動が変わるビット演算子がある。唯一それだけ。
これは変数の経歴を記録してる。
関係ないけど、バイナリデータ扱ったら、ヌル文字だらけでとんでもない目に遭った。
もう文字列の0は真にしてくれよ。binmodeって書いたときだけでいいから。せめて'0000'は真だろ!
あと、明示的に指定せずにほっといたら'0000'を勝手に0にすんのもやめてくれ、って思った。
0314デフォルトの名無しさん
2009/09/08(火) 17:50:24質問の内容が書いてあるとは一言もいっていないが?
テストのファイル名も分からない状態のあなたはまずこれを100回読めという意味だよ。
だから100回読んだあなたにちゃんと補足で答えてるだろ。
勝手に勘違いしてファビョって礼もなしにそれか。
0315デフォルトの名無しさん
2009/09/08(火) 17:59:14ページの構造をスクリプト作成に便利なようにてきとーに整形して表示するというのをけっこう前に見かけて、
あーこれ便利そうだなーと思ってそのままだったんです
今探そうと思ったらぜんぜん見つかりません
何か心当たりのある方いますか?
0316デフォルトの名無しさん
2009/09/08(火) 18:07:45分不相応にプライドの高い間抜けな質問者のオーラを
事前に察知して華麗に無視できなかったお前が悪い。
0317デフォルトの名無しさん
2009/09/08(火) 18:12:44> スクリプト言語なら桁数の多い数値でもふつうに扱えるようになっていてもらわないと。
use bignum;を使え。
> なんで1000桁の数値なら文字列にしないといけないの?
効率が悪すぎる。
>>313
変数をそのまま真偽値判定に突っ込むな。
0318デフォルトの名無しさん
2009/09/08(火) 19:06:41その文字列が含まれるファイル名を出力したいんだけど
どうすればいいの
教えてエロい人!!
0319デフォルトの名無しさん
2009/09/08(火) 19:07:57どっかで見たな
0320デフォルトの名無しさん
2009/09/08(火) 19:23:27>必要でないからあえて削除されたんだよ。
ということは、以前は機能として存在したということか。どのバージョンで削除されたか教えてくれ。
>型にこだわることで起こる煩わしさのほうが多いから。
そんなわけない。だったらJSもRubyもPythonも煩わしいことになるけど、そうはなってない。
>それにバリデータなんてどっかで誰かがもう作ってるだろ。
>あえてパールで作り直すのは自由だけど、能力不足を棚にあげて言語のせいにされてもね。
上のほうで出たのはJSONのバリデータなんだけど、それはすでにPerlにあるの?
ぐぐったけど見つからんぞ。せっかくPerlにないものを作ろうとしてくれてる人がいるのに
なんでこんな反応ばっかりなんだろうね。
>ガタガタいうなら適切と思う言語を選べばいい。
>言語のせいにするやつは、言語を変えてもできないだろうから。
これに関しては言語を変えたら簡単にできるこだろ。
数値と文字列の判定なんて、PHPですら簡単にできることなのに。ガタガタ言い訳カッコワルイ。
0321デフォルトの名無しさん
2009/09/08(火) 19:36:58ディレクトリをマウスで右クリック
「検索(E)」
ファイルに含まれる単語
0322デフォルトの名無しさん
2009/09/08(火) 19:44:52すいません、windowsを使っていないので
それはできませんorz
0323デフォルトの名無しさん
2009/09/08(火) 19:50:03>質問の内容が書いてあるとは一言もいっていないが?
すげー!質問したやつに関係ないURLを紹介しておいて、文句をいわれたら『答えが書いてあるとは誰もいってない』と逆切れ!
言い訳もここまでくるといっそすがすがしいな。
>勝手に勘違いしてファビョって礼もなしにそれか。
無関係なURLを紹介しておきながら「読み取れないのか」と言って相手のせいにするようなやつのくせして、礼だけは求めるのかよ。
相変わらずのdank○gai的傲慢さだな。論理がつながってないところもdank○gaiにそっくりだ。
あれか、Perl使うとみんなdanみたいなのになるのか?danが今のようなdanになったのはPerlのせいなのか?
0324デフォルトの名無しさん
2009/09/08(火) 19:56:32> あれか、Perl使うとみんなdanみたいなのになるのか?danが今のようなdanになったのはPerlのせいなのか?
うん! その通りだよ!!
逃げて!! Perlから逃げて!! 手遅れにならないうちにPerlから逃げてぇ!!
0325デフォルトの名無しさん
2009/09/08(火) 19:56:35シンタックスレベルのバリデータなら既にCPANに転がってるよ
http://search.cpan.org/dist/Test-JSON/
0326デフォルトの名無しさん
2009/09/08(火) 20:00:13Perlのある値は、(その時点で)文字列or/and数値としてメモリ上に表現されているって情報しか持ってなくて
その値の由来が文字列か数値かなんて情報は持ってないとか?
そうだとすると、型っていうより、Perlの値は文字列と数値の二つの側面があるってイメージで
型の判別が出来る・出来ない、というより、そもそも判別する対象(文字列型・数値型)がないのかな
これであってる?教えてくださいPerl上級者さん><
0327デフォルトの名無しさん
2009/09/08(火) 20:11:31方向はだいたいあってるんだぜー。
もっと詳しく知りたければ Devel::Peek あたりで遊んでみることだぜー。
0328デフォルトの名無しさん
2009/09/08(火) 20:14:000329デフォルトの名無しさん
2009/09/08(火) 20:15:08ありがとう
sv.hにスカラー値っぽいのが定義されてたけど、どうもそうみたいですね〜
もうPerl使ってないけど、4間年も使ってたのに気付かなかったw 勉強になりました
0330デフォルトの名無しさん
2009/09/08(火) 22:12:10何でそんなに興奮してるのか知らないけど、
続ければ続けるほど自分が皆から馬鹿にされるだけの書き込みを続けても
意味無いと思うよ。
0331デフォルトの名無しさん
2009/09/08(火) 22:45:32grep -rh 検索文字列 ディレクトリ
0332デフォルトの名無しさん
2009/09/08(火) 22:48:13ことか。どのバージョンで削除されたか教えてくれ。
0
> そんなわけない。だったらJSもRubyもPythonも煩わしいことになるけど、そうはなってない。
煩わしいよ。
> 上のほうで出たのはJSONのバリデータなんだけど、それはすでにPerlにあるの?
こまけーことイチイチ聞かなきゃ作れないひとには期待してない。
0333デフォルトの名無しさん
2009/09/08(火) 23:25:33わかりました。ありがとうございます
0334デフォルトの名無しさん
2009/09/08(火) 23:30:58文字列に数値のように振舞われるのが煩わしい人も居る
前者にとって、数字を足すのにいちいち変換するのは苦痛だし
後者にとって、"0"が偽なのは地雷でしかない
0335デフォルトの名無しさん
2009/09/08(火) 23:32:010336デフォルトの名無しさん
2009/09/09(水) 00:56:14> 文字列に数値のように振舞われるのが煩わしい人も居る
プログラマが区別できてないなら何しても同じ。
シンタックスエラーかランタイムエラーかの違いすらない。
> 後者にとって、"0"が偽なのは地雷でしかない
イミフ。
歴史的にゼロを偽とするのが習慣。
シェルについては、これも歴史的理由でゼロを真とする習慣だが。
0337デフォルトの名無しさん
2009/09/09(水) 01:31:160338デフォルトの名無しさん
2009/09/09(水) 02:39:02ためしにJSON::Syckに1000桁の数字入れたら数値 : Infになりやがった。
JSON.pmは優れたことに文字列に変換して格納してくれてる。マニュアルにも
書いてあったがこれは立派な挙動。
>>313
どう考えても君が悪いと思う。ヌル文字は偽じゃないし、なにを勘違いしてるのか知らんが、
'0000'も真だ。'0'が真で'0x00'を偽にしたいんなら、アスキーコードで判定させればいいし
Perlはその手段を提供している。
> あと、明示的に指定せずにほっといたら'0000'を勝手に0にすんのもやめてくれ、って思った。
は。ソース出してみ。Perlはそんなにお行儀悪くない。
>>326
当然由来までは保存してない。だいたいその解釈であってる。
>>334
よく初心者が引っ掛かるところだが、仕様を理解すれば地雷を踏むことはなくなる。
ただし、テキストファイル末尾の改行文字なし'0'だけはどうすることもできない。
0339デフォルトの名無しさん
2009/09/09(水) 07:30:14それはJSONが文法的に正しいかどうかをチェックするだけのチェッカーであってバリデータではない。
きみはスキーマバリデータが何かわかってないようだ。
文法をチェックするだけなら1と’1’の違いが問題になるわけがない。
0340デフォルトの名無しさん
2009/09/09(水) 08:06:39自分が何を言ってるか、理解してる?
0341デフォルトの名無しさん
2009/09/09(水) 09:14:15> 0でなく"0"な
文字としての比較なら
eqとかne
使えば?
比較演算子使わずに済ますのってZ80でXOR Aするような古くさいイメージ。
0342デフォルトの名無しさん
2009/09/09(水) 10:02:560343デフォルトの名無しさん
2009/09/09(水) 10:44:44↑コイツ・・・最高にアホだな
0344デフォルトの名無しさん
2009/09/09(水) 10:46:15$unko = 'KUSO'; print "\n'KUSO' is " , ($unko ? "TRUE" : "FALSE");
$unko = '' ; print "\n'' is " , ($unko ? "TRUE" : "FALSE");
$unko = '1'; print "\n'1' is " , ($unko ? "TRUE" : "FALSE");
$unko = '0'; print "\n'0' is " , ($unko ? "TRUE" : "FALSE");
$unko = 1 ; print "\n 1 is " , ($unko ? "TRUE" : "FALSE");
$unko = 0 ; print "\n 0 is " , ($unko ? "TRUE" : "FALSE");
0345デフォルトの名無しさん
2009/09/09(水) 11:09:02>>306
>Validateする目的は、(JSONを媒体とした)データを受け取ったPerlのプログラムを正常に動作させるためですよね?
残念ながら違います。そういう場合もありますが、バリデータは単に
「入力となるJSONがスキーマ定義を見たしているかどうか(あるいは
どこが間違っているか)」を調べるのが目的です。
そのJSONをPerlで使うかどうかはまた別のことです。
>それなら、データがJSONレベルで数値だったか否かは全く問題にならないのでは?
>JSON表現の "1" と 1、このどちらも、Perlレベルでは文字列としてでも整数値としてでも正常に扱えるんですから
文字列としても整数値としても扱えることが問題なのではなく、
文字列か整数値かを判定できるかどうかが問題です。(違いはわかりますよね?)
>どうしてもJSONレベルでのValidateを望むのであれば、
>JSONデコーダから作るしかないのですね。Ruby等、データに型が備わっている言語であれば、
>確かにJSONデコーダとJSONレベルのValidatorは完全に分離可能でしょう。
>でも、Perlにはそれが出来ない。仕方のないことです
妥当な結論だと思います。
が、Perl信者に言わせると「そういうことをすること自体が間違い」らしいです。
別にどんな言語だって万能じゃないのだから、うまくできないことがあったら
「それはこの言語ではうまくできない」と素直に認めればいいだけなのに、
「そんなことをするほうが間違っている」とわめく痛い信者が多い今日この頃。
0346デフォルトの名無しさん
2009/09/09(水) 11:39:31そのすぐ後の >307 をスルーしてるのはわざとか
どうしてもPerl自体の問題にすり替えたい様子だが
0347デフォルトの名無しさん
2009/09/09(水) 11:42:09出来ないという奴は、もう、そういうことにしとけ。
0348デフォルトの名無しさん
2009/09/09(水) 11:43:100349デフォルトの名無しさん
2009/09/09(水) 12:02:28「自分にはできないから言語が悪い」のですね。
わかります。
0350デフォルトの名無しさん
2009/09/09(水) 12:16:200351デフォルトの名無しさん
2009/09/09(水) 12:26:16CPANは管理者権限で利用するのが正統
0352デフォルトの名無しさん
2009/09/09(水) 13:13:10いいんじゃない言われても。馬鹿は放置するだけ。
0353デフォルトの名無しさん
2009/09/09(水) 15:03:460354デフォルトの名無しさん
2009/09/09(水) 15:11:09わかりました
諦めます
0355デフォルトの名無しさん
2009/09/09(水) 15:36:48use lib 'ディレクトリ';
のこと?
質問の意図がつかめない。
0356デフォルトの名無しさん
2009/09/09(水) 16:34:03いったいどこの3流学校でそんな事を習ったんだ?
0357デフォルトの名無しさん
2009/09/09(水) 16:46:300358デフォルトの名無しさん
2009/09/09(水) 18:24:290359デフォルトの名無しさん
2009/09/09(水) 19:25:450360デフォルトの名無しさん
2009/09/09(水) 19:31:170361デフォルトの名無しさん
2009/09/09(水) 19:37:56nullは無い。
defined($hoge)
で未定義をチェック。
0362デフォルトの名無しさん
2009/09/09(水) 19:38:34ありがとう。
久しぶりにperlをやったから、完全に忘れてる
0363デフォルトの名無しさん
2009/09/09(水) 22:15:590364デフォルトの名無しさん
2009/09/09(水) 22:18:43すぐカッコつけたがるよね、最近の若者は。
0365デフォルトの名無しさん
2009/09/09(水) 22:36:10カッコつける場合とつけない場合ってなに?
0366デフォルトの名無しさん
2009/09/09(水) 22:42:30本当に速いかわからないけど
0367デフォルトの名無しさん
2009/09/10(木) 00:19:45優先順位をはっきりさせたいとき。
好み。
0368デフォルトの名無しさん
2009/09/10(木) 00:26:44それ以来できる限り自然体でいようと思った
print (1 + 2) * 3, "\n";
0369デフォルトの名無しさん
2009/09/10(木) 00:28:04でも複数条件組み合わせるとか、後置ifの条件に入れるときは書きたい
まあ好みだな
0370デフォルトの名無しさん
2009/09/10(木) 02:13:48if (defind($i)) {ほげ}
ほげ if defind $i;
ほげ if defind($i);
if (i instanceof Object) ほげ;
if (i instanceof(Object)) ほげ;
if ($i >= 1 && $i <= 10) {ほげ}
if (($i >= 1) && ($i <= 10)) {ほげ}
0371デフォルトの名無しさん
2009/09/10(木) 03:03:380372デフォルトの名無しさん
2009/09/10(木) 03:30:32perlは文字と数値を区別しないんだから、区別したいケースが
あるとしたら、外部からのデータな訳だよね?それなら外部から
入力する時に文字をエスケープすれば良いだけじゃないの?
"123"→"%31%32%33",123→"123"とかして。
0373デフォルトの名無しさん
2009/09/10(木) 08:00:24JSONは通常文字入力をエスケープする仕様にはなってないので、
そういう迂回はすべきでない。
ぎゃーぎゃー騒いでたひと、しまいには
Perlで使うわけではないのにPerlでバリデーション処理したいという
訳のわからないことをいいだした。
重箱のスミつついて意味のない優越感に浸りたかったのだろう。
ほら、あれだ。
「俺の出身小学校からオリンビック選手が出たんだぜ。(俺って)スゲーだろ?」「お前んとこはしょぼいお笑いタレントしかでてないよな?俺の勝ちだな。」
ってレベルな感じ。
0374デフォルトの名無しさん
2009/09/10(木) 11:28:58かなり重症なC言語脳ですね。
視野が狭すぎますよ。
じぶんの殻に閉じこもりすぎです。
世間は広いんですよ。
もっと多くのものを見て聞いて学ぶべきですよ!
0375デフォルトの名無しさん
2009/09/10(木) 11:44:460376デフォルトの名無しさん
2009/09/10(木) 11:53:360377デフォルトの名無しさん
2009/09/10(木) 12:06:15ベタPerlを自認するRubyが?
0378デフォルトの名無しさん
2009/09/10(木) 12:07:49そうです!
リスプはカッコの多い言語ですって坂村先生がいってました!
0379デフォルトの名無しさん
2009/09/10(木) 13:24:09おいおい。それはもしかしてマジレスなのか?
0380デフォルトの名無しさん
2009/09/10(木) 14:38:13やってみれば分かると思うが、文法的にはRubyのが省略できる条件は制限されるよ
逆に、出来る場面は省略する人が多いけど
0381デフォルトの名無しさん
2009/09/10(木) 15:07:30えらく風呂敷広げたなw
0382デフォルトの名無しさん
2009/09/10(木) 16:13:150383デフォルトの名無しさん
2009/09/10(木) 16:29:23おいおい。それはもしかしてマジレスなのか?
0384デフォルトの名無しさん
2009/09/10(木) 16:42:53これ↓ができるのはPerl 6からでしょ?
if $x < 0 {
$y = 2;
$z = 3;
}
0385デフォルトの名無しさん
2009/09/10(木) 16:45:560386デフォルトの名無しさん
2009/09/10(木) 17:09:11こんなやつでしょ?
これはC++使いだけど特に気にならなかった。
要は三項演算みたいな感じだし
0387デフォルトの名無しさん
2009/09/10(木) 19:34:55結局ループになってしまったけど……
一応、該当があれば別のサブルーチンに飛んで、無い場合は最も近い配列の場所を見つけ出すようにしたつもり
既に配列(@hai)を取り込んであって $in が入れたい内容。
$min = 0;
$mid = 0;
$max = $hairetu - 1; # $hai〜は取得した配列の個数
if($max != 0 and $max != -1) {
while ($min <= $max) {
$mid = int(($min+$max)/2);
$space = $max - $min;
if($space == 2) {
last;
} elsif ($space == 3 ) {
if ($hai[$mid] >= $in) {
last;
} else {
$mid += 1;
last;
}
0388デフォルトの名無しさん
2009/09/10(木) 19:36:35if ($hai[$mid] lt $in) {
$min = $mid - '1';
} elsif ($hai[$mid] gt $in){
$max = $mid + '1';
} elsif ($hai[$mid] eq $in){
&・・・・・ #サブルーチンへ
last;
}
}
}
}
スペース消えてるけど、一応二分探索ループです……
>>198さんのような再帰はうまくつかえなかった……
0389デフォルトの名無しさん
2009/09/10(木) 23:35:57@array = (0, 1, 2);
に相当するようなことの書き方すら判らなくなってた
0390デフォルトの名無しさん
2009/09/11(金) 00:03:44配布する時は汎用モジュールと同じ様に
個人的なモジュールも CPAN に登録するの?
そのプログラムを使うユーザは
プログラムの入ったディレクトリ・ツリーごと扱って
$HOME/bin とかに入れたりするの?
コンパイルすれば単体の実行ファイルになって扱い易くなるだろうけど
ソースのまま配布したいんだけど……。
0391デフォルトの名無しさん
2009/09/11(金) 00:06:53つ perldoc lib
0392デフォルトの名無しさん
2009/09/11(金) 02:50:22use lib "$FindBin::Bin/lib";
とするか
use FindBin::libs;
でいけるんですね。
取っ掛かりが出来たので OOP だとどうなるのかとか
標準的なディレクトリ構成とかを調べて見ようと思います。
ありがとう。
0393デフォルトの名無しさん
2009/09/11(金) 07:50:59今CPANはネームスペースがアレなことになっているので、それだけはやめれ。手段ががいしゅつだから省く。
モジュール登録する時も、IRCなどで名前空間の妥当性とCPANに登録する必要性を審議しらもらってからにした方がいい。
0394デフォルトの名無しさん
2009/09/11(金) 07:53:17ファインチューニングしてないけど、こんな感じ?
sub bsearch($$;$$){
my ($a,$t,$s,$e)=@_;
$s=$[ if !defined $s;
$e=$#$a if !defined $e;
&subroutine if $$a[$s] == $t;
return $s if $s>=$e;
$m=floor(($s+$e)/2);
$x=bsearch($a,$t,$s,$m);
$y=bsearch($a,$t,$m+1,$e);
return ($a[$x]-$t < $a[$y]-$t) ? $x : $y;
}
0395デフォルトの名無しさん
2009/09/11(金) 09:06:50> &subroutine if $$a[$s
これは削除して呼び出し側でチェックしないとだめだわ。
でないと何度も呼ばれてしまう。
0396デフォルトの名無しさん
2009/09/11(金) 16:51:050397396
2009/09/11(金) 17:02:320398デフォルトの名無しさん
2009/09/12(土) 11:10:100399デフォルトの名無しさん
2009/09/12(土) 11:47:160400デフォルトの名無しさん
2009/09/12(土) 16:42:480401デフォルトの名無しさん
2009/09/12(土) 17:41:16それって結局「いかん根拠なんてないじゃん」という話じゃなかったか?
0402デフォルトの名無しさん
2009/09/12(土) 20:35:070403デフォルトの名無しさん
2009/09/12(土) 22:42:15(「ファイル名が長過ぎます」エラー等のperlの外の問題を切り離す事が出来ない。)
つー事で古くからの人間は「グロブなんざ使うんじゃねえ。」と言いがち。
で、それら諸先輩に影響を受けた人々が、本来の根拠と別に理由をこじつけ
「だからグロブは使いません!」って言ってる(人もいる)。
今となってはどっちでも良いんでねえの?10年以上前の常識だし、
俺はグロブ使わんけど。
0404デフォルトの名無しさん
2009/09/12(土) 23:31:36opendirはファイル名のみとりたいときに便利。
globはパスごととりたいとき便利。
0405デフォルトの名無しさん
2009/09/13(日) 00:38:38パスは自前で管理してファイル名とくっつけて開くのが当然だと思ってたけど、
別にそんなことしなくてもいいか
0406デフォルトの名無しさん
2009/09/13(日) 01:48:500407デフォルトの名無しさん
2009/09/13(日) 03:34:06404 Blog Not Found:perl - glob,readdir, and regexp
http://blog.livedoor.jp/dankogai/archives/51058540.html
0408400
2009/09/13(日) 08:39:410409デフォルトの名無しさん
2009/09/13(日) 11:02:010410デフォルトの名無しさん
2009/09/13(日) 11:58:280411デフォルトの名無しさん
2009/09/13(日) 12:55:27sub f1 { print "f1()¥n"; }
sub f2 { print "f2()¥n"; }
...
とあるときに、
my $func = "f2";
$func();
のように実行したいんですけど、できないでしょうか。
ちなみに $func() はシンタックスエラーになり、&$func() は use strict しているとエラーになりました。
0412デフォルトの名無しさん
2009/09/13(日) 13:15:31my $func = \&f2;
&$func();
もしunix環境があるなら man perlref を見るといいよ。
サブルーチンへの参照の扱いがいろいろ書いてあるから。
0413デフォルトの名無しさん
2009/09/13(日) 13:16:47その関数に限れば、
main->$func;
で呼べますが。
0414デフォルトの名無しさん
2009/09/13(日) 13:19:490415デフォルトの名無しさん
2009/09/13(日) 14:08:14>>412
関数名は変数で指定したいので、残念ながらその方法は使えないようです。
>>413
パッケージ名を指定すると呼び出せるのですか。なるほど。
パッケージ名が長いと面倒ですけど、この方法でやってみます。
0416デフォルトの名無しさん
2009/09/13(日) 14:34:00クラスメソッドとして呼び出してるから第一引数が
自動的に追加されるが、それでもいいのか?
#!/usr/bin/perl -w
use strict;
sub f1 { "f1()\n" }
sub f2 { 'f2(', join(',', map "'$_'", @_), ")\n" }
my %dt = (
f1 => \&f1,
f2 => \&f2,
default => sub { 'anonymous(', join(',', map "'$_'", @_), ")\n" },
);
my($func, @arg) = @ARGV;
print main->$func(@arg);
print $dt{ exists $dt{$func} ? $func : 'default' }->(@arg);
__END__
0417デフォルトの名無しさん
2009/09/13(日) 14:56:26{
no strict 'refs';
$func->();
}
0418デフォルトの名無しさん
2009/09/13(日) 17:17:12これでよければ簡単。
$func{f1}= sub { print "f1() n"; };
$func{f2}= sub { print "f2() n"; }
my $func = "f2";
$func{$func}();
0419デフォルトの名無しさん
2009/09/13(日) 18:25:33ドキュメントを見るかぎりにおいては、
use Text::MicroTemplate::File;
my $mt = Text::MicroTemplate::File->new(use_cache=>1);
$mt->render_file("example.mt", $arg1, $arg2);
のように、new() に use_cache=>1 を渡すだけでいいと思うのですが、
キャッシュファイルが作成されません。
またベンチマーク結果も、Template-Toolkitよりだいぶ遅いです。
Text::MicroTemplate の使い方を知っている人がいれば教えてください。
0420デフォルトの名無しさん
2009/09/13(日) 22:39:43AUTOROAD じゃダメなの?
0421デフォルトの名無しさん
2009/09/13(日) 23:48:59windows media encoderで映像をライブ中継したいのですが
ライブ中継中だけ、ブラウザにメディアプレイヤーが表示されるようにしたいです。
サーバ側のwindows media encoderが起動されていることがPerlで確認できれば
そのようなことが可能だとおもったのですが、そのような関数はありますか?
また、もっといい方法あったら教えていただきたいです。
0422デフォルトの名無しさん
2009/09/14(月) 00:54:50>scraper http://www.google.co.jp/webhp?hl=ja
としてscraperを立ち上げられるのですが
>chcp 65001
でコマンドプロンプトの文字コードを変更すると、
>scraper http://www.google.co.jp/webhp?hl=ja
を入力してもscraperが起動しません。
どうすればいいでしょうか?
Linuxのほうにもscraperを入れてみたのですがシェルから
$ scraper http://www.google.co.jp/webhp?hl=ja
と入力してもscraperは起動しませんでした
CPANは
perl -MCPAN -e shell
で起動するので
perl -MScraper -e shell
でやってみたのですが駄目でした
どなたかいいやりかた教えてください。
0423デフォルトの名無しさん
2009/09/14(月) 00:57:460424デフォルトの名無しさん
2009/09/14(月) 01:28:190425デフォルトの名無しさん
2009/09/14(月) 07:30:15ttp://www.google.co.jp/gwt/x?q=scraper&ct=res&oi=blended&sa=X&ei=HXCtSuCkE4b46wOr_pToAQ&cd=1&resnum=1&output=xhtml1_0&hl=ja&source=m&rd=1&guid=on&u=http%3A%2F%2Fe8y.net%2Fmag%2F013-web-scraper%2F
0426デフォルトの名無しさん
2009/09/14(月) 09:19:05ありがとうございます
Linuxはフォルダに移動してからscraper URIで起動できました。
>cd /usr/local/bin
>scraper http://www.google.co.jp/webhp?sourceid=navclient-ff
Windowsは
C:\Perl\bin\scraper.bat
を実行すればscraperは起動します
>chcp 65001
とした時点で
>cd C:\Perl\bin\
>scraper.bat URI
結果(エラーメッセージなし)
>
となってスルーされてしまいます。
Linuxで実行できるので、Windows側はもういいかなという感じです。文字化けが厄介なので。
0427デフォルトの名無しさん
2009/09/14(月) 11:03:490428デフォルトの名無しさん
2009/09/14(月) 14:20:02もちろん、名前空間的に危ういことは百も承知で。
用途としては、個人用のスクリプトでよく使う処理を纏めておきたいって感じです。
0429デフォルトの名無しさん
2009/09/14(月) 15:48:120430デフォルトの名無しさん
2009/09/14(月) 16:10:040431デフォルトの名無しさん
2009/09/14(月) 16:41:51Exporter使えばそんなに難しくないし。
0432デフォルトの名無しさん
2009/09/15(火) 02:50:59overload::StrValとかが何する関数か知りたいです
0433デフォルトの名無しさん
2009/09/15(火) 03:08:13http://perldoc.perl.org/overload.html#Public-functions
http://perldoc.jp/docs/modules/overload-1.06/overload.pod
0434デフォルトの名無しさん
2009/09/15(火) 04:10:080435デフォルトの名無しさん
2009/09/15(火) 09:29:23use、require、importと色々試しましたが最初の1回しか効かないような…?
とりあえず>>431に出ているExporterを覚えてみます。ありがとうございました。
…というか、色々探してたら
欲しい処理は既にCPANにあったと言うオチ…お騒がせしました。
0436デフォルトの名無しさん
2009/09/15(火) 14:35:00凝った事しない限り大抵そのオチだから気にしなくても。
0437デフォルトの名無しさん
2009/09/16(水) 08:50:40変なスレが上がってる
0438デフォルトの名無しさん
2009/09/16(水) 09:54:55私のような古代人が最近の Perl 5.10 くらいのモダンな Perl のコードを
書けるようになるのにおすすめの書籍やドキュメントがあれば教えてください。
0439デフォルトの名無しさん
2009/09/16(水) 11:31:39今風
ttp://perl-users.jp/modern_introduction_perl/
0441デフォルトの名無しさん
2009/09/16(水) 14:56:23本はモダンPerl入門かな。
ジュンク堂で一回りしてみたが、モダンPerlメインの書籍っつったら
これくらいしかなかった。良書とはいえないが悪書でもない。
5.005の国からやってきたのならお勧めする。
昨今のモダンPerl事情をすっげー主観入れて簡単にまとめると、
・とりあえずモダンPerlと言えばまずMooseありき。
・中規模以上のWebAppならMVCモデルWAF(Catalyst等)へ移行。
・DBICとかO/Rマッパ知っとけ(Schema::Loaderとか超楽)。最低限プレースホルダは使え。絶対使え。
・スケーラビリティ。AnyEvent, Coro, *::Async辺り押さえとけ。
・そろそろPerl6の準備を。Mooseの経験が生きる。来年1期にParrotが、2期にPerl6リリース予定(Dan Kogai)
・んでとにかくテスト書け。絶対書け。死んでも書け(Shawn Moore)。
0442デフォルトの名無しさん
2009/09/16(水) 19:29:520443デフォルトの名無しさん
2009/09/16(水) 19:51:100444デフォルトの名無しさん
2009/09/16(水) 20:00:47機能が絞られているとはいえ不自由した事全然無いし。
0445デフォルトの名無しさん
2009/09/16(水) 23:17:12ねー。まあ完全にOOへ移行したんだから仕方ないと思う。5のはやっつけなんちゃってOOだし。
bless実装だけでOO移行するとかLarryの頭の中はどーなってんだか。
>>443
誰かがそれ書いてたけどTTは重くて最近は評判悪いよ。
下手に高機能だからモデルとビューの分離に失敗しやすいし。
テンプレート重いのは致命的だし。
ClearSilverくらいがちょうどいい。
HTML::Templateは<>で囲っちゃいかんだろ。何文書かわからん。
TTは逆に意味不明な文字列扱いになってしまう。まあロジックだから
それでいいと考えることもできる。
CSは<?cs ... ?>で囲ってあるので一応お行儀が良い。
0446デフォルトの名無しさん
2009/09/16(水) 23:56:58いつの間にかC++やJavaの、クラスを作るあれがオブジェクト指向って
ことになってるけど、本来はオブジェクトを作れればオブジェクト指向
だったわけで、その辺りを垣間見れるのがいい
0447デフォルトの名無しさん
2009/09/17(木) 00:12:30別にTTは[% ... %]でなくてもいいってこと、たまには思い出してあげてください…
use Template;
my $tt = Template->new({ START_TAG => '<\?(?i:tt)', END_TAG => '\?>' });
$tt->process(\*DATA, { hello => 'Hello, Template Toolkit!' });
__DATA__
<html>
<head><title>TT Sample</title></head>
<body>
<p><?tt hello ?></p>
</body>
</html>
0448デフォルトの名無しさん
2009/09/17(木) 00:48:23これをfuncA()[1]と書くとエラーになり、funcA()->[1]と書くと想定した値は返って来ません。
my @ary = funcA(); $ary[1];だと想定通りの値を得ることができました。
関数が返すのがリストで、その一部のみが欲しい場合、一旦配列に格納するしか無いのでしょうか?
0449デフォルトの名無しさん
2009/09/17(木) 00:51:04欲しいのはその1要素のみです。スカラーコンテキストを仮定してます。
0450デフォルトの名無しさん
2009/09/17(木) 02:20:210451デフォルトの名無しさん
2009/09/17(木) 03:44:000452デフォルトの名無しさん
2009/09/17(木) 08:12:42一部ならこんなのもオケ。
> (funcA())[1,3,5]
spliceも使えるかも。
0453デフォルトの名無しさん
2009/09/17(木) 09:50:46行けました。ありがとうございます、こんな書き方が出来るなんて…
>>452
カッコエエw
0454デフォルトの名無しさん
2009/09/17(木) 09:54:55それがオプション1つで切り替えられるなら納得いくんだがな。
>>448
> (funcA())[1]
なぜ括弧が必要か?これは曖昧さ回避のために必要な構文。曖昧さとは、例えば
funcA (1,2,3)[1];
とした場合、(1,2,3)[1]が先にパースされて
funcA 2; -> funcA(2); # そんなつもりでは・・・。
とも解釈できる点。こういった経緯からパーサはfuncA()[1]のような構文を見つけるとエラーを返す。
なので明示的に関数呼び出しを括弧で囲って、funcA()の戻り値を配列として扱うことを示す必要がある。
(funcA(), funcB())[2, 4, 6, 8]
みたいなことも可能。どうしても括弧が嫌ならリファレンスを使う。
sub funcA{ [1, 2, 3] } のようにfuncAを変更すれば、
funcA()->[1];
みたいに出来る。これは文法に曖昧さがないため括弧は不要。
0455デフォルトの名無しさん
2009/09/17(木) 11:37:03解説ありがとうございます。別に括弧がイヤとかではないです。
自作関数では無いので、できれば関数の中身は変更したくなかったのです。
0456デフォルトの名無しさん
2009/09/17(木) 22:24:46この場合24-001-2009か26-001-2009のような連続した日と比較する場合、
24〜25-001-2009、25〜26-001-2009に置き換えたい
また、それ以外の日はは25-001-2009,27-001-2009のように値をコンマを付けて後ろに付けたい。
Splice(@list,n,1,$tikan);として、
配列から取り出して置換して元あった場所に戻したいんだけど、
ループさせるとうまく出来ない……どなたか何か教えていただけないでしょうか
なおnはループを回すごとに値が変わります。
0457デフォルトの名無しさん
2009/09/17(木) 23:10:48配列をスキャンしながら、その配列自体を変更するのは、
とくにその結果で要素が増減する場合は、たいてい面倒くさい処理が必要になる。
おれはそういうときは別の作業用配列にデータを作っていって、
最後にもとの配列に書き戻すようにする。
0458デフォルトの名無しさん
2009/09/18(金) 00:14:07日本語でオケ
0459デフォルトの名無しさん
2009/09/18(金) 02:06:39ちょっと簡略化したけどこういう感じ?ようわからんけど
my @month = qw(11-2009 12-2009 01-2010);
my $cmp = '10-2009';
my( $m1, $y1) = split '-', $cmp;
foreach(@month){
my( $m2, $y2) = split '-', $_;
if( $m2 - $m1 == 1 and $y2 == $y1){
$_ = "$m1〜$m2-". $y1;
}
elsif( $m2 - $m1 == -1 and $y2 == $y1){
$_ = "$m2〜$m1-". $y1;
}
else{
$_ = "$_, $cmp";
}
}
年とか違うけど1日違いだよってのには対応しなくていいんだよな?
0460デフォルトの名無しさん
2009/09/18(金) 12:37:10#!/usr/bin/perl
my @date = qw( 23-001-2009 25-001-2009 26-001-2009 27-001-2009 29-001-2009 30-001-2009 01-002-2009 03-002-2009 30-002-2009 31-002-2009 );
my (@copy, @stack, $mark) = @date;
foreach(@copy){ $_ = join("_", reverse split('-')) }
@copy = sort @copy;
while(1){
my ($cur, $nex) = splice @copy, 0, 2;
print @stack ? span(@stack) : $cur and last unless($nex);
if(eval($nex) - eval($cur) == 1 ){
@stack = @stack ? ($stack[0], $nex) : ($cur, $nex);
}else{
if(@stack){print span(@stack); @stack = (); $mark = 1}
print "$cur, " unless $mark;
$mark = 0;
}
unshift(@copy, $nex);
}
sub span{
my @stack = @_;
join('-', substr($stack[0], -2) . '〜' . substr($stack[1], -2), (split('_', $stack[0]))[1, 0]) . ", ";
}
0461デフォルトの名無しさん
2009/09/18(金) 12:41:262009_001_23, 25〜27-001-2009, 29〜30-001-2009, 2009_002_01, 2009_002_03, 30〜31-002-2009,
あー!何もせずにprint $curしてるとこが何箇所かあるからフォーマットがまちまちになっちまった。
まあsplitしてreverseしてjoinするだけだからそこんとこはなんとかしてくれ。
0462デフォルトの名無しさん
2009/09/18(金) 12:53:44#!/usr/bin/perl
my @date = qw( 23-001-2009 25-001-2009 26-001-2009 28-001-2009 29-001-2009 30-001-2009 01-002-2009 03-002-2009 30-002-2009 31-002-2009 );
my (@copy, @stack, $mark) = @date;
sub day{substr($_[0], 0, 2)}
sub span{join('-', day($_[0]).'〜'.day($_[1]), (substr($_[0], 4))) . ", "}
while(1){
my ($cur, $nex) = splice @copy, 0, 2;
print @stack ? span(@stack) : $cur and last unless($nex);
if(day($nex) - day($cur) == 1 ){
@stack = @stack ? ($stack[0], $nex) : ($cur, $nex);
}else{
if(@stack){
print span(@stack);
@stack = (); $mark = 1;
}
print "$cur, " unless $mark;
$mark = 0;
}
unshift(@copy, $nex);
}
0463デフォルトの名無しさん
2009/09/18(金) 14:12:39@dts作る時にmap使いたかったんだけど、あり得ない日付の時のこと考えるとundef入っちゃうからできなかった
use strict; use warnings;
use utf8;
use DateTime;
use DateTime::Format::Strptime;
my @date = qw( 23-001-2009 25-001-2009 26-001-2009 28-001-2009 29-001-2009 30-001-2009 01-002-2009 03-002-2010 30-002-2010 31-002-2010 );
my $pattern = '%d-0%m-%Y';
my $fmt = DateTime::Format::Strptime->new( pattern => $pattern, time_zone => 'Asia/Tokyo', );
my @dts;
for (@date) {
my $dt = $fmt->parse_datetime($_);
push @dts, $dt if $dt;
}
my @res_dts;
my $pre_dt;
for my $i (0 .. $#dts) {
my $dt = $dts[$i];
if ($i != 0) {
my $duration = $dt - $pre_dt;
if ( ($duration->delta_days == 1) && ($duration->delta_months == 0) ) {
push @res_dts, $pre_dt->day . "〜" . $dt->strftime($pattern);
}
else {
push @res_dts, $pre_dt->strftime($pattern) . "," . $dt->strftime($pattern);
}
}
$pre_dt = $dt;
}
warn join "\n", @res_dts;
0464デフォルトの名無しさん
2009/09/18(金) 14:29:00〜で繋ぐのは年月同じ、日1日ずれのみ、他は全部,で繋いで、年月日全部同じは置換しない
20〜23のような時に、21や22と比較する場合は置換しない
置換する方の配列で置換される要素はループ1回につき1つだけです
どれとどれが比較されるかはループ1回ごとに別に作成した条件式で決定されています
ここの処理で一週間詰まってるんです……どうかお願い致します
0465デフォルトの名無しさん
2009/09/18(金) 15:35:47お前、もうこっち来い
Perlでリクに答えるスクリプトを作るスレ
http://pc12.2ch.net/test/read.cgi/tech/1086143976/
で、日本語がよくわからないから
入力:ほげほげ
出力:ほげほげ
って感じで具体例のパターン書いて
0466デフォルトの名無しさん
2009/09/18(金) 17:42:31こうか?
ある配列に 25-001-2009 の形の 日-月-年データがある。
その配列データに対して以下の処理をし、結果をもとの配列にいれたい。
データが24-001-2009、25-001-2009のように2連続の日の場合は、
24〜25-001-2009に置き換えたい。
それ以外は、25-001-2009,27-001-2009のように月毎にまとめ、値をコンマを付けて後ろに付けたい。
あと2,3条件があるだろ?
すくなくともデータが
24-001-2009
25-001-2009
26-001-2009
28-001-2009
という場合はどうしたいかとか決まらないと実装できない。
0467デフォルトの名無しさん
2009/09/18(金) 22:19:150469デフォルトの名無しさん
2009/09/19(土) 00:34:39バッチジョブを管理したいのですが、
ジョブが結構増えてきてcrontabをこれ以上汚したくないなと。
YAMLとかでジョブ管理出来たら綺麗かなーと思ったのです…。
0470デフォルトの名無しさん
2009/09/19(土) 04:55:470471デフォルトの名無しさん
2009/09/19(土) 05:45:0525-001-2009 26-001-2009 27-001-2009 28-001-2009 29-001-2009 30-001-2009 01-002-2009
ときた場合どうなる?値は配列にだけ入ってるんだよな。ソートはされてるのか?
> 置換する方の配列で置換される要素はループ1回につき1つだけです
> どれとどれが比較されるかはループ1回ごとに別に作成した条件式で決定されています
ここ日本語に翻訳してくれ。それかソース晒してくれ。
俺かなり頑張ったんだが違いますごめんなさいだとかなり凹む。
0472デフォルトの名無しさん
2009/09/19(土) 05:50:54こんなんなるぞ。
23-001-2009,25-001-2009
25〜26-001-2009
26-001-2009,28-001-2009
28〜29-001-2009
29〜30-001-2009
俺がunshiftしたりごにょごにょしてるのはこれ防ぐため。
0473デフォルトの名無しさん
2009/09/19(土) 07:01:20例えば以下のような書式の日付を集めた配列があるとする。
@dates = qw(
24-001-2009
25-001-2009
26-001-2009
28-001-2009
);
ある条件によって、追加する要素と追加される要素が1つずつ選ばれる。
例えば、
追加する要素:$dates[1] #=>25-001-2009
追加される要素:$dates[2] #=>26-001-2009
とすると、この場合、日付が1日違いなので、追加される要素は、
$dates[2] = 25〜26-001-2009
のように置換する。置換をするのは追加される要素だけである。
この結果、元の配列を以下となる。
@dates = qw(
24-001-2009
25-001-2009
25〜26-001-2009
28-001-2009
);
0474デフォルトの名無しさん
2009/09/19(土) 07:02:20例えば、
追加する要素:$dates[0] #=>24-001-2009
追加される要素:$dates[3] #=>28-001-2009
が選ばれたとすると、日付が1日違いでないので、「,」でくっつけたので置換する。
単純に「28-001-2009,24-001-2009」と後ろにくっつけるのか、それとも、昇順にして
「24-001-2009,28-001-2009」とするのかは定かでないが、多分、昇順にするのであろう。
結果、元の配列は以下となる。
@dates = qw(
24-001-2009
25-001-2009
25〜26-001-2009
24-001-2009,28-001-2009
);
次は、
追加する要素:$dates[1] #=>25-001-2009
追加される要素:$dates[3] #=>24-001-2009,28-001-2009
結果、
@dates = qw(
24-001-2009
25-001-2009
25〜26-001-2009
24〜25-001-2009,28-001-2009
);
0475デフォルトの名無しさん
2009/09/19(土) 07:03:01追加する要素:$dates[0] #=>24-001-2009
追加される要素:$dates[3] #=>24〜25-001-2009,28-001-2009
この場合、「$dates[3] #=>24〜25-001-2009,28-001-2009」に「$dates[0] #=>24-001-2009」
が含まれているので何もしない。
0476デフォルトの名無しさん
2009/09/19(土) 08:00:05use Test::Simple tests => 3;
のように、「use パッケージ名」のあとに引数を指定できるようにしたいのですが、
useで指定した引数ってどうやって参照すればいいのでしょか。
(@_や@ARGVを試してみましたが、違うようです。)
よろしくお願いします。
0477デフォルトの名無しさん
2009/09/19(土) 08:05:51とだいたい同じこと
0478デフォルトの名無しさん
2009/09/19(土) 08:31:50仕組みを聞いているんじゃなくて、方法を聞いているんですけど。
じゃあ質問を変えます。importの引数はどうやって参照できますか。
たとえば「import Test::Simple tests=>3」のようにあったとして、Test::Simpleパッケージから「tests=>3」を参照する方法を教えてください。
ググったところ、「importの引数は@EXPORTや@EXPORT_OKに指定したものでインポートしたいものを指定する役割をもつ」と
いうような説明があったのですが、この説明ではimportの引数を参照する方法がわかりませんでした。
0479デフォルトの名無しさん
2009/09/19(土) 08:50:27package Unko;
sub import {
for(;;) { print @_; }
}
return 1;
use Unko unko => "unko";
0480デフォルトの名無しさん
2009/09/19(土) 09:27:17import呼ばれるんだからimport定義すればいいだけだろ。頭悪いの?
0481デフォルトの名無しさん
2009/09/19(土) 09:37:11イメージではこっちが分かりやすいかも。
0482デフォルトの名無しさん
2009/09/19(土) 11:01:3524〜25-001-2009,28-001-2009に
27-001-2009が来たら、
24〜25-001-2009,27〜28-001-2009になるのか?メンドクサイなあ。同じく
23-001-2009が来たら、
23〜25-001-2009,28-001-2009になるの?
26-001-2009,28-001-2009に
27-001-2009がきたらどーすんのよ。
ルールが複雑すぎて正規化できないし、
ちょっとここでどうにかするproblemじゃない気がするんだが。
どっかに発注した方が早い気がする。って受注してるから困ってるんだよなww
>>478
> 仕組みを聞いているんじゃなくて、方法を聞いているんですけど。
普通の人ならこの一言で一発で教えてやる気なくなるわな。
なんで誰もちゃんと教えてくれないかわかってないんだろ。
1つ勉強になったな。
関数の引数を参照する方法が分からないレベルなら、
Exporterはもうちょっと勉強してからいじった方がいいと思うな。
0483デフォルトの名無しさん
2009/09/19(土) 11:23:55ありがとう。試してみます。
0484デフォルトの名無しさん
2009/09/19(土) 11:31:16Test/Simple.pmにimport関数を作る。
-- Test/Simple.pm --
sub import {
print @_;
goto &{Test::Builder::Module::import}; #=>本来呼ばれるべきimport関数に飛ばす
}
@_の第1引数にパッケージ名(Test::Simple)が入っており、それ以降に use で指定した引数
が入っている。
0485デフォルトの名無しさん
2009/09/19(土) 12:12:54CPANモジュールの中いじっちゃダメだろw
0486デフォルトの名無しさん
2009/09/19(土) 12:34:31そうだね。
ごめん、ごめん。
>>484でなく、以下を追加する。
BEGIN {
package Test::Simple;
sub import {
print "@_";
goto &{Test::Builder::Module::import};
}
}
0487デフォルトの名無しさん
2009/09/19(土) 12:53:08ありがとうございます!
import って関数なんですか?Perlの予約語だと思ってました。
477で
>import Test::Simple tests => 3
のような書き方をしているんですけど、Test::Simpleのあとにコンマがない呼び出し方って、
予約語じゃなくてもできるんですか。Perlすごい。
あと、importを自分で定義すると use Exporter 'import' とバッティングしてしまうようなんですけど、
これは仕方ないことでしょうか。
>>480
頭は悪いです。すみません。
importは予約語だと思ってたので、再定義するという発想はありませんでした。
Perlは特殊変数が多いから、useの引数もきっと特別な変数かなんかで参照できるのだろうと思ってました。
やっぱりPerlは頭がいい人のための言語ですね。低能には難しすぎる。
0488デフォルトの名無しさん
2009/09/19(土) 13:08:52数字のとこだけなら、1行で取り出せるよ。
ずっとソース読んでたw
>>487
> あとにコンマがない呼び出し方って、 予約語じゃなくてもできるんですか。
sub hello{print @_} hello 'a';
最初から何もしなくても出来るよ。
>バッティング
それをオーバーライドという。オブジェクト志向における正しい挙動。
仕方ないんじゃなくてそれで合ってる。
> useの引数もきっと特別な変数かなんかで参照できるのだろうと思ってました。
なかなかいい勘をしていらっしゃる。必ず参照できるとは限らないけどね。この場合なら数字んとこは取れるよ。
0489デフォルトの名無しさん
2009/09/19(土) 13:09:340490デフォルトの名無しさん
2009/09/19(土) 13:25:290491デフォルトの名無しさん
2009/09/19(土) 13:26:05数字はどこかのパッケージ変数に入ってるの?
0492デフォルトの名無しさん
2009/09/19(土) 13:55:57そのハッシュの浅いコピーのリファレンスを得る良い方法があれば教えてください。
my $foo = {};
my $bar = {%{$foo}};
とかいうのは思い付いたんですが、
もっとシンプルかつ明解で効率良くモダンでよりスマートでスタイリッシュな方法が
あればお願いします。
0493デフォルトの名無しさん
2009/09/19(土) 16:45:47ourな変数(オブジェクト)に入ってる。ソース読めば分かる。
>>492
日本語がよくわかんないです。
0494492
2009/09/19(土) 17:24:49すみません、 >>492 の後半は、
「ほかにもっとマシな、あるいは俺ならこうする、という方法があれば教えてください」
ということで、ひとつよろしくお願いします。
0495デフォルトの名無しさん
2009/09/19(土) 20:11:31いや、だから何をしたいのか分からないよその文章じゃ。
例もデリファレンスしてまたリファレンス作ってるだけだし
なにがやりたいんだか不明。
0496デフォルトの名無しさん
2009/09/19(土) 21:45:09意味不明
0497デフォルトの名無しさん
2009/09/19(土) 21:55:00>>460-462さんのを参考に、>>473-475さんの仕様をもとに作成した。
use Data::Dumper;
my @dates = qw( 24-001-2009 25-001-2009 26-001-2009 28-001-2009 );
print Dumper \@dates;
for (0..10) {
my ($index_add, $index_added) = (int rand @dates, int rand @dates);
my ($date_add, $date_added) = ($dates[$index_add], $dates[$index_added]);
print "\n[$index_add:$date_add] => [$index_added:$date_added]\n";
splice @dates, $index_added, 1, form_date( breakup_date($date_add), breakup_date($date_added) );
print Dumper \@dates;
}
sub breakup_date {
my @dates;
for my $date ( split /,/, $_[0] ) {
if ( $date =~ /^(\d+)〜(\d+)(.*)/ ) {
push @dates, map{ $_ . $3 } $1..$2;
} else {
push @dates, $date;
}
}
@dates;
}
0498デフォルトの名無しさん
2009/09/19(土) 21:55:44sub form_date {
my (@formatted_dates, @stack);
my @sorted_dates = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [$_, join '-', reverse split /-/] } @_;
for my $i (0..$#sorted_dates) {
my ($cur, $next) = ($sorted_dates[$i], $sorted_dates[$i+1]);
next if $next and $cur eq $next;
if ( $next and eval "($next) - ($cur)" == 1 ) {
@stack = @stack ? ($stack[0], $next) : ($cur, $next);
} else {
if (@stack) {
$stack[0] =~ s/(?<=^\d{2})/'〜' . substr($stack[1], 0, 2)/e;
push @formatted_dates, $stack[0];
@stack = ();
} else {
push @formatted_dates, $cur;
}
}
}
join ',', @formatted_dates;
}
0499デフォルトの名無しさん
2009/09/19(土) 22:06:09ありがとうございます!import関数を定義して、その中でgotoを使えばいいんですね。
gotoとか知らなかったので、import関数を定義しただけでは立ち往生してしまうところでした。
>>488
>sub hello{print @_} hello 'a';
>最初から何もしなくても出来るよ。
関数名と最初の引数との間のコンマは省略できるのは知っています。
そうじゃなくて、import test::Simple tests=>3 のような書き方だと、第1引数と第2引数の間の
コンマも省略されていて、これは「何もしなくても出来る」ことはないからimportは予約語だと思ってました。
> それをオーバーライドという。オブジェクト志向における正しい挙動。
この場合はオーバーライドはまったく関係ないと思います。理由は継承関係を設定してないからです。
use Exporter 'import'; としただけでは継承関係は設定されませんよね?だからオブジェクト指向でいうオーバーライドとは関係ないんじゃないでしょうか。
>>482
>普通の人ならこの一言で一発で教えてやる気なくなるわな。
>なんで誰もちゃんと教えてくれないかわかってないんだろ。
>1つ勉強になったな。
ちゃんと教えてくれる親切な人は他にいたので助かりました。
あとimportが予約語じゃないというのはひとつ勉強になりました。
0500デフォルトの名無しさん
2009/09/19(土) 22:20:44標準の関数にならい、pushとpopを定義しました。
その中で標準のpushとpopを使うために、main::pushやmain::popと書いたのですが
Undefined method &main::push などと言われてしまいます。
どのように書けば良いのでしょうか?
0501デフォルトの名無しさん
2009/09/19(土) 22:30:41これを実行すればわかるんじゃないかな?
package foo;
sub func { print "@_\n" }
func foo 1, 2;
foo->func(1, 2);
0502デフォルトの名無しさん
2009/09/19(土) 22:41:31こうすれば引数の内容をmainでも参照できるようになるよ。
use strict;
use warnings;
BEGIN {
package Test::Simple;
sub import {
{
no strict 'refs';
@{caller().'::test_args'} = @_[1..$#_];
}
goto &{Test::Builder::Module::import};
}
}
use Test::Simple tests => 3;
our @test_args;
print "args = @test_args\n";
0503デフォルトの名無しさん
2009/09/19(土) 23:23:31(ユーザ定義でない)組み込み関数を使うならCORE::popとかCORE::pushとか。
0504492
2009/09/20(日) 00:20:11うーん、コピーしたハッシュのデータのリファレンスを得たいのです。
> 例もデリファレンスしてまたリファレンス作ってるだけだし
いや、そうはなってないと思うんですが。
my $foo = {};
printf "%s %s %s\n", $foo, \%{$foo}, {%{$foo}};
# => HASH(0x8103a48) HASH(0x8103a48) HASH(0x81038e0)
$foo をデリファレンスしてまたリファレンス作った \%{$foo} は $foo と同一オブジェクトですが、
{%{$foo}} の方は $foo とは異なるオブジェクトになっていると思います。
後者のように、値がコピーされた別のオブジェクトを得たいです。
>>496
浅いコピー (shallow copy) って普通に言わないですかね?
0505デフォルトの名無しさん
2009/09/20(日) 01:23:54> my $bar = {%{$foo}};
> もっとシンプルかつ明解で効率良くモダンでよりスマートでスタイリッシュな方法が
いや、それで十分「シンプルかつ明解で効率良くモダンでよりスマートでスタイリッシュな方法」なんだが。
敢えて添削するなら括弧を1組み省略できる。
my $bar = {%{$foo}};
↓
my $bar = {%$foo};
この辺りのリファレンス/デリファレンス、複合データ構造に関しては、オライリーの「プログラミングPerl」を読めば最低限の基礎情報は書いている。
さらに深く知りたければ「実用Perlプログラミング第1版」を読めばいいよ・・・と言いたいが、日本のお馬鹿な書店は「第1版」とは別物の「第2版」(第1版の追補版であって、改訂版ではない)しか置いてないから残念でした。
まー図書館とかを探してくれ。
0506デフォルトの名無しさん
2009/09/20(日) 06:24:05import Test::Simple test => 3 は print FH 'hoge' と同じ構文
ちなみに new Hoge::Huga 'foo' と書けるけど、newはただの関数名だったりするのと同じ
それから別に @ISA にパッケージ名をぶちこむのだけが継承でないし、new するだけがオブジェクト指向ではない
もっと概念的なものだ
あと一言いわせてもらうと余計な一言が多い
0507デフォルトの名無しさん
2009/09/20(日) 09:30:28いや、そのスキルでgotoとか覚えるなよ。
一回脳から消せ。ろくなことがない。
> これは「何もしなくても出来る」ことはないから
package Bob;
sub run{print "Bob ran $_[1].\n"}
package main;
run Bob 'away'; # ここ
--
Bob ran away.
どこが?
> ちゃんと教えてくれる親切な人は他にいたので助かりました。
CPANモジュールの名前空間いじっていじるのが「ちゃんと」なのかw
正直君のレベルでああいうハックを覚えるとろくなことがない。忘れろ。
もちっとマシな解答は別にあるし誰も答えてくれてないようだな。
> この場合はオーバーライドはまったく関係ないと思います。理由は継承関係を設定してないからです。
えっと、何のこと?ほんと一言多い人だな。
--- Test::Simple --
use Test::Builder::Module;
our @ISA = qw(Test::Builder::Module);
---Test::Builder::Module;
require Exporter;
our @ISA = qw(Exporter);
>>502
おまいらいい加減素人にgoto教えるの止めろ。
0508デフォルトの名無しさん
2009/09/20(日) 09:36:500509デフォルトの名無しさん
2009/09/20(日) 09:38:30出来ました。COREというパッケージがデフォルトで読まれているのですね。
手元のラクダをよく読んだらCORE擬似パッケージと書いてありました…読み込みが足りなかったようです。
精進します、ありがとうございました。
0510デフォルトの名無しさん
2009/09/20(日) 09:39:41ああ、同じ人か。普通のことのように書くなよ。素人相手にCPANモジュールの名前空間汚す
ようなdirtyなハック教えて「できるようになるよ。 」じゃねーだろ。どんだけ無邪気だよ。
大規模開発の末端プログラマだったらどうすんだ?相手のレベルみて話しろ。他が迷惑するだろ。
Test::Simpleの挙動が変 -> Test::Simpleを再インストール -> 状況変わらず の不条理ループ開始。
0511デフォルトの名無しさん
2009/09/20(日) 09:40:120512デフォルトの名無しさん
2009/09/20(日) 09:42:49極力避けるべき方法だし、この人はsubとgotoの違いほとんど分かってないだろ。
そんな人に教えちゃダメだ。多分ここがなぜsubじゃなくgotoか説明できないと思われ。
0513デフォルトの名無しさん
2009/09/20(日) 09:56:19だろ?俺はこの15年でgotoなんかプロダクトに使ったことなんかないぞ。
汚いことするからgotoが出てくる。その辺は分かるだろ?
例えばCatalystは61ファイル中1回もgoto使ってないぞ。
CPANを見渡すと、スピードがネックになるようなものや、コアな部分に触れるようなモジュールにgotoが多い。
でもYAMLで1回、Mooseで8回だ。素人が使うもんじゃないことくらいわかるはず。
>>478
> たとえば「import Test::Simple tests=>3」のようにあったとして、Test::Simpleパッケージから「tests=>3」を参照する方法を教えてください。
この時点で「普通はできません」と答えなかった住人の責任でもあるな。俺も含め。
0514デフォルトの名無しさん
2009/09/20(日) 10:21:29で自動的にshinki.htmlを作ってに書き込むようにしてるんだけど
下に自動的にフォルダも作って test/shinki.html
に書き込むようにするにはどう書けばいいですか?
0515デフォルトの名無しさん
2009/09/20(日) 10:40:540516デフォルトの名無しさん
2009/09/20(日) 11:06:39名前空間は汚さないが残念ながらエレガントな方法はない。また素人が真似するといかんので、
ヒントはTest::Builderが大事なものをourしちゃってるとこだ。ソース見れば一発で分かる。
正直相手が素人だと分かりきってるのに>>502のような方法を提示する人の気が知れん。
○○に刃物って言葉があるだろ。この素人さん、今後もつまらんことで他人のモジュール
の内臓いじくりまわすに100ペリカ。困ったらgotoもすぐ発動するだろうな。
0517デフォルトの名無しさん
2009/09/20(日) 11:09:180518デフォルトの名無しさん
2009/09/20(日) 11:17:58正解が出ないからって拗ねるな。
0519デフォルトの名無しさん
2009/09/20(日) 11:51:51かいとう: 改札口を突破して猛ダッシュしろ
まいらのやってることは、こんなレベル
0520デフォルトの名無しさん
2009/09/20(日) 12:02:03バカなのはオライリーだろ。
中身が全然違う本を同じ題名で出す意味がない。
0521デフォルトの名無しさん
2009/09/20(日) 12:09:28おれはそういうとき自力でフォルダを作ってるけど。他に方法あるのかな
my $filepath = "test/shinki.html";
use File::Path;
use File::Basename;
File::Path::make_path( File::Basename::dirname($filepath) );
open(NEWFILE, ">$filepath");
0522デフォルトの名無しさん
2009/09/20(日) 12:28:34exeファイルを作成した際
元のスクリプトにuse Encode;を使用していると
exeファイル実行時に
プロシージャエントリポイントPerl_croak_xs_usageがダイナミックリンクライブラリperl510.dl
から見つかりませんでした
とerrorが出るのですが解決方法(エラー文自体理解できてませんが)はありますでしょうか?
0523デフォルトの名無しさん
2009/09/20(日) 13:12:38はげどー。
>>521
それが模範回答じゃないかなぁ。まあ他にモジュールがあるかも知れんが。
それか
$filepath ~= s#([^/]+)$##;
$filename = $1;
system("mkdir -p $filepath");
って良い子は真似すんなよ。
0524デフォルトの名無しさん
2009/09/20(日) 20:17:07use Path::Class::Dir;
my $d = Path::Class::Dir->new('test', 'foo', 'bar');
$d->mkpath;
my $f = $d->file('shinki.html');
my $fh = $f->openw;
0525デフォルトの名無しさん
2009/09/21(月) 06:32:33use utf8;
use open IO => "encoding(cp932)";
use open ":std";
use Encode;
でもいいんですかね?
0526デフォルトの名無しさん
2009/09/21(月) 07:45:26> それか
> system("mkdir -p $filepath");
mkdir $filepath;
0527デフォルトの名無しさん
2009/09/21(月) 10:49:54それだと深いディレクトリ作れないだろ。./test/が存在しないときに./test/test2/test3/とか作れない。
0528デフォルトの名無しさん
2009/09/21(月) 11:48:000529528
2009/09/21(月) 11:48:410530デフォルトの名無しさん
2009/09/21(月) 11:56:45一箇所コロンが抜けてる……けど、無くても動くっぽい?
use open IO => ":encoding(cp932)";
ファイルのエンコーディング設定も入るから、そこは注意。
0531デフォルトの名無しさん
2009/09/21(月) 13:49:14system('mkdir -p a/b/c/d'); #Active Perl o / コマンドプロンプト x
system('mkdir -p a\z\x\y'); #Active Perl o / コマンドプロンプト o
system('mkdir b/b/c/d'); #Active Perl x / コマンドプロンプト x
system('mkdir b\z\x\y'); #Active Perl x / コマンドプロンプト o
x -- エラー
o -- 成功
sysytem 関数とコマンドプロンプトでは、若干の違いがあるんだね。
0532デフォルトの名無しさん
2009/09/21(月) 14:16:06Windowsでmkdirに-pオプション付けると
"-p"って名前のフォルダが作られない?
うちでは作られた
0533デフォルトの名無しさん
2009/09/21(月) 15:15:24コロンが抜けていたのは自分のタイポですね。
すみません。
open.pmを見てみると、
$layer =~ s/^://;
と、コロンを消してから処理をしているように見えます。
結局、コロンはあってもなくてもいいのかな?
0534デフォルトの名無しさん
2009/09/21(月) 18:02:29付いてなくても動くかも知れないけど、PODでは付けることになってるし、
明文化されてない部分だから、付けといた方がいいと思う。
0535デフォルトの名無しさん
2009/09/21(月) 20:50:57> >526
> それだと深いディレクトリ作れないだろ。./test/が存在しないときに./test/test2/test3/とか作れない。
> $filepath ~= s#([^/]+)$##;
> $filename = $1;
> system("mkdir -p $filepath");
どーなんだろー?
0536デフォルトの名無しさん
2009/09/21(月) 22:11:09言う前にやってみろよw
UN*X標準のmkdirはデフォルトでは1つのディレクトリしか作れないから。
0537デフォルトの名無しさん
2009/09/22(火) 00:02:13外部コマンドを利用する場合は特に、利用している OS などの環境を明確にしないと、
延々と話が噛み合わないで平行線を辿ると思う。
しかし、 >>531 を見ると、まあ言われてみれば納得できる挙動ではあるんだけど、
ActivePerl にはかなり黒魔術が入ってそうだねえ。
てか、折角 Perl はそういう OS の差異を吸収する層たり得るソフトウェアなんだから、
Perl でできることは極力 Perl でやるべきかと。
0538デフォルトの名無しさん
2009/09/22(火) 09:08:48そうですね
0539デフォルトの名無しさん
2009/09/22(火) 13:08:17文字列の入出力をする方法はどのようにするのでしょうか?
Entryウィジェットを使ったサンプルはWeb上から見つけたのですが、
Textウィジェットを用いたものはないもので。。。
0540デフォルトの名無しさん
2009/09/22(火) 16:51:57$text->delete('1.0', 'end'); # テキスト全て削除
$text->insert('end', $string); # 終わりから文字挿入
$string = $text->get('1.0', 'end'); # テキスト全て取得
ttp://www.shido.info/py/tkinter12.html
http://search.cpan.org/~srezic/Tk-804.028/pod/Text.pod
Indexは #INDICES 辺りを参照で。
0541デフォルトの名無しさん
2009/09/22(火) 21:06:14スマートな書き方ってないんですかね?
Perlについての質問箱 12箱目
http://pc5.2ch.net/test/read.cgi/tech/1094579428/941
941 名前:デフォルトの名無しさん[] 投稿日:04/10/14 18:57:50
条件によって、関数に渡す引数の数が違う場合
たとえば
my $obj;
if (/condition/) {
$obj = Class->new(ARG_0 => "a", ARG_1 => "b", ARG_2 => "c",);
}
else {
$obj = Class->new(ARG_0 => "a", ARG_1 => "b",);
}
という具合の書き方をいつもしているのですが
なんだか重複した記述が多いし、もうちょっとスマートな書き方がないものかと
いつもうんざりしています。
こういう場合の定石パターンってなにかあるのでしょうか。
皆さんどうコーディングされてます?
0542デフォルトの名無しさん
2009/09/22(火) 21:27:52$args{ARG_2} = 'c' if CONDITION;
my $obj = Klass->new(%args);
って通るのかしら?
0544デフォルトの名無しさん
2009/09/22(火) 22:03:42重複しないことが必ずしもスマートとは限らない。
現状のままの方が読みやすい気がする。
0545デフォルトの名無しさん
2009/09/22(火) 22:19:16若造がいきがってムチャしてる、って感じがするな。
後々のことを考えてるのかな。
その場かぎりの使い捨てコードならソレでもいいかもしれないけど。
0546デフォルトの名無しさん
2009/09/22(火) 22:48:50my $obj = Class->new( /condition/ ? @params[0..3] : @params[0..5] );
0547デフォルトの名無しさん
2009/09/22(火) 23:09:07もういいからやめろ
0548デフォルトの名無しさん
2009/09/22(火) 23:32:46本当にARG_2がoption的な要素なら、
my %opt = (
ARG_2 => 'c'
) if /condition/;
my $obj = Class->new(
ARG_0 => "a",
ARG_1 => "b",
%opt,
);
って書き方するかなぁ。
そうじゃないなら>>544の言う通り、そのままの方がメンテしやすい
0549デフォルトの名無しさん
2009/09/23(水) 00:57:59【緊急情報カクサンよろしく】
ついに来ました。
大きい動きです。250nT超えてきました。ほぼ間違いありません。もう一度言います。
友人、知人、親類縁者、あらゆるつながりを駆使して巨大地震がくることを教えて下さい。
四川地震より大きいのが来る可能性があります。
http://g★olde★ntam★atama.b★lo★g84.fc2.c★om/
★★★★★危険度MAX★★★★★
★★★★★★★★★★★★★★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★★★★★★★★★★★★★★★★
★★★★★危険度MAX★★★★★
警告!連休中の21、22、23日が危ない!かも2
http://live24.2ch.net/test/read.cgi/eq/1★253494015/
【大気イオン】e-PISCO Part11【また延長】
http://live24.2ch.net/test/read.cgi/eq/1★252991726/
本当に地震が来たら、犯人は特権階級全員だということ2
0551デフォルトの名無しさん
2009/09/23(水) 07:56:280552デフォルトの名無しさん
2009/09/23(水) 13:49:46もし毎回同じパラメータ渡してるなら、サブルーチンの受け取るパラメータを直す。
それが難しければ、ラッパーをかます。
ベタウチはバグの元。
プログラム書法にも書かれてる。
「汚れ仕事は機械にやらせよう」
ただし、同書は冒頭で戒めてるので注意。
「わかりやすく書こう。うますぎるプログラムはいけない」
根拠は可読性とメンテナンス性。
0553デフォルトの名無しさん
2009/09/23(水) 17:32:22my $data = do{local $/; <$fh>};
と、こっち↓
read $fh, my $data, -s $fh;
では、どちらを使うのがいいのでしょうか?
0554デフォルトの名無しさん
2009/09/23(水) 17:48:49どっちもだめ。
【理由】意図不明
0555デフォルトの名無しさん
2009/09/23(水) 17:52:10効率はやや上のほうがよさそうだけど。下はファイルサイズ調べに行かなきゃならんわけだし
0556デフォルトの名無しさん
2009/09/23(水) 18:24:04これを意図不明って、絶望的にPerlのスキルが足りないんじゃね?
0557デフォルトの名無しさん
2009/09/23(水) 19:58:27ネットの勉強がてらに作ったモノです
友人に見せたら汚いコードだと言われました
どこあたりがおかしいのでしょうか
0558デフォルトの名無しさん
2009/09/23(水) 21:09:19ベンチマークを取ってみた。
Windows XP SP2、ActivePerl 5.8.8
_______________________________________________________________
use Benchmark qw(:all);
my $file = 'jcode.pl'; # 21,876bytes、785行
my $r = timethese( 10000,
{
'local $/' => sub {
open my $fh, $file or die $!;
my $data = do { local $/; <$fh> };
},
'read' => sub {
open my $fh, $file or die $!;
read $fh, my $data, -s $fh;
}
});
cmpthese $r;
____________________________________________________________________________
Benchmark: timing 10000 iterations of local $/, read...
local $/: 4 wallclock secs ( 2.81 usr + 1.09 sys = 3.91 CPU) @ 2559.51/s (n=10000)
read: 3 wallclock secs ( 1.77 usr + 1.06 sys = 2.83 CPU) @ 3534.82/s (n=10000)
Rate local $/ read
local $/ 2560/s -- -28%
read 3535/s 38% --
0559デフォルトの名無しさん
2009/09/23(水) 21:12:42こんなもんじゃないの。
少なくとも昔の2chのコードより100倍まし。
0560デフォルトの名無しさん
2009/09/23(水) 21:12:51まぁ、言われてみれば
読み込む量があらかじめわかってりゃそりゃバッファの確保も楽(っていうか一発?)だしそりゃ速いわな
0561デフォルトの名無しさん
2009/09/23(水) 21:31:51条件は、>>558と同じ。
Benchmark: timing 10000 iterations of local $/, read, sysread...
local $/: 4 wallclock secs ( 2.66 usr + 1.14 sys = 3.80 CPU) @ 2633.66/s (n=10000)
read: 3 wallclock secs ( 1.75 usr + 1.06 sys = 2.81 CPU) @ 3556.19/s (n=10000)
sysread: 1 wallclock secs ( 0.33 usr + 0.91 sys = 1.23 CPU) @ 8103.73/s (n=10000)
Rate local$/ read sysread
local $/ 2634/s -- -26% -68%
read 3556/s 35% -- -56%
sysread 8104/s. 208% . 128% --
0562デフォルトの名無しさん
2009/09/23(水) 21:33:025.8.9.826 と 5.10.1.1006 での差違って
主に何です? ご存じの方いませんか
0563デフォルトの名無しさん
2009/09/23(水) 21:41:54http://www.activestate.com/activeperl/features/
のActivePerl 5.10 Highlightsは見たの?
0564デフォルトの名無しさん
2009/09/23(水) 22:15:20Benchmark: timing 50000 iterations of local $/, read, sysread...
local $/: 9 wallclock secs ( 2.64 usr + 5.34 sys = 7.98 CPU) @ 6262.53/s (n=50000)
read: 8 wallclock secs ( 2.03 usr + 5.47 sys = 7.50 CPU) @ 6666.67/s (n=50000)
sysread: 6 wallclock secs ( 1.72 usr + 4.61 sys = 6.33 CPU) @ 7900.14/s (n=50000)
Rate local$/ read sysread
local $/ 6263/s -- -6% -21%
read 6667/s 6% -- -16%
sysread 7900/s. 26% 19% --
ただ、読み込むファイル容量を大きくする(以下)と差が出る。
my $file = 'kakikomi.txt'; # 6,863,205bytes(≒6.5Mbytes)、271,365行
Benchmark: timing 300 iterations of local $/, read, sysread...
local $/: 6 wallclock secs ( 4.45 usr + 2.08 sys = 6.53 CPU) @ 45.93/s (n=300)
read: 4 wallclock secs ( 2.02 usr + 2.06 sys = 4.08 CPU) @ 73.58/s (n=300)
sysread: 4 wallclock secs ( 0.08 usr + 3.11 sys = 3.19 CPU) @ 94.13/s (n=300)
Rate local$/ read sysread
local $/ 45.9/s -- -38% -51%
read 73.6/s 60% -- -22%
sysread 94.1/s. 105% 28% --
0565デフォルトの名無しさん
2009/09/23(水) 23:23:06my $data=`cat $file`;
0566デフォルトの名無しさん
2009/09/23(水) 23:53:34#=>
こいつがちんぽに見えてしょうがない
どうにかならんか
0567デフォルトの名無しさん
2009/09/24(木) 00:36:070568デフォルトの名無しさん
2009/09/24(木) 02:08:46Image::ExifToolというモジュールで出来るようだということがわかりました。
具体的なソースコードがないので、どのようにwmvの再生時間を取得すればいいのか悩んでいます。
よろしければ再生時間の取得方法が載っているサイトなど教えていただけたらと思います。
0569デフォルトの名無しさん
2009/09/24(木) 02:40:20これでしょ?
http://search.cpan.org/~exiftool/Image-ExifTool-7.89/lib/Image/ExifTool.pod
0570デフォルトの名無しさん
2009/09/24(木) 10:29:03書かなければならないとする設定が説明サイトによってまちまちなんですが、
最新版ではどう記述するのが本当なんですか?
0571デフォルトの名無しさん
2009/09/24(木) 13:33:50print join(',', (1,'','','',2)), "\n";
print join(',', (1,,,,2)), "\n";
perlでは,,,というのはどういう解釈がなされるのでしょうか?
--------
JavaScriptみたいな結果を期待していたのですが・・。
alert([1,,,,2].join(',')); // -> 1,,,,2
0572デフォルトの名無しさん
2009/09/24(木) 14:09:42http://perldoc.jp/docs/perl/5.10.0/perldata.pod より:
空リストは () で表わされます。リスト中で空リストを展開しても何も起こりません。
つまり、 ((),(),()) は () と等価です。同様に、要素のない配列を展開することは、
その場所に何も展開しなかったのと同じことになります。
この展開は、開きかっこと閉じかっこは(優先順位のための必要性がなければ) 省略
可能であるということと、リスト中に複数のカンマがあっても文法的に有効なので、
リストの最後に追加のカンマをつけられるということを組み合わせたものです。
リスト 1,,3 は 2 つのリスト 1, と 3 の結合であり、 1 つ目のリストはオプションのカンマ
で終わっています。 1,,3 は (1,),(3) で 1,3 です (そして同様に 1,,,3 は (1,),(,),3 で
1,3 です。以下同様。) この暗黒面を使うよう勧めているわけではありません。
0573デフォルトの名無しさん
2009/09/24(木) 15:09:05ありがとう御座います。ズバリです!
納得いきました。
0574デフォルトの名無しさん
2009/09/24(木) 16:07:02バイナリリードにすると差がなくなるのは、<$fh>方式では、バイナリリードだと確保するバッファーが
大きくなるからでしょうか?
0575デフォルトの名無しさん
2009/09/24(木) 16:34:29package Super;
sub foo { print "This is Super\n" }
package Sub;
use base Super;
sub foo { print "This is Sub\n" }
package SubSub;
use base Sub;
sub foo { print "this is SubSub" }
sub call_super_foo { shift->SUPER::SUPER::foo) } #=> エラー
package main;
SubSub->call_super_foo; #=> This is Superを期待
0576デフォルトの名無しさん
2009/09/24(木) 17:36:56二つ上っていう相対的な呼び出し方はわかんね
っていうか、そういうことがやりたいケースなんてあるかな?ちょっと興味あるアル
0577デフォルトの名無しさん
2009/09/24(木) 18:11:57package UNIVERSAL;
sub dispatch_ancestor_method
{
my ($self, $name, @args) = @_;
no strict "refs";
for my $super (@{(ref($self) || $self) ."\::ISA"}) {
for my $ancestor (@{"$super\::ISA"})
{ return &{"$ancestor\::$name"}($self, @args) if defined &{"$ancestor\::$name"}; }
}
die "Undefined method `$name'";
}
package SubSub;
sub call_super_foo { shift->dispatch_ancestor_method("foo") }
0578デフォルトの名無しさん
2009/09/24(木) 18:22:06ありがとうございます。
単に勉強中の者でして、任意の上の階層のメソッドを呼び出す命令があるのかなーと
思ったしだいです。
0579デフォルトの名無しさん
2009/09/24(木) 19:28:52そういう使い方では継承の意味がないのでは?
0580デフォルトの名無しさん
2009/09/24(木) 23:02:56深く突っ込まれても、まだ勉強の途中なのでよくわからんです。
SUPER::の項目を見てて、そういう命令があるのかなーと思っただけなんで。
0581デフォルトの名無しさん
2009/09/25(金) 01:37:51配列のm番目にあるデータに、ループを回すごとに値を〜でくっつけて追加したいんだ
ex) m番目の値がabcで、cdeを追加したい場合 abc〜cde のように。
追加される値が$aの場合
$list[m] .= $list[m] . "〜" . $a; (※
として配列m番目の値を変えようと思ってやったんだけどうまくいかない。
mはずっと固定。
ループ1週目で$a・2週目で$b、3週目で$c・・・・・と後ろに繋げる場合
$list[m]〜$a〜$b〜$c〜 となっていくようにしたいんだけど
上の※式を実行すると
$list[m]
しか出力されなく困ってます。どなたか知恵を御貸しください……
0582デフォルトの名無しさん
2009/09/25(金) 02:07:37$list[m] .= "〜" . $a; (※
か
$list[m] = $list[m] . "〜" . $a; (※
0583デフォルトの名無しさん
2009/09/25(金) 09:06:19× $list[m]
○ $list[$m]
というオチじゃないだろうな?
0584570
2009/09/25(金) 09:11:01ユーザーディレクトリで運用してる人は稀?
0585デフォルトの名無しさん
2009/09/25(金) 09:28:16ローカルにtar.gzからlocal::libをインストールして、あとはその設定使ったcpanでインストールしてるけどそういう意味?
0586デフォルトの名無しさん
2009/09/25(金) 11:55:47PHPでは
$x = 10;
$var = 'x';
echo $$var; // 10 が表示される
ということができるんですけど、Perlで同じことをするにはどうしたらいいですか。
0587デフォルトの名無しさん
2009/09/25(金) 11:56:240588デフォルトの名無しさん
2009/09/25(金) 11:59:10されるんだったらこのへんのブログ記事はみんな仕込みだな
ttp://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=makepl_arg&num=50
0589デフォルトの名無しさん
2009/09/25(金) 12:10:38同じく$$varでいいけど、そういうプログラムは行儀悪いからやめとけ。
0590デフォルトの名無しさん
2009/09/25(金) 12:19:440591デフォルトの名無しさん
2009/09/25(金) 12:24:12$mは別の所で既に求めてあり、変わることのない定数ですが……
printで挿入動作のすぐ後で確認してみた時はうまく挿入されているのですが
次のループの時にはまた初期状態に戻ってしまっているようです……
0592デフォルトの名無しさん
2009/09/25(金) 12:25:21だったらループを晒さないと。
0594デフォルトの名無しさん
2009/09/25(金) 14:21:520595デフォルトの名無しさん
2009/09/25(金) 14:27:53ここに貼り付ければおk
http://codepad.org/
0596デフォルトの名無しさん
2009/09/25(金) 14:34:03だったら一行一行チェックしないと
0597デフォルトの名無しさん
2009/09/25(金) 15:31:30「他の動作」を削っていって、不具合の再現する最小ケースのコードを作ってみ。
0598デフォルトの名無しさん
2009/09/25(金) 16:19:27> 次のループの時にはまた初期状態に戻ってしまっているようです……
この人に足りないのは、「デバッグする」ということ。
いちおうすぐ後に print文を入れてみたのはエライが
その後で行き詰っているな。
もっと print を入れろ。たくさん入れろ。しつこいくらい入れろ。
print でコードがイッパイ埋め尽くされるまで入れろ!
そうすればどこで変になったか特定できるはずだろ。
0599デフォルトの名無しさん
2009/09/25(金) 16:25:19ってレスされることを狙ったよな?よな?
0600デフォルトの名無しさん
2009/09/25(金) 18:32:10行儀よく
${$var}
あれリファレンスと同じだ
0601デフォルトの名無しさん
2009/09/25(金) 18:35:37ループごとに変数初期化してる気配
0602デフォルトの名無しさん
2009/09/25(金) 19:32:41perl以前にそもそもな違和感を覚える。
200行ものループがあるのは、明らかにおかしい。
一関数でも200行はおかしい部類に入るのに、
それがループともなると、さらに話もデバッグも難しくなる。
0603デフォルトの名無しさん
2009/09/26(土) 02:12:340604デフォルトの名無しさん
2009/09/26(土) 02:29:330605デフォルトの名無しさん
2009/09/26(土) 03:03:05不思議じゃないが、おかしい。
「perlなら」とか言い訳してる場合じゃなくおかしいものはおかしい。直すべき。
0606デフォルトの名無しさん
2009/09/26(土) 11:33:59行儀のいいコードを書く必要性は場合よる
LLであるPerlならそういうケースに見回れる可能性は低いから
むしろ「おかしい」って突っ込みの方が自分本位で正当性に欠ける気がするんだよ!
0607デフォルトの名無しさん
2009/09/26(土) 12:11:35そこに、保守性、生産性という需要があれば可読性のあるソースを
速度やコンパクトさを求めるなら、可読性や保守性は両立できない
だからそもそもソースの書き方に正しいとか間違いなんて言うのは野暮
0608デフォルトの名無しさん
2009/09/26(土) 12:37:30些細なバグを直しやすくするアドバイスが
そんなに気に入らないか?
下手くそな書き方で無駄な時間潰すより
素直に耳を傾けたほうがよほどいいと思うが?
0609デフォルトの名無しさん
2009/09/26(土) 12:47:48「だめなプログラムを修正するのはやめて、全部書き直そう」
0610デフォルトの名無しさん
2009/09/26(土) 12:48:08Damian Conwayを真っ向から否定ですね、わかります
0611デフォルトの名無しさん
2009/09/26(土) 12:48:12はぁ?
そんなの綺麗で可読性のあるコードを書かない言い訳になんかならんよ。
実際「動けば良い」じゃ済まないから現に >>581 みたいな質問が出てるんじゃんよ。
「おかしい」ったら「おかしい」んだよ。
0612デフォルトの名無しさん
2009/09/26(土) 12:59:02思考が若いねぇ。いったい何処で習った手法なのかなー? 趣味のプログラム書き殴りだけで、
それなりの規模の保守運用を伴う実務経験無さそうだねぇ
0613デフォルトの名無しさん
2009/09/26(土) 13:00:501 動くこと
2 正しく動くこと
3 上記を満たすためにわかりやすく書くこと
0614607
2009/09/26(土) 13:06:36綺麗で可読性のあるコードを書くのは反対しないよ
だがここはあくまで書き方の自由度の高いPerlのスレであり
大規模プロジェクトで生産性、保守性を目的にしたソースを第一とするとはどこにも書いていないと言いたいだけ
0615デフォルトの名無しさん
2009/09/26(土) 13:10:050616デフォルトの名無しさん
2009/09/26(土) 13:10:39>>608
この問題に対する、「分割や抽象化されてない巨大なコードはバグりやすいよ」ってアドバイスならいいけど、
>200行ものループがあるのは、明らかにおかしい
みたいに、プログラミング一般に適用可能な意見とするのは違うなーと思った
こういう考えをむやみに初心者に植え付けるのは、コーディングオナニーの原因にもなるしね
常に必要なことではない、ってことを理解してもらうために発言したんだよ
0617607
2009/09/26(土) 13:12:57習うと言われても
私の若い頃は工業高校なんかでBASICかFORTRAN、アセンブラしか教えられていなかったから
実務経験で培った知識しか無い
これ以上はスレ違いだし606を擁護するのはやめとく
0618デフォルトの名無しさん
2009/09/26(土) 13:35:06> こういう考えをむやみに初心者に植え付けるのは、コーディングオナニーの原因にもなるしね
いいや、プログラミング一般に適用可能だし、むやみに初心者に植え付けるべき考えだよ。
ところで「コーディングオナニー」って何?
特に >>581 の場合なんかは、どうせスコープを見誤ってバグってるんだろうから、
効率とか云々は一旦棚に上げて、 use strict; use warnings; した上で、
200行のコードをどんどん関数に分割していけば、まずいところはすぐ見つかると思う。
0619デフォルトの名無しさん
2009/09/26(土) 13:45:27多人数開発だったり、サポート期間の長いソフトだと前者の重要性が
高くなるだけで、別にそれが全てじゃない。
Perl の場合、たいてい動けばよいの方の比重が高くなると思うな
まあ、どうでもいいけど
0620デフォルトの名無しさん
2009/09/26(土) 13:49:020621デフォルトの名無しさん
2009/09/26(土) 14:11:14>コーディングオナニー
ああ、リアルで使っても結構通じちゃうから、同じ気持ちで使ってたよ。気付かなくてごめんね
意味だけど、本来の目的や本質は疎かにして、自分が正しいと信じてることを機械的に行うことだよ
病的なまでにコードを整理したり、やたらリファクタリングに時間をかける人がいるんだよ。文脈におけるメリットも考慮せずに
(実を言うと、昔は自分もそうだったしね)
コードを整理することが保守性やメンテナンス性を高めることに繋がるという事に異議は無いよ
ただ、そういうことが常に求められているわけではないので、
その手段である「綺麗なコードを書くこと」は、プログラミング一般に適用出来ない。そういうこと
>>619
同意
0622デフォルトの名無しさん
2009/09/26(土) 14:13:570623デフォルトの名無しさん
2009/09/26(土) 15:08:40プログラマにとって身に付けるべき重要な嗅覚だろ。
そんな嗅覚の未発達な初心者に対しては、
ちゃんとこれはおかしいと諭してあげるべきじゃないのか。
200行もあるが故に見通しが悪く自力で問題解決できなくなり、
200行もあるが故にコード片を晒すこともできずこれ以上の助言ももらえない、
そんなにっちもさっちもいかなくなった質問者に対して、
200行のコードでも動けば問題ない、ってのがアドバイスになるのか?おかしいだろ。
0624デフォルトの名無しさん
2009/09/26(土) 15:13:44気づかないのはセンスナッシングで他のことにも気づかないってことで
0625デフォルトの名無しさん
2009/09/26(土) 15:50:330626デフォルトの名無しさん
2009/09/26(土) 15:57:030627デフォルトの名無しさん
2009/09/26(土) 15:58:190629デフォルトの名無しさん
2009/09/26(土) 16:24:52行ってらっしゃーい
0630デフォルトの名無しさん
2009/09/26(土) 18:08:27これを言い出すとモメる原因になる。
いったい<誰>にとって綺麗で可読性のあるコードであるか。
おまえか?おれか?
主観を押し付けるなよ。
0631デフォルトの名無しさん
2009/09/26(土) 18:26:43そんな中二病丸出しの発言する奴は無視するだけでしょ。
0632デフォルトの名無しさん
2009/09/26(土) 19:49:32というか、ズルや政治的意図で歪められたりする。
perltidyなどのフォーマッタを通したコードが綺麗で良いとすると、
複雑さなどは計算に入れないのか、などなど。
一度は通っておくといい道。
0633デフォルトの名無しさん
2009/09/26(土) 21:16:08文字列をmecabに入れる際にeuc-jpにエンコードし、名詞だけを抽出し
デコードしてブラウザに出力させようとすると、大半は通常通りに取得できますが、一部の単語が文字化けします。
調べてみたら漢字に限らず、ひらがな・カナ文字でも文字化けしています。
考えられる原因はなんでしょうか?OSはfedora9です。
0634デフォルトの名無しさん
2009/09/26(土) 21:49:44(´;ω;`)ブワッ
0635デフォルトの名無しさん
2009/09/26(土) 22:12:43(´;ω;;:;:::...
(´;;:;::;..
0636デフォルトの名無しさん
2009/09/26(土) 22:14:07(´ ∀;;:;:::...
(´ ∀`)
0637デフォルトの名無しさん
2009/09/27(日) 00:08:32画像ファイルを読み込んだあと、画像のプロパティ(タイトル、標題、コメントなど)を
セットしてから出力することはできるでしょうか。
0638デフォルトの名無しさん
2009/09/27(日) 01:43:41もちろんです。
man Imagemagick
0639デフォルトの名無しさん
2009/09/27(日) 05:53:38(´・ω 。o。゚。o○
。。o。o゚O゚。o゚o○。o゚
0640デフォルトの名無しさん
2009/09/27(日) 08:07:26みなさんはそれをどのように変換してますか?
エディタの機能でうまくできるものなのでしょうか?
0641デフォルトの名無しさん
2009/09/27(日) 09:25:390642デフォルトの名無しさん
2009/09/27(日) 09:57:50それじゃダメだろ
0643デフォルトの名無しさん
2009/09/27(日) 11:16:51Perlで「各行の先頭から続く複数の空白を、同じ数の&nbsp;に変換して出力する」コードを書けば良いじゃない
0644デフォルトの名無しさん
2009/09/27(日) 11:18:24あんど、えぬ、びー、えす、ぴー、せみころんね
0645デフォルトの名無しさん
2009/09/27(日) 11:29:210646デフォルトの名無しさん
2009/09/27(日) 11:41:45s/(?<=^|\G)[ \t]/ /mgx
0647デフォルトの名無しさん
2009/09/27(日) 11:49:50>>641でいいと思うけど。
いつも半角スペース2個を全角1個にしてるからvimなら%s/ / /gcで置換できる
0648デフォルトの名無しさん
2009/09/27(日) 12:19:150649デフォルトの名無しさん
2009/09/27(日) 12:28:43今どきハードタブ使ってるひとはあまりいないんじゃない?
0650デフォルトの名無しさん
2009/09/27(日) 13:04:240651デフォルトの名無しさん
2009/09/27(日) 13:11:40あなた、井の中の蛙さん?
0652デフォルトの名無しさん
2009/09/27(日) 13:49:340653デフォルトの名無しさん
2009/09/27(日) 16:07:090654デフォルトの名無しさん
2009/09/27(日) 17:07:390655デフォルトの名無しさん
2009/09/27(日) 19:30:25中身結構かわってるかなあ
0656デフォルトの名無しさん
2009/09/27(日) 22:27:04コード載せた場合、先に引っかかるのは
大概行数制限のほうだと思う
0657デフォルトの名無しさん
2009/09/28(月) 21:50:380658デフォルトの名無しさん
2009/09/28(月) 23:07:510659デフォルトの名無しさん
2009/09/30(水) 00:14:06これやるとエラーダイアログが出るんです。
問題が発生したため、Perl Command Line Interpreter を終了します。 ご不便を
おかけして申し訳ありません。
この問題を Microsoft に報告してください。
(以下省略)
[エラーを報告する(S)] [送信しない(D)]
いろいろ試したらこのような結果でした。
o Active Perl 5.8.8
o Active Perl 5.8.9
o Active Perl 5.10.0
x Active Perl 5.10.1
こんなふうに ( | ) を使わなければOKなんですが、ちょっと困ります。
s!>back<!>戻る<!si;
s!>return<!>戻る<!si;
perl 5.10.1 はウンコですか?
0660デフォルトの名無しさん
2009/09/30(水) 12:42:56デリミタは#とか括弧類にしてくれ。
あとPerlのせいにすんな。
FreeBSDやLinuxの5.10.1ではそのコードは普通に動くから、
5.10.1がウンコなんじゃなくてActivePerlが正規表現モジュールか何かの
Winへの移植に失敗してるんだろ。
5.10.1リリース後一ヶ月以内のスピード移植版に文句言うとか何様かと。
修正リリースが出るだろうからバグ報告でもして座って待ってろ。
0661デフォルトの名無しさん
2009/09/30(水) 13:48:36ttp://ash.jp/code/unitbl21.htmを参考にしようと思ったのですが、どう書けばよいか分かりません。
お願いします。
0662661
2009/09/30(水) 13:50:080663デフォルトの名無しさん
2009/09/30(水) 13:58:29みたいな?
0664デフォルトの名無しさん
2009/09/30(水) 15:40:47s/^[0-9]+$//
0665デフォルトの名無しさん
2009/09/30(水) 17:38:18んー、WindowsXPで普通に動く。
0666デフォルトの名無しさん
2009/09/30(水) 19:58:03長さを指定して文字列を作成し、あとから文字を詰め込みたいのですが、やり方がわかりません。
自分で試したのはこんなコードです。
SV *
hoge()
CODE:
SV *string = newSV(5);
char *s = SvPVX(string);
//int len;
//char *s = SvPV_force(string, len);
int i;
for (i = 0; i < 5; i++) {
s[i] = 'x';
}
s[i] = '¥0';
RETVAL = string;
OUTPUT:
RETVAL
これを呼び出してみると、長さが0の文字列が返されるだけでした。
おしえてえらいひと。
0667デフォルトの名無しさん
2009/09/30(水) 19:59:37SV *
hoge()
CODE:
SV *string = newSV(5);
char *s = SvPVX(string);
//int len;
//char *s = SvPV_force(string, len);
int i;
for (i = 0; i < 5; i++) {
s[i] = 'x';
}
s[i] = '¥0';
RETVAL = string;
OUTPUT:
RETVAL
よろしくお願いします。
0668デフォルトの名無しさん
2009/09/30(水) 20:03:390669デフォルトの名無しさん
2009/10/01(木) 07:53:07XSが何か分かってないだろ。
ちゃんとPerlの質問だ。
質問にも答えたいが朝食を作らないと。
0670デフォルトの名無しさん
2009/10/01(木) 09:24:05SvPOK_onlyかSvPOK_only_UTF8が必要なんじゃね?
0671デフォルトの名無しさん
2009/10/01(木) 09:26:25あーちなみに文字列の突っ込み方は合ってるし、
そっち方面の質問がメインならC/C++のスレに行きな。ちなみに勘だが、
SV *
hoge()
ここがおかしいんじゃないか?SV *返すことってできたっけ?
インクルードファイルやMODULE行がないのは端折ってるだけだよな?
0672デフォルトの名無しさん
2009/10/01(木) 09:32:210673デフォルトの名無しさん
2009/10/01(木) 09:32:520674デフォルトの名無しさん
2009/10/01(木) 09:33:116バイト取ってるでしょ。マニュアル嫁
0675デフォルトの名無しさん
2009/10/01(木) 09:34:070676デフォルトの名無しさん
2009/10/01(木) 09:46:21やりたいことは一緒なんだから比べてみ。
0677デフォルトの名無しさん
2009/10/01(木) 10:10:11いきなりnewSVみたいな低レベルの関数使うと怪我をするよ。
SV *string = newSVpv(" ", 5);としたらどうなる?
0678デフォルトの名無しさん
2009/10/01(木) 12:52:54初期化するまで値が不定になるだけで実害はないと思うが
0679デフォルトの名無しさん
2009/10/01(木) 23:23:46たしかにコードはC++チックですね。コメントが // だったり、変数宣言が先頭になかったり。
>>669
668さんはXSが何かわかったうえでの発言だと思いますよ?
>>670
RETVALUE = string;
の行の前に
SvPOK_only_UTF8(string);
を追加してみましたけど、状況は変わらずでした。
>>677
newSVpvn(" ", 5) ですよね。それだとうまくいくんですが、これだとコピー元の文字列を
あらかじめ用意してないといけないので、今回の目的には適合しませんでした。
で、いろいろ調べて、New() と Safefree() と newSVpvn() を使うことにしました。
でもこれだと New() でバッファを用意して、文字列を埋めて、newSVpvn() でコピーして、・・・と
しなきゃいけないから、newSVpvn() でコピーするのが無駄かなあとは思うんですけど、
これしかうまくいかないので、そうします。
アドバイスいただいたみなさん、ありがとうございました。
0680uy50% ◆e6.oHu1j.o
2009/10/02(金) 23:15:29どんなものでもいいです
0681デフォルトの名無しさん
2009/10/02(金) 23:26:040682デフォルトの名無しさん
2009/10/03(土) 01:34:21このメアドがまたすげー
0684デフォルトの名無しさん
2009/10/03(土) 04:31:47もしかして第一引数に勝手にインスタンスが入るのでsubが省略できなかったりしますか?
0685デフォルトの名無しさん
2009/10/03(土) 04:32:130686デフォルトの名無しさん
2009/10/03(土) 05:06:10どうせnewSVpvn使うならこれでどうだ?。ナルストリングで文句があるならもう知らん。
newSVpvは初期化文字列が空でもちゃんと6バイト確保してくれるところがミソだ。
普通ならまず(char *)sを作ってnewSVpv(s, 5)すりゃ何の問題もないんだが、それだと
困るんだよな?
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
MODULE = Foo PACKAGE = Foo
SV *
hoge()
CODE:
int i = 0;
char c = (char)0;
SV *string = newSVpv((char *)&c, 5);
char *s = SvPVX(string);
for (i = 0; i < 5; i++) s[i] = 'x';
s[i] = (char)0;
RETVAL = string;
OUTPUT:
RETVAL
0687デフォルトの名無しさん
2009/10/03(土) 05:13:25あなたには答えてほしくありません。
0688デフォルトの名無しさん
2009/10/03(土) 05:20:57日本語がよくわからんが....。map { some_code } @foo;のようなことがしたいなら、
my_map(&@){ ... }
:
my@bar = my_map { some_code } @foo;
で出来る。
map BLOCK LIST
map EXPR, LIST
の2つの書式を満たす方法は知らん。
0689デフォルトの名無しさん
2009/10/03(土) 05:23:18回答者を選ぶなら質問するな。
そもそも俺が何番の人か分かってるのかなこの人。勘違いだと思うんだが。
何番かアンカー晒してみ。
0690デフォルトの名無しさん
2009/10/03(土) 05:24:100691デフォルトの名無しさん
2009/10/03(土) 05:47:310692デフォルトの名無しさん
2009/10/03(土) 07:03:49int i = 0;
SV *string = newSV(0);
char *s = (char *)malloc(6);
for (i = 0; i < 5; i++) s[i] = 'x';
s[i] = (char)0;
sv_setpv(string, s);
free(s);
RETVAL = string;
0693デフォルトの名無しさん
2009/10/03(土) 13:40:30すみません、サブルーチンの場合にそう書けるのは知ってます
クラスをオブジェクトとして作ったときに、$hoge->map({ $_ =~ /hoge/} @huga) というmapメソッドを書く方法はないのか知りたかったのです
しかしこのとき実装側では sub map($&@){… としなければいけないため、呼び出し側のsubが省略できないじゃないですか
なので、これをなんとかできないものかと思いまして…
0694デフォルトの名無しさん
2009/10/03(土) 14:08:520695デフォルトの名無しさん
2009/10/03(土) 14:13:13ありがとうございました
0696デフォルトの名無しさん
2009/10/03(土) 14:26:36このサイトに書いてあるようにしたのですが、rubyで書かれています。これ(下のプログラム)をperlで書き換えたいのですが、分かる方が居たらお願いします。
#!/usr/bin/ruby
open($*[0]).each do |line|
title = line.strip
next if title =~ /^\./
next if title =~ /[0-9]{4}/
next if title =~ /^[-.0-9]+$/
score = [-36000.0 ,-400 *(title.size**1.5)].max.to_i
print "#{title},0,0,#{score},名詞,一般,*,*,*,*,#{title},*,*,wikipedia_keyword,\n" if title.size > 9
end
0697デフォルトの名無しさん
2009/10/03(土) 15:17:11これなら初心者の自分でも書き直せるYO
エレガントな回答は上級者にまかすけど。
#!/usr/bin/perl
use List::Util qw(max);
open my $fh, $ARGV[0] or die $!;
while ( my $line = <$fh> ) {
my $title = $line;
$title =~ s/^\s*(.*?)\s*$/$1/;
next if $title =~ /^\./;
next if $title =~ /[0-9]{4}/;
next if $title =~ /^[-.0-9]+$/;
my $score = int max(-36000.0 ,-400 *((length $title)**1.5));
print "$title,0,0,$score,名詞,一般,*,*,*,*,$title,*,*,wikipedia_keyword,\n" if length $title > 9;
}
close $fh;
0698デフォルトの名無しさん
2009/10/03(土) 15:49:41map $hoge (....)とは書けるんだがな。
メソッド呼び出しはリストしか受けないから無理でしょ。
0699デフォルトの名無しさん
2009/10/03(土) 22:35:23http://acapulco.dyndns.org/blog/2009/10/03/wwwsourceforgejp
0700デフォルトの名無しさん
2009/10/03(土) 23:25:10例えば
"hoge huga" =~ /(\s|\d)/
という正規表現があったとき、
' 'ではなく'\s'を取得したいです
可能でしょうか
0702デフォルトの名無しさん
2009/10/03(土) 23:36:15役に立つ気はしないけど。
0703デフォルトの名無しさん
2009/10/03(土) 23:46:01デフォでそんなインターフェイスは用意されてないっしょ
0704デフォルトの名無しさん
2009/10/04(日) 00:03:31??{}ですか
参考になりました、調べてみますね
ありがとうございました
0705デフォルトの名無しさん
2009/10/04(日) 00:03:350706700
2009/10/04(日) 01:55:44ありがとうございます
perl -e '
use re "eval";
$hoge = q/ho..(?{$str="ho.."})|hu..(?{$str="hu.."})/;
"huga" =~ /$hoge/;
print "1:$str\n";
"hoge" =~ /$hoge/;
print "2:$str\n";
'
1:hu..
2:ho..
やりたかったのは
%hash = (
'\s+' => 'space',
'\d+' => 'number',
'\w+' => 'word',
);
という感じのハッシュのキーを合成して、一番最初にマッチしたものの名前を返す関数の作成だったので、
これでいけそうです
0707700
2009/10/04(日) 03:45:43下のような関数を作りました
sub match($@){
use strict;
use re "eval";
my $str = shift;
my @member = @_;
my $regex = join("|", map{ "$_(?{\$ret = q{$_}})"} @member);
my $ret;
$str =~ /$regex/;
return $ret;
}
以下の呼び出しを行うと、
print match("hoge 123", qw(\d \w \s)), $/; #=> \w
print match(" 123hoge", qw(\d \w \s)), $/; #=>
print match("123 hoge", qw(\d \w \s)), $/; #=>
となり、思った結果を返してくれませんでした
ですが、match関数に渡す配列の順番を変えたところ、
print match("hoge 123", qw(\d \w \s)), $/; #=> \w
print match(" 123hoge", qw(\w \d \s)), $/; #=> \s
print match("123 hoge", qw(\d \w \s)), $/; #=> \d
と、期待通りの結果を返してくれました
これは一回通った正規表現に対してはサブパターンは呼び出されないということなんでしょうか。。。
0708デフォルトの名無しさん
2009/10/04(日) 04:32:580709デフォルトの名無しさん
2009/10/04(日) 10:06:58>>706のレス見たときに、関数化してハマるんだろうなーと思ったらマジでハマっててワロタ
my $regex → local our $regex
my $ret → local our $ret
これでどうかな?
昔、そういうプロギラムを書いていたときには、こいつで回避出来たよ
多分、正規表現リテラルは初回の正規表現コンパイル時に、クロージャのようにローカル環境をキャプチャするけど
再度、同じ正規表現を与えてリテラルのパスを通ってもキャプチャが発生しない
なので、正規表現の中ではmy変数は使わず、グローバル変数を使えばOKと
0710700
2009/10/04(日) 14:05:04おお!いけました!
ありがとうございます
use strictすることでこんな罠が生まれていたとは思いもしませんでした
正規周りは魔物が住んでますね…
0711デフォルトの名無しさん
2009/10/04(日) 16:12:52何が原因でしょうか。また解決するにはどうすれば良いでしょうか?
0712デフォルトの名無しさん
2009/10/04(日) 17:21:400713デフォルトの名無しさん
2009/10/04(日) 17:25:40use utf8とかその辺りが原因の気が。
0714デフォルトの名無しさん
2009/10/04(日) 20:45:37csvファイルなのですがutf8のtext.csvを
nkf -e test.csv > test2.csv
で変換すると、開けなくなります。
0715デフォルトの名無しさん
2009/10/04(日) 21:42:37何をしようとして、何をしたら、どうなって欲しいのに、どうなったか、具体的にキチンと書いてみ。
0716デフォルトの名無しさん
2009/10/04(日) 22:00:58XpathをFirebugで取得してWeb::Scraperに処理させると、Xpathがずれてしまいます。
Firefoxのレンダリングでタグが追加変更されているのが原因みたいです。
PerlからFirefoxでレンダリング済みのタグを取得することはできないのでしょうか?
よろしくお願いします。
0717デフォルトの名無しさん
2009/10/05(月) 00:34:57そういうことじゃなくて?
0718デフォルトの名無しさん
2009/10/05(月) 00:42:14tbody以外にもページによって
tr[2]をtr[3]に変えたりとか
/table/tbody/tr/tdが追加されてたりとか
center/div/div/fontが追加されたりとか
単純なパターンで取れない感じがするので、いっそのことFirefoxでレンダリング済みのソースを
perlから取れないかな?と思ったのです。
0719デフォルトの名無しさん
2009/10/05(月) 16:57:25linux環境でMeCab.pmのperlモジュールを使用するにはどうしたらいいのでしょうか?
linuxはvine3.2です。
0720デフォルトの名無しさん
2009/10/05(月) 18:33:110721デフォルトの名無しさん
2009/10/05(月) 18:35:36ごめん、ごばった
ググればすぐに出てくるんですけれども。。。
ttp://www.alwaysfine.jp/2008/03/spamassassin_32wo.html
いわゆる犬学生なんでしょうね。。。
0723デフォルトの名無しさん
2009/10/06(火) 10:51:28. 2. PHP で検索した結果 1〜10件目 / 約2,970,000,000件
. 3. Java...... で検索した結果 1〜10件目 / 約 835,000,000件
. 4. Forth. で検索した結果 1〜10件目 / 約 323,000,000件
. 5. Ruby.. で検索した結果 1〜10件目 / 約 275,000,000件
. 6. perl..... で検索した結果 1〜10件目 / 約 245,000,000件
. 7. Python... で検索した結果 1〜10件目 / 約 204,000,000件
. 8. pascal... で検索した結果 1〜10件目 / 約 170,000,000件
. 9. Delphi で検索した結果 1〜10件目 / 約 127,000,000件
10. VisualBasic...で検索した結果 1〜10件目 / 約 121,000,000件
11. lisp... で検索した結果 1〜10件目 / 約. 26,700,000件
12. fortran で検索した結果 1〜10件目 / 約. 21,300,000件
13. COBOL で検索した結果 1〜10件目 / 約. 18,500,000件
14. HSP で検索した結果 1〜10件目 / 約. 12,300,000件
15. FreeBasic.. で検索した結果 1〜10件目 / 約 6,320,000件
16. Tcl/Tk. で検索した結果 1〜10件目 / 約 4,940,000件
17. QBasic で検索した結果 1〜10件目 / 約 4,190,000件
18. VisualC.... で検索した結果 1〜10件目 / 約 1,360,000件
19. DarkBASIC. で検索した結果 1〜10件目 / 約 1,320,000件
20. BasicStudio で検索した結果 1〜10件目 / 約 304,000件
21. N88basic. で検索した結果 1〜10件目 / 約 215,000件
22. f-basic で検索した結果 1〜10件目 / 約 109,000件
23. ActiveBasic で検索した結果 1〜10件目 / 約. 89,800件
24. 99BASIC.... で検索した結果 1〜10件目 / 約. 11,500件
3Dprogramming で検索した結果 1〜10件目 / 約794,000件
2Dprogramming で検索した結果 1〜10件目 / 約. 57,400件
intel で検索した結果 1〜10件目 / 約729,000,000件
amd で検索した結果 1〜10件目 / 約355,000,000件
0724デフォルトの名無しさん
2009/10/06(火) 11:01:41保存でeuc-jp指定とnkfで-eとは違うのですか?
無知ですみません。
0725デフォルトの名無しさん
2009/10/06(火) 11:37:51出力はeucって指定してるけど、入力の指定は?
もとのファイルがUTF8だということをnkfに教えてやらなければダメなのかもね。
nkfの説明書をよく読んでみてよ。
0726デフォルトの名無しさん
2009/10/06(火) 12:06:40片方は末尾までデータが入っているのですが
もう片方は末尾に半角スペース1個だけが入っています
この配列をファイルに書き出す際、前者は全て書き出し、後者は最後の配列のみ書き出さないようにしたいのですが、うまくいきません
ループ中に配列aの最後n番目が半角スペースなら書き出さない場合、
if($a[$n] eq " "){
last;
}
では駄目なのでしょうか
携帯からなので読みにくいですがよろしくお願いします
0727デフォルトの名無しさん
2009/10/06(火) 12:40:350728デフォルトの名無しさん
2009/10/06(火) 13:18:590729デフォルトの名無しさん
2009/10/06(火) 14:04:23デバッグしろ。
if($a[$n] eq " ") がヒットしているか調べろ。$a[$n]の中身を調べろ。
0730デフォルトの名無しさん
2009/10/06(火) 16:09:480731デフォルトの名無しさん
2009/10/06(火) 16:17:190732デフォルトの名無しさん
2009/10/06(火) 18:55:01print "!!! HELLO !!! $n='$a[$n]'\n";
って書いておくといいよ。
0733デフォルトの名無しさん
2009/10/07(水) 01:31:47if($a[-1] eq " "){
output @a[0..$#a-1];
}else{
output @a;
}
0734デフォルトの名無しさん
2009/10/07(水) 01:35:46pop @a if $a[-1] eq " ";
output @a;
0735デフォルトの名無しさん
2009/10/07(水) 02:18:491行目の文字列を2行目の文字列の任意の場所に挿入
その後1行目を改行ごと削除
という作業はどう書けばいいでしょうか?
0736デフォルトの名無しさん
2009/10/07(水) 03:34:48splitで切って2つの文字列に分けて、substrで1行目を2行目に入れればいい。
0737デフォルトの名無しさん
2009/10/07(水) 07:10:08日本語が妖しいので確認
入力> 2行一組の文字列
出力> それぞれの組を1行にまとめた文字列
処理> 改行を削除した1行目を2行目の任意の場所に挿入
0738デフォルトの名無しさん
2009/10/07(水) 07:46:29chomp(@d=<>);
for ($i=0;$i<@d-1;$i+=2){
$len=length $d[$i+1];
substr($d[$i+1],rand($len),0)=$d[$i];
print $d[$i+1]."\n";
}
代入型のsubstrって戻り値は代入後の文字列だっけ?
ググっても見つからなかった。
0739デフォルトの名無しさん
2009/10/07(水) 10:47:16最近の Perl を良く知らないのですが perldoc などのオフィシャルなドキュメントは存在しないのでしょうか?
0740デフォルトの名無しさん
2009/10/07(水) 11:07:25どっちかというとperlop(1)のAssignment Operatorsの方をよく読んだ方が
いいんじゃない?
C と違って、スカラ代入演算子は有効な左辺値を作り出します。代入を修正することは、代入を行なってから、その代入された変数を修正するのと同じことになります。これは、以下のように何かのコピーを変更したいときに便利です:
($tmp = $global) =~ tr [A-Z] [a-z];
(http://perldoc.jp/docs/perl/5.10.0/perlop.pod)
てことなので、
$tmp = "ABCDEF";
$global = "XYZ";
(substr($tmp, 2, 2) = $global) =~ tr [A-Z] [a-z];
とか試してみれば理解できると思います。
0741デフォルトの名無しさん
2009/10/07(水) 11:12:40あるよ
perldoc -f substr
で調べられる
0742デフォルトの名無しさん
2009/10/07(水) 13:06:10/ab|xy|12/
と書きますが、ab、xy、12の全て含むはどう書くのでしょうか?
0743デフォルトの名無しさん
2009/10/07(水) 13:30:17ab,xy,12をすべての順列で並べて
ab.*xy.*12|ab.*12.*xy|...
と書けばいい。
無理に正規表現だけでやらずに
/ab/ && /xy/ && /12/
とした方が楽だと思うけどね。
0744デフォルトの名無しさん
2009/10/07(水) 13:43:19�d
0745デフォルトの名無しさん
2009/10/07(水) 14:04:22どうやってテキストファイルだと見破ってるの?
その原理とか注意事項ってある?
0746デフォルトの名無しさん
2009/10/07(水) 14:19:45とりあえずperlfunc読め。
ファイルテスト -T と -B の動作原理は、次のようになっています。ファイルの最初の数ブロックを調べて、
変わった制御コードや上位ビットがセットされているような、通常のテキストには現れない文字を探します。
そのような文字が、たくさん (>30%) 見つかるようであれば、そのファイルは -B ファイルであると判断され
ます; さもなければ -T ファイルとなります。最初のブロックにヌル文字が含まれるファイルも、バイナリ
ファイルとみなされます。 -T や -B をファイルハンドルに対して用いると、最初のブロックを調べる代わり
に、IO バッファを調べます。調べたファイルの中身が何もないときや、ファイルハンドルを調べたときに
EOF に達していたときには、-T も -B も「真」を返します。
「通常のテキストには現れない文字ってなんだよ!!」とか言いたくなったら、ソース読むしかないかな。
(pp_sys.cのpp_fttext)
でも結局30%だからあんまりアテにすると痛い目を見そうなんで俺は使わないね〜。
0747デフォルトの名無しさん
2009/10/07(水) 14:31:290748デフォルトの名無しさん
2009/10/07(水) 14:36:290749デフォルトの名無しさん
2009/10/07(水) 15:16:53そうです。
ここは、疑問を書けば、マニュアルの該当部分を張ってくれるスレです。
0750デフォルトの名無しさん
2009/10/07(水) 15:18:040751デフォルトの名無しさん
2009/10/07(水) 15:22:250752デフォルトの名無しさん
2009/10/07(水) 15:35:330753デフォルトの名無しさん
2009/10/07(水) 15:40:44オフィシャルなドキュメントには記載が見つからなかったのです
0754デフォルトの名無しさん
2009/10/07(水) 17:17:48googleで-Tを検索したら何も出てこなかったんだよきっと
0755デフォルトの名無しさん
2009/10/07(水) 22:03:27じゃあ、substrに代入したときの返り値を調べてみてよ。
0756741
2009/10/07(水) 23:02:37あぁ、ごめん。741だけど
> 代入型のsubstr
この部分に全く目がいってなかったわ
my $result = (substr($d[$i+1],rand($len),0)=$d[$i]);
この$resultがどうなるかって意味だよね?それなら載ってないかも。俺が普段この書き方しないから空目した
自分で>>735を書くとしたら下のような感じかなぁ
my $str =<< "STR";
abcdef\n123456\nghijklmn\n78910223
STR
warn $str;
my @res;
my @lines = split /\n/, $str;
while (@lines) {
my $line1 = shift @lines;
my $line2 = shift @lines;
print "num?: ";
my $num = <STDIN>;
my $length = length $line1;
my $post = substr $line2, $num, $length, $line1;
push @res, $line2 . $post;
}
join "\n", @res,
"\n";
0757デフォルトの名無しさん
2009/10/08(木) 04:05:10なにがどう「じゃあ」なんだよwww
0758デフォルトの名無しさん
2009/10/08(木) 04:53:55No documentation found for "perlfunc".
^^v
0759デフォルトの名無しさん
2009/10/08(木) 06:39:44マニュアルに記載のない使い方はしないほうがよいのか
代入文だからlvalueが保持されると考えるのがよいのかが知りたかった。
多分、後者だね。
コードについては、ヒアドキュメント使うと柔軟性に難があるから、下記のがいいかも。
@lines=<DATA>;
(プログラム末尾)
__DATA__
入力データ
入力データ
:
あと、入力が偶数行でなかったときはこけるね。
入力の妥当性を調べるのはプログラムの仕事だよ。
それから、任意ってそういうことだったのかな?
もとの要求が謎の多いものだから、こちらは乱数にしたのだけど。
0760デフォルトの名無しさん
2009/10/08(木) 06:46:42もう一度プログラム見た。
これ、正しくない。
挿入位置+1行目の長さが2行目の長さより短いと
順がおかしくなる。
0761デフォルトの名無しさん
2009/10/08(木) 09:04:20おぉ。ホントだ。台風で午前中休みにして暇になったから直した。
無理やりsubstr使う必要なかったな
my @lines = split /\n/, $str;
die unless $#lines % 2;
my @res;
while (@lines) {
my $line1 = shift @lines;
my $line2 = shift @lines;
print "num?: ";
my $num = <STDIN>;
my $post = substr $line2, $num;
$line2 =~ s/($post)$/$line1$1/xms;
push @res, $line2;
}
0762デフォルトの名無しさん
2009/10/08(木) 11:53:43$hoge{$a}{$b}{$c}{$d}...{$n}
を定義した順番でkeyを
keysで取り出したい
普通モジュールの Tie:IxHash を使うらしいけど
それだと最初の$aのkeyだけ定義順番でとりだせて
%{$hoge{$a}}以降の深い構造でのkeyが
順番どうりならず、ばらばらにkeysで取り出されるようになる
どうにかして定義した順番でどの段階でも
取り出せるようにしたいんだけど
おしえて下さい。
0763デフォルトの名無しさん
2009/10/08(木) 12:04:59キーを配列にとっとけ。
$hoge{$fuga}{$foobar} = 'bar';
push(@hoge, [$a, $foobar]);
0764デフォルトの名無しさん
2009/10/08(木) 12:07:39tie %{$hash{a}}, 'Tie::IxHash';
しておけば、
keys %{$hash{a}}は順番に取り出せるよ。
0765デフォルトの名無しさん
2009/10/08(木) 15:42:29(このように $hoge{$a}{$b}{$c}{$d}...{$n}=1)
>>764はつかえない
あと同じkeyが何回もでてくる可能性があるので>>763
もつかえない
(このように for $a (同じのあり)
for $b (同じのあり)
$hoge{$a}{$b}{$c}{$d}...{$n}++
)
あとでkeyをとりだすとき何回も同じのがでてきてしまう
>>763
いい方法ないでしょうか
0766デフォルトの名無しさん
2009/10/08(木) 15:45:51配列だから同じキーが何回出てこようとちゃんと
保存されていて問題ないはずだが?
0767765
2009/10/08(木) 15:46:38tie
すると前保持していた値がすべて真っ白になってしまうので
繰り返しのなかに>>764は
いれられない状態。
一日なやんでもいい方法が思いつかない
0768デフォルトの名無しさん
2009/10/08(木) 15:52:52という順番でkeyがでてくるとする
とりだすときは
a b c d e f g
でとりだしたいんだけど
できる?>>766
0769デフォルトの名無しさん
2009/10/08(木) 15:57:32やり方が悪いので、データ構造を見直すべし。
0770デフォルトの名無しさん
2009/10/08(木) 15:59:54そんなのすでに取り出したかハッシュで管理してとばせばいいだけだろ。
0771デフォルトの名無しさん
2009/10/08(木) 16:10:42それこそハッシュ使って同じキーが出てきたらスキップするようにすればいい。
んで$hoge->{$foo}の階層だけとりだしたいなら、
whlile(@hoge){
next unless $_->[$foo];
my @keys = @$_;
}
で取り出せるだろ。あ、あと>>763は間違いがあった。
間違い
$hoge{$fuga}{$foobar} = 'bar';
push(@hoge, [$a, $foobar]);
正しい
$hoge{$fuga}{$foobar} = 'bar';
push(@hoge, [$fuga, $foobar]);
0772デフォルトの名無しさん
2009/10/08(木) 17:35:28print sort keys %hash;
もしくは
print map $hash{$_}, sort keys %hash;
0773デフォルトの名無しさん
2009/10/08(木) 18:44:55Tie::IxHashを使えばいいんじゃないのか。
0774デフォルトの名無しさん
2009/10/08(木) 21:00:34/etc/shadowとsaltとpasswordを同じにしても出てくるハッシュが一致しません。
もし他によい方法があれば教えて下さい・・・
#!/usr/bin/perl
use strict;
use Digest::SHA qw(hmac_sha512_base64);
my $sha = hmac_sha512_base64("password","salt");
print "$sha\n";
0775デフォルトの名無しさん
2009/10/08(木) 22:25:230776デフォルトの名無しさん
2009/10/08(木) 23:12:20Webリソースって具体的に何だ?
0777デフォルトの名無しさん
2009/10/08(木) 23:20:33タイミングが悪くて非常に申し訳ない。
自己解決しました^^;
ダウンロード対象のつもりでした。html,zip,etc…
0778デフォルトの名無しさん
2009/10/08(木) 23:21:560779デフォルトの名無しさん
2009/10/08(木) 23:27:550780デフォルトの名無しさん
2009/10/08(木) 23:28:35LWP?とかいうのと関係ありますか?
0781デフォルトの名無しさん
2009/10/09(金) 05:57:46目的はクラッキング?
フツウの人はシャドウなんていじらないもんな。
0782デフォルトの名無しさん
2009/10/09(金) 07:14:21初心者な質問ですまん
0783デフォルトの名無しさん
2009/10/09(金) 07:45:580784デフォルトの名無しさん
2009/10/09(金) 08:52:12普通に代入じゃだめなのん?
0785デフォルトの名無しさん
2009/10/09(金) 09:14:52そういうシステムならcryptもsha512対応してると思うので
そっち使えばいいと思う。同じライブラリ呼ぶので確実な
筈だよ。
print crypt('password', '$6$salt');
0786デフォルトの名無しさん
2009/10/09(金) 14:08:33車道クラックか?
>>777
解決したならそれを書くのが筋。HTTPレスポンスのことならHTTPヘッダの
Content-Length: 行で取れるよな。
>>782
スカラ型の内部値を変えたいのか?質問の意図がよくわからん。
数値にしたけりゃ
$foo += 0;
文字列にしたけりゃ
$foo .= '';
内部的にリファレンスとか整数型にしたいとかだったら簡単な方法は知らん。
0787774
2009/10/09(金) 17:07:06普通にcryptで出来るんですね・・・ありがとうございました。
>>781
>>786
趣味で自宅サーバーをやっているのですが
Perlからsystem関数でuseraddを使うためです。
誤解を招く質問をしてしまい申し訳ありません。
0788777
2009/10/10(土) 03:46:06おっしゃる通り、HTTPレスポンスから取得出来ました。
Perlの質問ではありませんでした…
0789デフォルトの名無しさん
2009/10/11(日) 01:53:02掲示板に答えが書かれてしまうと自分の苦労の価値が下がってしまうから
それを避けるための自慰行為。
「Webリソース」とか書くようなバ力は788なんかじゃなくてwcとかで解決したつもりだろ。
0790デフォルトの名無しさん
2009/10/11(日) 03:25:57お陰さまで私も勉強になりました。
今時のシステムはパスワード暗号化にsha512使ってるなんて
知りませんでしたから。
うちのシステムは何を使ってるんだろ?
0791デフォルトの名無しさん
2009/10/11(日) 20:13:01日本語が文字化けしてしまいます
普通のtxtファイルなどは日本語でも文字化けしません
どうしたらいいんでしょうか
0792デフォルトの名無しさん
2009/10/11(日) 20:20:33使うな。
0793デフォルトの名無しさん
2009/10/11(日) 20:25:110794デフォルトの名無しさん
2009/10/11(日) 20:54:510795デフォルトの名無しさん
2009/10/11(日) 21:03:41それじゃphpでやってみます・・
0796デフォルトの名無しさん
2009/10/11(日) 23:57:04たとえばkeysでとりだしたハッシュの順序は一定ではないそうですが、
何回もperl *.plで実行しても同じ順序でキーが取り出されます。
ハッシュの順序はOS依存なんですか?それともperlのバージョン依存なんですか?
同じ環境のもとで同じプログラムにした場合はkeysでとりだされるキーも同じ順序になるのですか?
0797デフォルトの名無しさん
2009/10/12(月) 00:12:590798デフォルトの名無しさん
2009/10/12(月) 00:17:12これは誰から聞いたの?
0799デフォルトの名無しさん
2009/10/12(月) 00:35:340800デフォルトの名無しさん
2009/10/12(月) 00:51:45ハッシュに順序の保障を求めるべきではないとは思う
順序の保障が欲しければリストを利用/併用すべきだろうな
0801デフォルトの名無しさん
2009/10/12(月) 01:24:16perl5.10.0のperldoc -f keysでは、
===========
超訳。
perl5.8.1までは、セキュリティー上の理由から、
keysはプログラムを実行する度に違う順序で取り出されてた。
(順番自体は見た目上ランダムに決定されてる。ただし、
同一プロセス内で、hashに変更が無いならeach, valuesでも
keysと同じ順である事は保証される。)
===========
暗に「より新しいperlではkeysはhashに変更が無いなら
プログラムを複数回実行しても同じ順に取り出される。」
と言ってはいるが、それをkeysのperldocでは明文化は
してない。
ここまで調べて面倒になった。
俺も>>800氏と同じ見解だし。
0802デフォルトの名無しさん
2009/10/12(月) 01:32:14わざわざランダムにしてたんだ
for (keys
っていう処理はするけど、大抵はsortとセットだから気にしたこともなかった
0803デフォルトの名無しさん
2009/10/12(月) 02:52:49逆だ。5.8.0までは特定の順序で取り出されていたのを、
5.8.1以降で変わるようにしたんだ。
http://perldoc.perl.org/functions/keys.html
> Since Perl 5.8.1 the ordering is different even between different runs of Perl
> for security reasons (see "Algorithmic Complexity Attacks" in perlsec).
http://perldoc.perl.org/perlsec.html#Algorithmic-Complexity-Attacks
http://perldoc.jp/docs/perl/5.10.0/perlsec.pod
0804デフォルトの名無しさん
2009/10/12(月) 03:59:090805デフォルトの名無しさん
2009/10/13(火) 05:43:17長文処理の自作モジュールに引数としてファイル名を渡し、
サブルーチン内でopen、while(各行処理)、closeまで行なっています。
行数が数千行になるので各行で処理を終えたい(@本文のようなリストは作りたくない)のです。
現在サブルーチン内で各行をprintしていますが、どうもスマートではないと思い質問しました。
いまの状態を簡易に書くとこんな感じです。
(呼び出し側)
$foo->get('file')
(package foo内のサブルーチン)
sub get {
my $self = shift;
my $file = shift;
open my $in, "< $file" or die($!);
while (<$in>) {
#ここで各行を処理してprint
}
close $in;
return 1;
}
素直に呼び出し側でファイルを開いて行単位でサブルーチンを呼ぶべきかとも思うのですが、
それもなんかスマートでない気がしてモヤモヤしています。よろしければ方向性だけでも示唆ください。
0806デフォルトの名無しさん
2009/10/13(火) 06:03:320807805
2009/10/13(火) 08:56:41ありがとうございます。ちょっと勉強してみます。
0808デフォルトの名無しさん
2009/10/13(火) 09:12:49> #ここで各行を処理してprint
ここでプリントサブルーチンを呼べば?
なんなら、子プロセスかスレッド開いて渡すか
IPCでデータ流し込みもできる。
0809デフォルトの名無しさん
2009/10/13(火) 13:44:35クロージャ渡すかカーソルオブジェクト作ればいいんじゃね
0810805
2009/10/13(火) 19:37:22レスありがとうございます
いろいろと方法があるんですね
場当たり的にググって済ませてきたけど
そろそろ体系的な解説本を読まなきゃダメだと思った次第。ありがとうございました。
0811デフォルトの名無しさん
2009/10/13(火) 19:45:44ageてるし
ありがとうございますです
0812デフォルトの名無しさん
2009/10/14(水) 00:08:40> Perlでコルーチン使えるのかw
coroとかいうのがあるらしい。
Cでコルーチン実装する記事をみたら、案外簡単な様子。
>>810
perlの場合、オンラインマニュアルが一番詳しく分かりやすいかも。
チュートリアルもあるし。
Linuxで使ってるなら、man perlしてみて。
0813デフォルトの名無しさん
2009/10/14(水) 05:48:190814デフォルトの名無しさん
2009/10/14(水) 05:54:130815デフォルトの名無しさん
2009/10/14(水) 06:18:56そういやオフラインミーティングという言葉も死語だね。
略してオフ会は今でも使う?
0816デフォルトの名無しさん
2009/10/14(水) 08:13:33もはや現在、ついったーのオフ会なんかだと実世界で隣にいてもオンラインで会話する有様。
0817デフォルトの名無しさん
2009/10/14(水) 14:59:13それはのとぴしが普及して以来ずっとそう。
0818デフォルトの名無しさん
2009/10/14(水) 17:49:55まあ、技術系はね。
0819デフォルトの名無しさん
2009/10/15(木) 09:09:56ついったーって外国のSNSと思ってた。
プログラマって孤高なひとが多いのかと思っていたけど、
人と混じるのが好きな人多いのかな。
自分は同類なひとと交じるのは嫌いだからオフ会には出ないけど。
0820デフォルトの名無しさん
2009/10/15(木) 09:41:46孤高ってのは
息がピタッと合う奴があんまり居なくて
結果的に孤高になるだけじゃないかな
0821デフォルトの名無しさん
2009/10/15(木) 10:10:34喫茶店で机を囲んで誰も喋らずにiPhone操作してる光景はもはや異様
0822デフォルトの名無しさん
2009/10/15(木) 10:15:58それは「孤高」じゃなく「孤独」なんじゃないw
0823デフォルトの名無しさん
2009/10/15(木) 17:36:09ハッシュの原理調べろ。一定なわけないから。というか、一定にならないように
腐心する必要があるのがハッシュのキー順序。
バージョン間で順序が違うことはある。ハッシュ値計算に、どっかのバージョンでビット演算が入った。
>>810
並列作業したいなら、例えば
use Coro;
my @coro;
foreach('filea', 'fileb', 'filec'){ open my $fh, $_ or next; push @coro, async { while(<$fh>){ 処理; cede; } }; }
$_->join for @coro;
これで3つのファイルを1行ずつ処理できる。Coroはほとんどソース書き換えなしに
コルーチンが実現できる非常に優れたモジュール。AnyEventなんかは全面書き直しになることが多いからな。
本はまだ出てないよ。新しいモジュールだし。
ほれ
http://d.hatena.ne.jp/starsky5/20091009/1255063498
http://kaede.to/~canada/doc/understanding-coro
0824デフォルトの名無しさん
2009/10/15(木) 17:36:21いつの言葉だと思ってるんだ。サーバと端末(今だと端末エミュレータ)までの間がオンラインなんだよ。
>>819
外国のだよ。SNSかは微妙なサービスだが。
>>803
1実行単位での取り出し順序は常に同じだと明文的に保証されてるよ。それに依存してるモジュールも存在する。
>>803は実行ごとに違うって意味に取れるが。つーか5.8.6/8と5.10.0をLinuxとFreeBSDで複数回試したがどれも結果同じなんですけど。
%a = qw(a b c d e f g h i j);
print join(", ", keys %a, "\n") for (1 .. 10);
0825デフォルトの名無しさん
2009/10/15(木) 18:12:03単に、取り残されて排除されて孤立している人ほどネットの公開領域で叫ぶから
そう見えるだけじゃないのか?
0826デフォルトの名無しさん
2009/10/15(木) 19:00:14知ったかぶり
0827デフォルトの名無しさん
2009/10/15(木) 21:35:300828デフォルトの名無しさん
2009/10/15(木) 23:41:12そっかあ。
私も取り残されて引きこもりで友達いないです。
ひとと交じるの嫌い。
立場的に無理矢理人付き合いさせられてるので
ますます一人になりたいのです。
ワザワザオフ会にでる気持ちは矢張りわかりませんが
直接会ってもみんな引きこもりモドキなんですね。
集まるのは同じ空気を吸いたいからだろか。
寄り添うだけで安心できるから?
わかりません><
0829デフォルトの名無しさん
2009/10/16(金) 01:05:140830デフォルトの名無しさん
2009/10/16(金) 12:35:510831デフォルトの名無しさん
2009/10/16(金) 13:25:33ランダムにするのがデフォルトだったのは5.8.1だけで、5.8.2からは悪性のデータが挿入されたとき
だけやるようになったらしい。どうやって検出してるのかは記述がないのでわからんのだが、
ハッシュ値の衝突が多すぎるとかそんなのをトリガーにしてそうな気がする。
In Perl 5.8.1 the random perturbation was done by default, but as of 5.8.2 it is only used on individual
hashes if the internals detect the insertion of pathological data.
(5.10.1のperlsecより)
0832デフォルトの名無しさん
2009/10/16(金) 14:07:26cpanでcpprefがインストール出来ません
cpan[5]> install cppref
Warning: Cannot install cppref, don't know what it is.
cpan[6]> i /cppref/
No objects found of any type for argument /cppref/
cpan[7]> ls kazuho
604 2009-10-13 KAZUHO/cppref-0.06.meta
804294 2009-10-13 KAZUHO/cppref-0.06.tar.gz
どうすればいいんでしょうか?
0833デフォルトの名無しさん
2009/10/16(金) 14:45:02cpan -i App::Cppref
では?
0834デフォルトの名無しさん
2009/10/16(金) 14:55:11やっぱりありません
$ sudo cpan -i App::Cppref
Warning: Cannot install App::Cppref, don't know what it is.
Try the command
i /App::Cppref/
cpan[1]> i /Cppref/
No objects found of any type for argument /Cppref/
どういうことなの・・・
0835デフォルトの名無しさん
2009/10/16(金) 16:23:570836デフォルトの名無しさん
2009/10/16(金) 17:12:43文字列が見つからないな。なんかおかしいんじゃね?
急ぐんならcpanコマンド使わずに入れてみるとか。(tarball展開して
perl Makefile.PL; make; make install)
0837デフォルトの名無しさん
2009/10/16(金) 18:05:06そうですね。急ぎではないですがgithubからソースを取ってきました
必要ないかとは思いますが一応、騒いだ落とし前として・・・
Makefile.PL実行時に「readme_fromなんか定義してんじゃねえよ」とエラーが出る場合は
Module::Install::ReadmeFromPodを入れる必要があるようです
では、どうもありがとうございました
0838デフォルトの名無しさん
2009/10/16(金) 18:23:53cpan shell で
cpan> install KAZUHO/cppref-0.06.tar.gz
が常套手段なんだけど。
0839デフォルトの名無しさん
2009/10/16(金) 18:45:30なんでそんなことしなきゃインストールできんのかねぇ??
0840デフォルトの名無しさん
2009/10/16(金) 18:50:48cpan> install cppref-0.06.tar.gz
では試していたんですが、その前に名前空間を入れる必要があったんですね
ならinclineも同様の手段で入れられるかな
0841デフォルトの名無しさん
2009/10/16(金) 18:58:55すまんが>>838はコマンド打ってダウンロードしはじめた所でkillしたから
このケ
0842デフォルトの名無しさん
2009/10/16(金) 19:00:13って途中で送信してしもたorz...
0843デフォルトの名無しさん
2009/10/16(金) 19:20:29まぁcpanではエラー出ましたけど
Can't locate object method "arch_check" via package "PACK001" at inc/ExtUtils/MakeMaker.pm line 585.
0844デフォルトの名無しさん
2009/10/17(土) 08:40:05$val が 1か4か9の時
という風な条件文を書くとき
$val == (1|4|9){
では間違っていますか?
初歩的過ぎるのかネットでの調べ方もいまいち掴めませんので教えて下さい。
0845デフォルトの名無しさん
2009/10/17(土) 08:45:400846デフォルトの名無しさん
2009/10/17(土) 09:19:214 = 0100b
9 = 1001b
つまり (1|4|9) は 1101b なので 13
$val が 1か4か9の時はこう書く
if($val == 1 || $val == 4 || $val == 9){}
0847デフォルトの名無しさん
2009/10/17(土) 09:26:40その書式に極力合わせるなら、
$val =~ /^(1|4|7)$/ and do{
0848デフォルトの名無しさん
2009/10/17(土) 09:48:47ジャンクションですね、わかります
0849844
2009/10/17(土) 10:25:03やはり間違ってたんですね。どうも上手く行かない理由がやっとわかりました。
とりあえず地道に>>846の書き方で頑張ろうと思います。
>>847の方はまだ微妙に理解できないので、もっと精進しようと思います。
>>848も意味がどうにもわかりません。
0850デフォルトの名無しさん
2009/10/17(土) 10:49:520851デフォルトの名無しさん
2009/10/17(土) 12:39:07なるほどPerl6にはそんな機能があるのか
じゃあビット演算はどうするのよと思ったらこう書くのか・・・
1 +| 2 # == 3
5 +& 3 # == 1
0852デフォルトの名無しさん
2009/10/17(土) 15:08:570853デフォルトの名無しさん
2009/10/17(土) 17:59:340854デフォルトの名無しさん
2009/10/17(土) 19:20:13という感じで対象スクリプトの文法エラーを補足し、定形式("ファイル名:ラインNo.:メッセージ")にパースしてくれるスクリプトを手直ししています
(具体的に言うとvim72のpfm_perl.plです)
やりたいことは、@listからエラーなのかワーニングなのかを判別し、定形式にエラーのタイプを追加することです
現在はあらかじめ用意したメッセージのプロトタイプのリストとマッチするかどうかで決定していますが、誤判別も多くその度にリストを手直ししています
しかしどうも先駆者がいる気がしてなりません
文法チェックの結果をタイプ別に分類してくれるモジュールを知っていたら教えていただけませんか
0855デフォルトの名無しさん
2009/10/17(土) 19:42:14perlの文法チェックならPerl::Criticが定番で、
perltidy と一緒に突っ込むのが吉だ。
perl 本来のエラー、ワーニングならリファレンスに
全て書いてあるからそれを突っ込みゃいいだけだし、
そのスクリプト独自のエラーなら、スクリプトを grep
すれば良いだけの様な気がする。
って書いたが、やっぱズレてる気がするなあ。
0856デフォルトの名無しさん
2009/10/17(土) 21:32:18ありがとうございます
Perl::Criticについては、コーディングルールに反しているがperlでエラーとならないものに関してのチェッカーとしては利用できそうです
しかしPerl::Criticが生成するリファレンスをダンプしてみても普通のオブジェクトで、どこにもエラーやワーニングが入ってなさそうでした
本来のエラーやワーニングはどういったメソッドで取ってこれるのでしょうか
もしできないのでしたら、やはりperldoc perldiagから移植するしかないのでしょうか…
0857デフォルトの名無しさん
2009/10/17(土) 21:38:34エラーか警告かが判別できればいいんだったら、
BEGIN {
$SIG{__WARN__} = sub { warn "WARN: $_[0]"; };
$SIG{__DIE__} = sub { die "DIE: $_[0]"; };
}
1;
を Classify.pm とでもして、perl -MClassify -wc script.pl で先頭が DIE: か WARN: かで
判別できるんじゃない?
0858デフォルトの名無しさん
2009/10/17(土) 21:44:52その意図で
>perl 本来のエラー、ワーニングならリファレンスに
>全て書いてあるからそれを突っ込みゃいいだけだし、
って書いたつもりだったんだが…。
釈迦に説法かもしれんが、perldoc -l perldiag
でpodの場所が分るからそれコピーして来て捨てスクリプト
一発でデータベースは出来るだろ。
0859デフォルトの名無しさん
2009/10/17(土) 21:50:080860デフォルトの名無しさん
2009/10/17(土) 21:58:33すばらしい!まさにやりたかったことはこれです
ありがとうございます
>>858
すみません、リファレンスを変数のリファレンスと勘違いしてました…
今気づきました…
0861デフォルトの名無しさん
2009/10/17(土) 22:00:55解決おめでとう。
0862デフォルトの名無しさん
2009/10/18(日) 02:18:58もしかして、Class::Accessor::Fast::XSって継承効かないのか?
0863デフォルトの名無しさん
2009/10/18(日) 18:57:25@arytest = (1, 2, 3);
print @arytest; # 1
print "\n";
print "@arytest\n"; # 2
#2 のように""で括ると結果が空白区切りになるのですが、
これはそういうものなのでしょうか?
なぜこのような現象が起こるのでしょうか?
どこか規格で決められている等あるのでしょうか?
0864デフォルトの名無しさん
2009/10/18(日) 19:12:12perl -le '$,="\t";$"="\n"; my @arr = (1,2,3); print @arr; print "@arr";'
0865デフォルトの名無しさん
2009/10/18(日) 19:14:02ネットショップ立ち上げのために先日oscommerceをインストールしてみたのですが
しょっぱなからちゃんと動作しないなどの不具合が。
oscommerceはデータベースサーバなどと連携している分、不具合やエラーが出やすいかなと
思い、perl言語のみのルミーズカートcgiに興味を持ちました。
以前、perl言語のクイズ作成cgiを設置して何のトラブルもなくずっと使えていたのでcgi単独だと
安定して使えるのかなというイメージがあります。
ずばりルミーズカートならoscommerceよりも安定して管理できるでしょうか?
多少機能が劣っていてもシンプルな構成でトラブルが少なく扱いやすい物が一番と考えております。
個々の環境にもよるとは思いますが一般論でお答えいただければ幸いです。
0866デフォルトの名無しさん
2009/10/18(日) 19:15:16$,="\t";
$"="\n";
特殊変数が関係したのですね
勉強になりました
0867デフォルトの名無しさん
2009/10/18(日) 19:18:07板違い、スレ違いです。Web Prog板の方へどうぞ。
perlのスレに直接行かず、くだしつなどに最初に行った方が良いですよ。
0868デフォルトの名無しさん
2009/10/18(日) 19:20:34すいません。
誘導ありがとうございます。
そちらで再度聞いてみます。
0869デフォルトの名無しさん
2009/10/18(日) 19:35:10print "$array[100]\n";
$array[1] = 1000;
print "$array[1]\n";
print "elmnum: $#array\n";
print "-------------------\n";
$hash{'100'} = 500;
print "$hash{'100'}\n";
$hash{'1'} = 1000;
print "$hash{'1'}\n";
foreach $line (keys(%hash))
{
print "key: $line\n";
}
arrayは一行目 array[100] = 500; の部分で行き成り100要素分
動的に作成されるという事でしょうか?
下の $hash{'100'} = 500; の部分ではハッシュなので要素数の
2つ分だけ動的に作成される、という事でしょうか?
0870デフォルトの名無しさん
2009/10/18(日) 19:48:25> arrayは一行目 array[100] = 500; の部分で行き成り100要素分
> 動的に作成されるという事でしょうか?
No
> 下の $hash{'100'} = 500; の部分ではハッシュなので要素数の
> 2つ分だけ動的に作成される、という事でしょうか?
No
0871デフォルトの名無しさん
2009/10/18(日) 19:51:48何かいいソフトとかありますか?
0872デフォルトの名無しさん
2009/10/18(日) 20:55:10$test = [10, 20, 30];
print "$test->[0]";
-> のような矢印演算子は無名ハッシュとか無名配列へアクセスするために
用いられるという認識を持っていますが、その他つかわれる事がありますか?
つかわれるようで、もし気が向きました方使用例のサンプルをぜひ見せてください。
0873デフォルトの名無しさん
2009/10/18(日) 21:09:40print "$$test[0]\n";
print ${$test}[1];
print文にで二つ出力しています。意味的には等価らしいですが、
{}で括る場合はどういうときですか?シンボリックリファレンスである
ことを明示したいときでしょうか?
0874デフォルトの名無しさん
2009/10/18(日) 21:24:09x + (y * z)
意味的には等価らしいですが、()で括る場合はどういうときですか?
0875デフォルトの名無しさん
2009/10/18(日) 21:26:290876デフォルトの名無しさん
2009/10/18(日) 21:51:27$sub = sub (){ return 1};
print "ok\n" if $sub->();
>>873
ホントに?実験した?
入門書とか読んだ?
0877デフォルトの名無しさん
2009/10/18(日) 22:02:32ありがとうございます。
#入門書読んでません。知りたいところをちらちらネットで調べて繋ぎ合わせてます。
お金がないのでラクダ本が買えません。
0878デフォルトの名無しさん
2009/10/18(日) 22:03:36print "ok\n" if $sub->(); は関数ポインタみたいなもんですね、勉強になります
0879デフォルトの名無しさん
2009/10/18(日) 22:05:05どっかにわかりやすいサイトない?
入れたはいいがどうやったら既存のデータベースから情報がとれるのかがわからん。。
0880デフォルトの名無しさん
2009/10/18(日) 22:05:15ttp://www.nozawashinichi.sakura.ne.jp/usingmt/2008/08/perl.html
0881デフォルトの名無しさん
2009/10/18(日) 22:48:08データベースから情報を取るのはDBIなりO/Rマッパーなりを使うんじゃないの?
HTML::Template他テンプレートエンジンは、必要な情報を全てまとめた後で使うものだと思うけど
0882デフォルトの名無しさん
2009/10/18(日) 22:52:10レス有難う御座います。
ちょっと表現の仕方がおかしかったです、すみません。
一応別の単体で動作するデータベース関連のプログラムがあるのですが、
それをどう組み込むかがよく分からないということです。。
ぐぐってみたのですが、どうもわからずに。。
0883デフォルトの名無しさん
2009/10/18(日) 23:33:26my (@rfary) = ["7", "8", "9"];
としたとき
print @rfary; ですべてが出力されません
↓を試したのですが、ループは一回しか発生せず7しか出力されません
foreach (@rfary) {
print ${ $_ }[$cnt];
$cnt++;
}
探し回って↓のようにするとうまくいくようなのですが、どうにも
ややこしすぎます。
for $i (0 .. $#rfary) {
for $j (0 .. $#{$rfary[$i]}) {
print $rfary[$i][$j];
}
print "\n";
}
無名配列を print @rfary のように簡単に全出力する方法はないのでしょうか?
また、なぜ print @rfary で全出力出来ないのでしょうか?
0884デフォルトの名無しさん
2009/10/18(日) 23:40:47perldoc perldsc
perldoc perlref
perldoc perlop
ここらへんをコマンドプロンプトなりなんなりに打ち込んで勉強しろ
0885デフォルトの名無しさん
2009/10/18(日) 23:42:25google でも良い
0886デフォルトの名無しさん
2009/10/18(日) 23:55:18わかりました。perldoc perlref に @{[mysub(1,2,3)]} みたいなんがあって
print @{["7", "8", "9"]}; が行けるかなぁ思って
print @{$rfary[0]}; やったら左で出来ました。
上記のサイトでもうちょっと勉強します。
0887デフォルトの名無しさん
2009/10/19(月) 00:04:35my %hash = { ... } ;
ってポカ書いてる様な所で勉強すんなよ。
ちょっと古いが、
ttp://perldoc.jp/docs/perl/5.8.8/perlref.pod
ttp://perldoc.jp/docs/perl/5.8.8/perldsc.pod
ttp://perldoc.jp/docs/perl/5.8.8/perlop.pod
ttp://perldoc.jp/docs/perl/5.8.8/perlobj.pod
(下二つは、同一人物かどうかしらんが矢印演算子について質問した人用)
最新版はお前さんの PC の中にある。
0888デフォルトの名無しさん
2009/10/19(月) 00:48:34ありがとうございます。英語じゃない日本語のサイトもあったのですね(PCに本マニュアルもあると。
my %hash = { ... } ; 実行したら正しく出力されなかった…危ない所でした。
ご紹介頂いた参考にしながらラクダ買わなくてもある程度頑張れそうです。
これから勉強して少しずつ理解を深めてゆきます。
0889デフォルトの名無しさん
2009/10/19(月) 10:22:28横やりなのだけど、perldocの後にperlXXXXの何が来るかを調べたい時はどうにかする方法ないですか?
perldoc perlrefを知った時に便利だなぁと思ったのだけど、
他にどういうのがあるのか一覧を見たい
http://perldoc.jp/docs/perl/5.10.0/
ここ見たら一覧わかるんだけど、コマンドラインでperldoc使って出す方法があるんじゃないかなと思って。
0890デフォルトの名無しさん
2009/10/19(月) 10:30:30perldoc perl かもう少し詳しく知りたいときは perldoc perltoc
0891デフォルトの名無しさん
2009/10/19(月) 11:10:45おぉぉ。ありがとう。ここ半年悩んでことが解けました
0892デフォルトの名無しさん
2009/10/19(月) 11:12:06> ちょっと質問なのですが、
>
> my (@rfary) = ["7", "8", "9"];
これ間違いじゃね?
槍鯛のはこれだろ?
my @rfary = ("7", "8", "9");
あえてリファレンスを使いたいならかまわんが…
もしくはこれ。
my $rfary = ["7", "8", "9"];
0893デフォルトの名無しさん
2009/10/19(月) 12:54:030894デフォルトの名無しさん
2009/10/19(月) 13:56:130895デフォルトの名無しさん
2009/10/19(月) 18:16:02その下の正規表現についてはhitするのですが、これは何故なのでしょうか?
-----------------------
#!/usr/bin/perl -w
use JSON::XS;
my $js = JSON::XS->new->encode([ 'あ' ]);
print index($js,'あ'), "\n";
print $js =~ /あ/;
0896デフォルトの名無しさん
2009/10/19(月) 18:24:15プンプンにおいぜ
0897デフォルトの名無しさん
2009/10/19(月) 18:46:29getoptsを使用して実行時にオプションを指定出来るようにしたのですが、
-f1や-f2といった2文字以上のオプションを使おうとしても認識してくれません。
2つのファイルを読み込ませるというスクリプトの仕様上、-fや-Fより-f1,-f2で指定する方がわかりやすいのですが
2文字以上のオプションを使うためにはどうすればよいのでしょうか。
0898デフォルトの名無しさん
2009/10/19(月) 19:09:01http://search.cpan.org/search?query=Getopt%3A%3A&mode=module
好きなの探したまえ。
0899デフォルトの名無しさん
2009/10/19(月) 20:07:31Getopt::Std以外でデフォルトで入っているのはGetopt::Long だけのようですね…
ググったところ、日本語のドキュメントが見つかったので今から勉強します。
ありがとうございました。
0900デフォルトの名無しさん
2009/10/19(月) 20:10:37失礼致しました。
0901デフォルトの名無しさん
2009/10/19(月) 22:20:04携帯での利用も考えているため、実際にリファラをとるわけにはいかないので
hiddenを利用しようと思っていますが、実際に出来るものなのでしょうか。
0902デフォルトの名無しさん
2009/10/19(月) 22:42:08http://pc11.2ch.net/php/
0903デフォルトの名無しさん
2009/10/19(月) 23:38:24誘導有難う御座います。
スレ汚しすみませんでした。
0904デフォルトの名無しさん
2009/10/23(金) 19:26:59Devel::NYTProfなんですが、nytprof.outは出力してるんですが、
nytprofhtmlをしてもntyprof/index.htmlが作られないのはWin機だからでしょうか?
それとも環境PATH通す必要とかありますか?
実家に帰らないと戌が手元にない状態です。
0905デフォルトの名無しさん
2009/10/23(金) 22:21:580906デフォルトの名無しさん
2009/10/23(金) 22:30:450907デフォルトの名無しさん
2009/10/24(土) 00:11:440908デフォルトの名無しさん
2009/10/24(土) 00:14:51個人で飼うことも可能かもしれんが・・・
0909デフォルトの名無しさん
2009/10/24(土) 01:35:550910デフォルトの名無しさん
2009/10/24(土) 07:07:340911デフォルトの名無しさん
2009/10/24(土) 11:29:09%Data1 = ("Name" => "Shintaro", "Address" => "Japan", "Tel" => "0123");
%Data2 = ("Name" => "Jiro", "Address" => "America","Tel" => "0456");
$DataArray = [ \%Data1, \%Data2 ];
print "result:".$DataArray->[0]{"Name"}."\n";
print "result:".$DataArray->[0]{"Address"}."\n";
print "result:".$DataArray->[0]{"Tel"}."\n";
print "result:".$DataArray->[1]{"Name"}."\n";
print "result:".$DataArray->[1]{"Address"}."\n";
print "result:".$DataArray->[1]{"Tel"}."\n";
のようにするという事をしりました。ですが、これでは配列が100個あったと
したら、%Data1〜%Data100 まで宣言しなければならないのでしょうか?
何かうまいやり方があったら教えてください
0912デフォルトの名無しさん
2009/10/24(土) 11:29:59%Data1 = ("Name" => "Shintaro", "Address" => "Japan", "Tel" => "0123");
%Data2 = ("Name" => "Jiro", "Address" => "America","Tel" => "0456");
$DataArray = [ \%Data1, \%Data2 ];
print "result:".$DataArray->[0]{"Name"}."\n";
print "result:".$DataArray->[0]{"Address"}."\n";
print "result:".$DataArray->[0]{"Tel"}."\n";
print "result:".$DataArray->[1]{"Name"}."\n";
print "result:".$DataArray->[1]{"Address"}."\n";
print "result:".$DataArray->[1]{"Tel"}."\n";
のようにするという事をしりました。ですが、これでは配列が100個あったと
したら、%Data1〜%Data100 まで宣言しなければならないのでしょうか?
何かうまいやり方があったら教えてください
0913デフォルトの名無しさん
2009/10/24(土) 11:37:14$DataArray = [];
$DataHash = {};
0914デフォルトの名無しさん
2009/10/24(土) 11:37:45呼んでるよー。
0915デフォルトの名無しさん
2009/10/24(土) 13:18:31もしここでよかったら、次のプログラムの修正方法を教えてください!
&unko;
sub unko
{
@array = ();
for ($cnt=0; $cnt<5; ++$cnt)
{
my %hash = (
"a" => 1,
"i" => 2,
"u" => 3
);
$array[$cnt] = [ %hash ];
print "address:$array[$cnt] val:".$array[$cnt]->{'a'}."\n";
}
}
0916デフォルトの名無しさん
2009/10/24(土) 13:35:19[ %hash ]; を { %hash } にすればいいのかな…
自己解決です。>>913様の書き込みがヒントになったようです。
0917デフォルトの名無しさん
2009/10/24(土) 13:41:01ハードリファレンスにあたりますか?
0918デフォルトの名無しさん
2009/10/24(土) 13:46:09角カッコ [ ] は配列(無名配列という)を作ります。
波カッコ { } はハッシュ(無名ハッシュという)を作ります。
これらを組み合わせれば、幾重もの深い階層のデータ構造を作ることができます。
$DataArray = [
{ "Name" => "Shintaro", "Address" => "Japan", "Tel" => "0123" },
{ "Name" => "Jiro", "Address" => "America","Tel" => "0456" },
];
print "result:".$DataArray->[0]{"Name"}."\n";
print "result:".$DataArray->[0]{"Address"}."\n";
print "result:".$DataArray->[0]{"Tel"}."\n";
print "result:".$DataArray->[1]{"Name"}."\n";
print "result:".$DataArray->[1]{"Address"}."\n";
print "result:".$DataArray->[1]{"Tel"}."\n";
0919デフォルトの名無しさん
2009/10/24(土) 14:14:080920デフォルトの名無しさん
2009/10/24(土) 14:39:57perl のハードリファレンスとシンボリックリファレンスは似たようなものですか?
要点からいえば何がハードリファレンスで何がシンボリックリファレンスか
一覧のようにまとめたサイトはありませんか?
名前でアクセスするのがシンボリックで、$$でアクセスするのがハードリファレンス??
さっぱり頭がこんがらがっています、気が向いた方助けてください
0921デフォルトの名無しさん
2009/10/24(土) 15:00:41レキシカル変数(my)が参照できない理由はなにですか?
perlがそういう作りだから仕方ないのですか?
my $lemon = "yellow and sour!";
$fruit = "lemon"; # 変数名を変えてみる
print "$fruit is $$fruit\n"; #"yellow and sour!"; と表示されない
そんなの使っていて不便ではないですか?
0922デフォルトの名無しさん
2009/10/24(土) 15:07:06そんなニーズ誰もあると思わないだろ。
0923デフォルトの名無しさん
2009/10/24(土) 15:07:480924デフォルトの名無しさん
2009/10/24(土) 15:08:04print "$fruit is ${$fruit}\n";
0925デフォルトの名無しさん
2009/10/24(土) 15:09:59ハードリファレンスにあたるんですか?
0926デフォルトの名無しさん
2009/10/24(土) 15:31:59シンボリックリファレンス自体あまり使う事がないのか…
0927デフォルトの名無しさん
2009/10/24(土) 15:36:250928デフォルトの名無しさん
2009/10/24(土) 15:48:27白魔術(黒魔術?)的に使うのであれば、局所的にno strict 'refs'として使えばいいと思います。
0929デフォルトの名無しさん
2009/10/24(土) 15:54:250930デフォルトの名無しさん
2009/10/24(土) 20:04:14ActivePerl 5.10.1で試してみたけど出来たよ。
パスはC:\Perl\site\bin;C:\Perl\bin;だけど、この辺は標準だと思う。
0931デフォルトの名無しさん
2009/10/24(土) 23:29:44よりは実行時に処理される文である
という記述を見かけ以下を試してみました
#01
for ($cnt=0; $cnt<3; ++$cnt)
{
my @list = (1, 2);
print \@list; #ではアドレスが変わらない
print "\n";
}
#02
for ($cnt=0; $cnt<3; ++$cnt)
{
my @list = (1, 2);
$LoL[$cnt] = \@list;
print $LoL[$cnt]; #
print "\n";
}
#02のようにスカラー変数への代入を一つかませて初めてアドレスが
変わるのですが、perlはこういうもんなんですかね?
なんかしっくりこないです・・・
0932デフォルトの名無しさん
2009/10/24(土) 23:43:410933デフォルトの名無しさん
2009/10/25(日) 00:26:27int cnt;
for (cnt=0; cnt<3; ++cnt)
{
char *ptr[] = { "1", "2", };
printf("%p", ptr);
}
//02
int cnt;
for (cnt=0; cnt<3; ++cnt)
{
char *ptr[] = { "1", "2", };
char *strgptr;
strgptr = ptr;
printf("%p", ptr);
}
が同じという事でしょうか?・・(そうだったかな…
perl は代入されて初めて実体をもったりするのかな…なんて
0934デフォルトの名無しさん
2009/10/25(日) 01:25:49理解したほうが良いよ。
それじゃあ、伸びない。
0935デフォルトの名無しさん
2009/10/25(日) 01:46:06>>932の方と>>934の方が同じならばCで同等の事書いても同じじゃない気がするんですが…
perlにおいて、という事であれば確かにperl はインタプリタ言語で、
実行時にメモリに領域が確保されるというぐらいの認識しかないんですが
0936デフォルトの名無しさん
2009/10/25(日) 01:51:35最適化の仕業でしょ。
1)では配列を使い回せるけど、2)では新しく生成し直さないといけない
0937デフォルトの名無しさん
2009/10/25(日) 01:55:032番目のどこが同じなんだよ。問題外。
0938デフォルトの名無しさん
2009/10/25(日) 05:38:23単純にガーベッジコレクションの話。
http://perldoc.jp/docs/perl/5.8.8/perlref.pod
> ハードリファレンスは賢く実際に参照されている数を管理していて、
> その数が 0 になれば自動的に解放を行ないます。
>>931の#1はループ脱出時に誰も参照してないから解放される。
#2は、$LoLが参照してるから解放されない。
0939デフォルトの名無しさん
2009/10/25(日) 05:48:25× ループ脱出時
○ ループの実行ブロック終端
だった
0940デフォルトの名無しさん
2009/10/25(日) 11:17:470941デフォルトの名無しさん
2009/10/25(日) 11:35:580942デフォルトの名無しさん
2009/10/25(日) 19:14:52my $last = pop @_;
my $last2 = pop @_;
my ($arg1, @options) = @_;
...
}
というコードがあるんですけど、これをもっときれいに書くとしたらどうしたらいいでしょか。
いやそんなキモい引数の渡し方をするなというのはその通りなんですけど、互換性をとるためにこんなことをしています。
そんで、なんかもっといい書き方がないかなーと思って質問しました。
my ($arg1, @options, $last2, $last) = @_;
でいけるかと思いましたが、これは
my ($arg1, @options) = @_;
my ($last2, $last);
と同じみたいでした。
0943デフォルトの名無しさん
2009/10/25(日) 19:18:22ってどんな時使うの?
0944デフォルトの名無しさん
2009/10/25(日) 19:18:460945デフォルトの名無しさん
2009/10/25(日) 19:19:08正規表現に注釈を書きたいとき
0946デフォルトの名無しさん
2009/10/25(日) 19:38:57第二引数が、LIST じゃなく ARRAY と言う制約を受けるけど。
prototype で桶じゃない?
use Data::Dumper ;
sub f1 ($\@$$){
my ( $arg1, $options, $last2, $last ) = @_ ;
my @options = @{ $options } ; # お好みで。
# print してみると。
print Dumper \$arg1, \@options, \$last2, \$last ;
}
my @arr = ( 2,3 ) ;
f1 ( 1, @arr, 4, 5 ) ;
0947デフォルトの名無しさん
2009/10/25(日) 20:12:49my @options = splice @_, 1, -2;
my($arg1, $last2, $last) = @_;
0948デフォルトの名無しさん
2009/10/25(日) 23:49:36…なんぼでもやり様はある罠。
0949デフォルトの名無しさん
2009/10/26(月) 00:31:03感動した。
引数が足りなかったときとか
課題は残るものの。
0950デフォルトの名無しさん
2009/10/26(月) 00:33:29スライスするなら何故分ける?
my($arg1, $last2, $last, @options) = @_[0, -2, -1, 1 .. $#_ - 2];
0951デフォルトの名無しさん
2009/10/26(月) 02:33:56配列を受け取るとそれ以後全部取ってしまうから
配列を渡す必要があるなら最後に取るかリファレンスで渡すかグローバル使うか
0952デフォルトの名無しさん
2009/10/26(月) 03:26:40そんなことわかってるだろ……
0953デフォルトの名無しさん
2009/10/26(月) 04:49:05互換性をとるというのがよく分からんので
この方法は利用できないのかもしれないけど
0954デフォルトの名無しさん
2009/10/26(月) 09:41:35Perlって何でもありだなあ。
長所であり短所でもある。
0955デフォルトの名無しさん
2009/10/26(月) 09:52:150956デフォルトの名無しさん
2009/10/26(月) 13:17:26catalystの質問なので場違いであればすみません。
sub a : Local{
my ( $self, $c ) = @_;
$c->forward('b');
}
sub b : Private{
my ( $self, $c ) = @_;
my $a = 'hogehoge';
}
sub bの$aの値をsub aで受け取りたいのですがどうすればいいでしょうか?
0957デフォルトの名無しさん
2009/10/26(月) 14:53:260958デフォルトの名無しさん
2009/10/26(月) 15:07:31$c->{stash}使うとかその辺だろうか。
0959デフォルトの名無しさん
2009/10/26(月) 17:17:44ま、 $aは使うの止めれ
0960デフォルトの名無しさん
2009/10/26(月) 17:26:070961デフォルトの名無しさん
2009/10/26(月) 17:47:43のですが、なぜ 404 でないのでしょうか
use LWP;
my $ua = LWP::UserAgent->new;
my $res = $ua->get(
"http://www.hoge.ne.jp/",
"User-Agent" => "myUA/0.1",
"X-Hoge" => "hoge"
);
print $res->as_string;
これだけなんですが
500 Can't connect to www.hoge.ne.jp:80 (Bad hostname ... (以下略)
と表示します。そういう仕様なんでしょうか
0962デフォルトの名無しさん
2009/10/26(月) 17:50:280963デフォルトの名無しさん
2009/10/26(月) 18:01:13thnx そういう仕様ということで納得することにします
ブラウザは LWP 使っていないから 404 を返すってことでいいんですね?
404 返したい時に使えるモジュールなどあるのでしょうか??
0964デフォルトの名無しさん
2009/10/26(月) 18:32:56サーバーに繋がらないのとサーバー上にリソースが無いのとでは意味が違う
0965デフォルトの名無しさん
2009/10/26(月) 18:52:20なるほどそういうことか…なんとなく得心いきました、ありがとう
0966デフォルトの名無しさん
2009/10/26(月) 19:15:47があるね。
0967デフォルトの名無しさん
2009/10/26(月) 19:19:390968デフォルトの名無しさん
2009/10/26(月) 19:20:07誤解を招く。
0969デフォルトの名無しさん
2009/10/26(月) 19:23:200970デフォルトの名無しさん
2009/10/26(月) 19:28:360971デフォルトの名無しさん
2009/10/26(月) 19:28:51hoge.example.com
0972デフォルトの名無しさん
2009/10/26(月) 19:29:23does-not-exist.example.com とか
0973デフォルトの名無しさん
2009/10/26(月) 19:34:11"nonexistent" という単語があってだな…
0974デフォルトの名無しさん
2009/10/27(火) 13:50:36ttp://pp-perl.blogspot.com/2007/06/loglog4perl.html
を参考に Log::Log4perl を使おうとしてるんですが、走らせると
Wide character in print at /usr/local/lib/perl5/site_perl/5.10.0/Log/Log4perl/Appender/File.pm line 245.
ってのが出続けるのですが、UTF8フラグを取る設定方法がわかりません。
どなたか知りませんか?
0975974
2009/10/27(火) 15:26:47--------------------------------------------------
# log4perl.conf
log4perl.logger.mylogger.file = INFO, File
log4perl.appender.File = Log::Log4perl::Appender::File
log4perl.appender.File.filename = debug.log
log4perl.appender.File.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.File.layout.ConversionPattern = %d %F(%L) [%p] %m %n
log4perl.appender.File.utf8 = 1
0976デフォルトの名無しさん
2009/10/28(水) 13:22:38簡潔に書く方法はないでしょうか?
while ($a =~ /<%=(.*?)%>/) {
$result = eval($1);
$a =~ s/<%=(.*?)%>/$result/;
}
0977デフォルトの名無しさん
2009/10/28(水) 13:42:05s/<%=(.*?)%>/$1/gee;
でいけるでしょ。
0979デフォルトの名無しさん
2009/10/28(水) 16:25:20http://yutori7.2ch.net/test/read.cgi/news4vip/1256707678/
316406249999999
0980デフォルトの名無しさん
2009/10/28(水) 18:20:07どうすればいいんでしょうか。
0981デフォルトの名無しさん
2009/10/28(水) 18:24:090982デフォルトの名無しさん
2009/10/28(水) 18:37:13取り消します。
変数を使って置き換えしたいんですが、変数の中の$1が展開されません。
どうすればいいんでしょうか。
0983デフォルトの名無しさん
2009/10/28(水) 18:37:55>>980でした……。
>>981さんごめんなさい。
0984デフォルトの名無しさん
2009/10/28(水) 18:43:29<%=***%>の***の中に$1という文字列が含まれているということ?
変換処理のコード
変換対象の文字列
どのような変換を期待していたか
実際にどう変換されたか
をまずは晒してください。
0985デフォルトの名無しさん
2009/10/28(水) 18:51:30s/$a/$b/g;
マッチ文字列と置き換え文字列をファイルから読み込んで、変数に格納して、マッチさせようと思ったんですが
置き換え文字列の$1が$1と出力され、展開されません。
0986デフォルトの名無しさん
2009/10/28(水) 19:13:35コードを全部晒しなさい
0987デフォルトの名無しさん
2009/10/28(水) 19:33:09@list = <LIST>;
close(LIST);
for($x=0; $x <= $#list/2; $x++){
($a,$b) = @list;
chomp($a,$b);
if($ARGV[0] =~ /$a/){
$c = $ARGV[0];
$c =~ s/$a/$b/g;
last;
}
}
print $c;
こんな感じです。
0988デフォルトの名無しさん
2009/10/28(水) 21:51:320989デフォルトの名無しさん
2009/10/28(水) 22:10:15$1のまま出力されました。
0990デフォルトの名無しさん
2009/10/28(水) 22:27:20こうしたらどうなりますか?
$c =~ s/$a/q{"}.$b.q{"}/gee;
0991デフォルトの名無しさん
2009/10/28(水) 22:30:36解決しました。
ありがとうございます。
0992デフォルトの名無しさん
2009/10/28(水) 23:54:53abc.def.ghi.というテキストがあったとして、
配列にabc. def. .ghiをそれぞれ格納したいのですが、やり方がわかりません。
何か良い方法があれば教えて下さい。
よろしくお願いします。
0993デフォルトの名無しさん
2009/10/28(水) 23:59:410994デフォルトの名無しさん
2009/10/29(木) 00:10:01出来ました!
こんな簡単にできるとは思ってもいませんでした。
ありがとうございました。
レス数が950を超えています。1000を超えると書き込みができなくなります。