Perlについての質問箱 41箱目

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
"The duct tape of the Internet" こと、Perl についての質問箱です。
"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 あたり
2デフォルトの名無しさん:2009/08/07(金) 03:03:43
[プログラミング自体の経験が無い奴はまずココを読め]
Perl プログラミング講座: 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/
3デフォルトの名無しさん:2009/08/07(金) 03:04:24
4デフォルトの名無しさん:2009/08/07(金) 03:05:04
# [Perl 日本語処理の基礎の基礎]
# このレスは、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 でエンコードする必要があります。
5デフォルトの名無しさん:2009/08/07(金) 03:05:45
6デフォルトの名無しさん:2009/08/07(金) 03:06:26
7デフォルトの名無しさん:2009/08/07(金) 07:25:46
前スレの>>232を実行しましたが、hogehogeとしか出力しません。
どこかおかしくはないでしょうか?

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とか考えずに上記のようにしろ。
万が一の確立で、そんな面倒なソースがまわってきたら嫌だ。
8デフォルトの名無しさん:2009/08/07(金) 08:01:38
>どこかおかしくはないでしょうか?
前スレで色々指摘されてんじゃん。


---- config.pl ----
package config;
use strict;
sub param { ${ { hoge => 'abcdefg', fuga => '12345' } }{$_[0]} ; }
1;

で動く様になるけど、、、


>>1
9デフォルトの名無しさん:2009/08/07(金) 08:14:53
>>8
d
動きました。
10デフォルトの名無しさん:2009/08/07(金) 10:20:01
Programming Perlの新しい版はいつでるの?
11デフォルトの名無しさん:2009/08/07(金) 10:49:17
あれは多分
package config;
use strict;
sub param {
 return {
  hoge => 'abcdefg',
  fuga => '12345',
 }->{$_[0]};
}
1;
こういう事をしたかったんだろうね。
でもこれ呼び出す度に変数定義コストが掛かる上に例え同じkeyでも
違うアドレスの値を返すという駄目の見本のようなコード
12デフォルトの名無しさん:2009/08/07(金) 10:54:29
>>10
Perl6が出てから半年後ぐらいじゃないの?
13デフォルトの名無しさん:2009/08/07(金) 14:16:58
Configは素直にYAML使え。
コスト?知らんがな。
14デフォルトの名無しさん:2009/08/07(金) 15:13:10
前スレのあいつは酷かったな。頭悪いレスしか書けないのになんで
あんな人を馬鹿にした態度なんだろ。
あのレベルでPerlを生業としてるとはとても思えない。
15デフォルトの名無しさん:2009/08/07(金) 15:36:15
すいません、質問があります。

GetOptions使用時に
GetOptions( "startup|first!" => \$startup ,
のようにパイプラインが使われていることがあるのですが、
どういう意味があるのですか?
16デフォルトの名無しさん:2009/08/07(金) 15:41:31
1715:2009/08/07(金) 16:14:52
ああ、どっちもいけるってことですか。

ありがとうございます。
18デフォルトの名無しさん:2009/08/07(金) 17:38:40
PHPのob_start()のように、出力を一時的にバッファリングすることはできますか。

ob_start();
print "aaa¥n";   #なにも表示されない
$output = ob_get_clean(); # $output eq "aaa¥n"

よろしくお願いします。
19デフォルトの名無しさん:2009/08/07(金) 18:14:17
クラス名 Foo::Bar::Baz::MyClass を MyClass という名前で使えるようにするにはどうしたらいいですか。
Exporterを使うのかと思いましたが、できませんでした。
ためしたコード:

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 というエラーに成りました。
20デフォルトの名無しさん:2009/08/07(金) 18:22:49
>>19
オブジェクト指向について勉強しなおすといいと思うよ。
21デフォルトの名無しさん:2009/08/07(金) 18:23:27
>>18
STDOUTを書き換えればできたと思う。
ソース、おぼろげな記憶。
22デフォルトの名無しさん:2009/08/07(金) 18:25:15
当てずっぽうで書いて動かないから質問する
23デフォルトの名無しさん:2009/08/07(金) 18:35:39
>>18
ファイルに退避させることはできるな。
#!/usr/bin/perl

*TAIHI = *STDOUT;
open(IN, '>/tmp/foo');
*STDOUT = *IN;
print "hello, world!\n";
*STDOUT = *TAIHI;
print "hi, there!\n";

メモリに退避する方法は良く分からん。open2使ったけど
うまくいかんかった。
24デフォルトの名無しさん:2009/08/07(金) 18:49:03
#!/usr/bin/perl
use 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を逆にしてて動かないだけだった。
25デフォルトの名無しさん:2009/08/07(金) 18:49:47
あーselect STDOUTっての要らないから取っといて。
26デフォルトの名無しさん:2009/08/07(金) 18:53:10
5.8.0からin-memoryバッファをopenできるようになったよ

use 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();
27デフォルトの名無しさん:2009/08/07(金) 19:04:28
>>26
うおーそれ見ると俺完全にズレてるな。精進しねーと。thx。
28デフォルトの名無しさん:2009/08/07(金) 20:47:08
>>23-27
どうもありがとうございます。さっそく試してみます。

29デフォルトの名無しさん:2009/08/07(金) 20:49:04
>>26
ob_get_clean()のなかでMEMをcloseしてないようですが、close(MEM) をいれたほうがいいですか。
それともなくてもかまわないでしょうか。
30デフォルトの名無しさん:2009/08/07(金) 21:29:32
Data::Dumper よりもっとコンパクトに表示できるライブラリはないでしょうか。
Data::Dumperの表示は
$VAR1 = [
'A',
'B'
  ];
こんなかんじなので、['A', 'B'] みたいにコンパクトに表示してくれるライブラリを探しています。
ちょうどRubyのinspectみたいなのが希望です。
31デフォルトの名無しさん:2009/08/07(金) 22:05:05
>19
ttp://search.cpan.org/~ovid/aliased/

>30
$Data::Dumper::Indent = 0;
32デフォルトの名無しさん:2009/08/07(金) 22:24:17
>>31
さんくすです
33デフォルトの名無しさん:2009/08/08(土) 11:16:10
これ↓、入札者が一人しかいなかったので高いのかなーと思ったけど買いでしたかね?

Perlベストプラクティス - Yahoo!オークション
http://page11.auctions.yahoo.co.jp/jp/auction/n73044025
34デフォルトの名無しさん:2009/08/08(土) 11:44:14
こないだブクオフで500円で買ったやつだな。
35デフォルトの名無しさん:2009/08/08(土) 18:17:21
先日のDoS攻撃でTwitter陥落してから、Net::Twitterが動かないのですが
何か仕様変わったんですかね?
36デフォルトの名無しさん:2009/08/12(水) 13:57:10
これって何で0って表示になるんですかね?

%hash = (hash-key1 => 0, hash-key2 => 2);
print keys %hash; #=> 0
37デフォルトの名無しさん:2009/08/12(水) 14:12:15
hash-key1は hash - key1で、数値コンテキストでは数に見えない
文字列は0だから、0 - 0で0。hash-key2も同じ。
38デフォルトの名無しさん:2009/08/12(水) 14:12:59
use strict使えよ
39デフォルトの名無しさん:2009/08/12(水) 14:19:12
>>37
d
40デフォルトの名無しさん:2009/08/13(木) 20:17:58
>>35
スクリプト対策されたんじゃね?
もしくはHTTPヘッダを精査されてるとか
リファラーがないと無効なページがあるとか?
41デフォルトの名無しさん:2009/08/14(金) 14:57:59
$tripkey = "#istrip"; # パスワードとする文字列(# 付き)
$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文字目を取り出して
代入しているということなのですか?
42デフォルトの名無しさん:2009/08/14(金) 18:36:05
わたしは自分で確認することは絶対にしません。
43 ◆TWARamEjuA :2009/08/14(金) 19:31:50 BE:1089252-BRZ(10072)
ちなみに2ちゃんねるのトリップ回路は改正されたですよ♪

【堅牢】トリップの新方式を考えてみませんか【互換性】 ★2
http://qb5.2ch.net/test/read.cgi/operate/1245724530/l50
44デフォルトの名無しさん:2009/08/14(金) 20:03:13
>>41
そう。だから$saltにはstがはいってる。
なんでH.を連結してるのかよくわからんけど
45デフォルトの名無しさん:2009/08/15(土) 16:52:33
以下のようにasciiが混じった日本語(cp932 or euc-jp or utf8)をasciiとそうでない文字に
分けたいのですが、どうすればいいでしょうか?

$text = "abcひらがなdef漢字ghiハンカクjkl";

(asciiとそうでない文字に分ける処理)
(例えば順に@textに格納)

@textに、("abc", "ひらがな", "def", "漢字", "ghi", "ハンカク", "jkl")が入っている。
46デフォルトの名無しさん:2009/08/15(土) 17:55:49
>>45
decodeしてsplitして必要なら先頭要素を読み飛ばして再度encode
47デフォルトの名無しさん:2009/08/16(日) 11:12:17
下記サイトに従って、半角カタカナをmime_encodeしたのですが、元に戻すと全角カタカナに
なってしまいます。
どうすれば半角カタカナをうまく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";

48デフォルトの名無しさん:2009/08/16(日) 13:55:26
ISO-2022-JPをあきらめてUTF-8にするとか?
UTF-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');
49デフォルトの名無しさん:2009/08/16(日) 15:57:38
>>45
utf8でブロック使え。あるいはEUC-JPで\x20-\x7F拾え。
>>47
ISO-2022-JPに半角カナなんてないから。
それで半角カナにエンコードできる実装はカス(それが読めるメーラーも含めてな)。
50デフォルトの名無しさん:2009/08/16(日) 17:31:45
>>45
use 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 );
51デフォルトの名無しさん:2009/08/17(月) 00:29:28
しかし日本語関係のトラブル多いな
がちがちに防御した書き方しなくても、
perlが手抜きしてなければ動くのに
52デフォルトの名無しさん:2009/08/17(月) 01:55:47
てすと
53デフォルトの名無しさん:2009/08/17(月) 08:10:54
use utf8;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";

my $jp; ←DBから引っ張ってきたベタUTF-8(のはず)
utf8::decode($jp); # これがあってもなくても
"$jp 日本語\n"; # 文字化けする。
"$jp"; # 大丈夫
"日本語"; # これも大丈夫

XML::RSSでおかしくなります。助けてください。
54デフォルトの名無しさん:2009/08/17(月) 08:41:38
>>53
> "$jp 日本語\n"; # 文字化けする。
> "$jp"; # 大丈夫
> "日本語"; # これも大丈夫

日本語がEUCかSJISになってる
55デフォルトの名無しさん:2009/08/17(月) 08:44:50
>>46
>>49-50
ありがとうございます。
utf8にdecodeしてから処理すればいいんですね。
56デフォルトの名無しさん:2009/08/17(月) 09:05:20
>>53
$jpが本当にUTF-8かあやすぃ
jcode.plとか何でもいいけど
文字コードをちゃんと調べてみるべき
57デフォルトの名無しさん:2009/08/17(月) 09:58:26
>>47
無理やりするなら、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";
58デフォルトの名無しさん:2009/08/17(月) 09:59:51
>>54
vimでutf8モードで保存してます。
>>56
確認済みです。ちなみにprintだとutf8と混在で表示できてます。
printだとうまく行くんですが、XML::RSSだと通らないという
不思議な現象に悩まされてます。
そもそもXML::RSSが実体参照を吐いて生UTF-8を吐いてくれません。
59デフォルトの名無しさん:2009/08/17(月) 10:04:49
>>57
なんか不思議なことしてないか?
60デフォルトの名無しさん:2009/08/17(月) 15:56:11
>>57
何がしたいのかさっぱり分からん・・・・。
ISO-2022-JPは半角カナ含まないっつってるのに宣言してるし、
EncodeのMIME-Headerを根本的に勘違いしてる気がするし、
それじゃデコードしても文字化けするだけだと思われ。
61デフォルトの名無しさん:2009/08/17(月) 17:06:58
Perl/Tkの動作が良くわからなくて困っています。

その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
6261:2009/08/17(月) 17:51:11
調べまくってたら事故解決しました。ごめんなさい。

my $w = new MainWindow;
$w->update;
my $aho = $w->Toplevel;
$aho->focus;
$aho->update;
Win32::MsgBox('・ω・');
MainLoop;

newした後で逐一updateしないと画面には出ないみたいですね。
画面に出せば順番に重なるっと。すいませんでした。
63デフォルトの名無しさん:2009/08/17(月) 19:41:48
>>60
試しに、>>57でエンコードしたのをWindows Live MailやGmailで受信してもうまくデコートして
半角カナを表示した。

メール業界的には半角カナを認めてるってことか?
64デフォルトの名無しさん:2009/08/17(月) 20:54:34
認めるとか、認めないとか、そういう問題じゃない。
浮気相手の子供だから認知しない、と言われても
生まれてしまった子は育てないわけにはいかないだろ。
65デフォルトの名無しさん:2009/08/17(月) 21:09:16
ISO_2022_JPは進駐軍が勝手に決めた規格。
日本語を知らないヤツらが日本語の規格を決めたのだから使い勝手が悪いのは仕方ない。
そこでマイクロソフトはSI/SOコードで半角カナに切り替えられるよう拡張した。
このISO_2022_JP_MSは、マイクロソフトという一企業のローカルルールなわけだから
他のOS(UNIXとか・・・)が従う義務は当然無い。
しかし、デスクトップ アプリケーション分野でメシを食ってる企業にとって
Windowsという巨大市場を無視するわけにはいかない。
認めるとか認めないとか、そういう以前に
半角カナは、今そこにあるわけだから。
半角カナを捨てるということは、Windowsを捨てることと同じなんだよ。
66デフォルトの名無しさん:2009/08/17(月) 21:29:09
すごい。スミからスミまで全部デタラメ。
67デフォルトの名無しさん:2009/08/18(火) 02:37:03
倒置構文のifの後にカッコがくる場合には最初のカッコが閉じるまでが反映されるとかそういうルールってありませんでしたっけ?
print "ok\n" if (0) or (1); #=> ok
これが直感的な答えと違う動作をするような気がしてたのですが
68デフォルトの名無しさん:2009/08/18(火) 02:55:18
>>67
if 修飾子は制御構造。or は演算子。基本からやり直せ。
http://perldoc.jp/docs/perl/5.10.0/perlsyn.pod
http://perldoc.jp/docs/perl/5.10.0/perlop.pod
69デフォルトの名無しさん:2009/08/18(火) 03:02:54
UTF8つかえ
70デフォルトの名無しさん:2009/08/18(火) 03:22:40
>>68
違うんです
Perl のパーサの仕様でif文の後に(が来た場合に予期しない動きをすることがあると思い込んでたんです
で、実験をしてみたところ予想に反してうまく動いたので何か他のものと勘違いしてたのではないかという結論に至ったのです
そんでうまく絞り込めるような検索ワードが思いつかなかったのでここで聞いてみたのです
何か心当たりないですか?
71デフォルトの名無しさん:2009/08/18(火) 04:36:42
>if文の後に(が来た場合に予期しない動きをすることがある
あるわけないだろw

if (0); としてしまうと or が成り立たなくなるため 0 or 1 と解釈するしかない思います。
今手元にはないから確かめられないけど、Perlってのはそんなもんです。
つーかコンパイルフェーズで制御構造も演算子も全部畳み込まれるよ


検索はしても、パーサーの詳細なんてきっと出てきません。
あえて言うならドキュメントのどっかに書いてあるかもしれません
72デフォルトの名無しさん:2009/08/18(火) 04:42:38
0x5C文字に関することです
ファイルから読み込んだ文字列を出力するのですが、その際能やソ等の文字を能\、ソ\という風に置き換えたい、
そういう時はどういう風に記述すればいいですか?

$str =~ s/[〜]\\/\\\\/;
こういう記述で書けば良いと言う事はなんとなく分かるのですが[]の中身が分かりませんでした。

検索してみてもヒットする量が膨大すぎて思うような回答を見つけることが出来ませんでした。
73デフォルトの名無しさん:2009/08/18(火) 06:12:43
>>72
my @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;
74デフォルトの名無しさん:2009/08/18(火) 06:50:48
>>72
これ↓でどうだろう?

$str =~ s/([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])/
my $c = $1; $c =~ \/.\\\/ ? "$c\\" : $c/eg;
75デフォルトの名無しさん:2009/08/18(火) 07:00:04
>>72-74
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
何に出力するのにそんな付け足しが必要なのかは分からんが
76デフォルトの名無しさん:2009/08/18(火) 07:14:53
>>65
おま・・・・・。
半角カナは弊害が多すぎて日本人の権威たる村井先生達がわざわざISO-2022-JPから
削っていただいてくれたわけだが。

それでも使う馬鹿や使える馬鹿クライアントが多いから困ってるわけだが。

ちなみにWindows用のクライアントの一部はISO-2022-JPを騙ってjis-7bitなぞ認識しないぞ。
相手が読めない可能性があるメール送るのは阿呆のすること。
そんなに半角カナ使いたければ添付ファイルにでも放り込んでおけ。

Windowsはcp932使ってるからISO-2022-JPの議論とは全く別。

>>72
んなことする前にEncode覚えろ。
77デフォルトの名無しさん:2009/08/18(火) 07:17:03
あー今はUnicodeになってんのかな内部的には。
Unicodeには半角カナあるからな(文字コードが字幅を制限するってのが
いまいち理解に苦しむが)。
78デフォルトの名無しさん:2009/08/18(火) 08:49:31
>>65ほど全行がいちいちデタラメな文章も珍しいな・・・。
79デフォルトの名無しさん:2009/08/18(火) 09:41:36
なんだ村井ってのは?進駐軍の手先か?
研究室に小森っきりで実社会を知らないヤツのオナニーに付き合わされちゃタマランよ。
80デフォルトの名無しさん:2009/08/18(火) 10:28:20
Perlで、ディレクトリ名とファイル名のjoinはどうやるのでしょうか。
今は "$dirname/$filename" としているのですが、これはWindowsでも期待通りに動きますか。
ちなみに「perl join」でぐぐったら、配列のjoinばかりでてきました(当然か)。
よろしくお願いします。
81デフォルトの名無しさん:2009/08/18(火) 10:45:03
半角カナ以外にも「〜」なんかのunicodeへのマッピングが統一されてないとか
日本語の文字コードは滅茶苦茶で先人達はほんと何やってたんだよって感じ。
負の遺産押し付けないで欲しいわ〜。こんなのでもなんとか扱えるように
perlがんばったなとは思うけど。
82デフォルトの名無しさん:2009/08/18(火) 11:26:17
>>80
http://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
83デフォルトの名無しさん:2009/08/18(火) 11:42:53
>>79
http://ja.wikipedia.org/wiki/ISO-2022-JP
でも読んでろ。業界の常識だぞ。

>>81
〜は、そもそも全角チルダなのに字形が同じという阿呆な理由でMicrosoftが波ダッシュに割り当てたのが
問題の始まり。UN*X系やMacOSのIMEはきちんと対応してる。
まあこれは、縦書きの波ダッシュの字形を間違えて横書きに適応したUnicode策定側にも
責任があるが。つーわけで現状、波ダッシュと全角チルダが混在してる状況なのでいつか大変なことになると思われ。
WindowsはVistaから波ダッシュと全角チルダが見分けが付かなくなるようになったので、
水面下で問題は進行する。

つーかなんだかんだいってコガイダンはすげーよ。

0x5c問題(半角円記号問題)もMicrosoftがISO/IEC 646と純正ASCIIを混同したのが原因。
まあこれは歴史的に仕方ないと思うが。さすがにPerlも含むコンパイル等が動かないと困るので、
0x5cは円記号でもバックスラッシュでもあるという不思議な状況がこれからも続くと思われ。

スレチスマソ。
84デフォルトの名無しさん:2009/08/18(火) 11:57:22
>>82
thank you very much.

もうひとつ質問です。
["foo", ["bar", ["baz"]]]

["foo", "bar", "baz"]
に展開してくれるような関数はありませんか。
「perl flatten」でぐぐったけどそれらしいのは見つからず。
85デフォルトの名無しさん:2009/08/18(火) 12:10:32
>>84
再帰使いたかったからこんなん書いてみた。
#!/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;
}
86デフォルトの名無しさん:2009/08/18(火) 12:10:37
>>84
Perlの調べ物にGoogleなんかを使うから見つからんのだ
http://search.cpan.org/search?query=flatten
87デフォルトの名無しさん:2009/08/18(火) 12:16:12
88デフォルトの名無しさん:2009/08/18(火) 12:26:36
>>87
ソース見たら、これだけだねw
sub flat(@) {
return map { ref eq 'ARRAY' ? @$_ : $_ } @_;
}

これを再帰させて中まで展開すれば>>84の答になるか
sub flat(@) {
return map { ref eq 'ARRAY' ? flat(@$_) : $_ } @_;
}
89デフォルトの名無しさん:2009/08/18(火) 12:27:54
ていうか、それが>>85だな
90デフォルトの名無しさん:2009/08/18(火) 12:46:58
>>85-89
おおーさんくすです。
91デフォルトの名無しさん:2009/08/18(火) 13:01:19
>>85
my @foo; はどんな意味があるんですか?
92デフォルトの名無しさん:2009/08/18(火) 14:21:34
>>91
残骸です。見なかったことにしてください。
93デフォルトの名無しさん:2009/08/18(火) 14:35:44
>>92
了解
94デフォルトの名無しさん:2009/08/18(火) 14:47:06
>>88
>sub flat(@) {
>return map { ref eq 'ARRAY' ? flat(@$_) : $_ } @_;
>}

map にわたす { } では、配列とスカラのどちらを返すべきなんでしょうか。
flat(@$_) だと配列だし、$_ だとスカラですよね。
どっちでもいいということ?もしそうだとして、コンテキストはスカラと配列のどちらになるんでしょう?

Perl勉強中につき、ヘルプミー

95デフォルトの名無しさん:2009/08/18(火) 15:19:29
>>94
perldoc -f map に書いてあるよ。
mapはリストコンテキストで評価される。

つまりmapの { } が返すのは、スカラーでも、配列でも、ハッシュでもなんでもok
最終的にぜんぶフラットに連結されて1つのリストになる。
96デフォルトの名無しさん:2009/08/18(火) 15:24:23
>>95
つまり map の { } のなかで $_ (スカラー)を返しても、それはリストコンテキストで評価されるから、
結局は ($_, ) とみなされる、ということですね。なるほど。
ありがとうございました。

97デフォルトの名無しさん:2009/08/18(火) 15:28:36
> 〜は、そもそも全角チルダ
> 0x5c問題(半角円記号問題)もMicrosoftがISO/IEC 646と純正ASCIIを混同したのが原因

嘘は良くない
98デフォルトの名無しさん:2009/08/18(火) 16:46:51
すいません、質問します。

my $tmp_os_info = $^O;

この記述の $^O; とはいったい何を表しているんでしょうか?
ビット演算で ^ を使うというのまでは分かったんですが、そのような動きを
していそうにも見えません。
99デフォルトの名無しさん:2009/08/18(火) 16:49:47
<img src="xx">のxxを抽出するにはどうしたらいいですか?
100デフォルトの名無しさん:2009/08/18(火) 17:02:25
1.正規表現を使う
2.正規表現を使わずに文字列を検索する
101デフォルトの名無しさん:2009/08/18(火) 17:09:45
>>98 「perl 特殊変数」でググレ
102デフォルトの名無しさん:2009/08/18(火) 17:29:02
>>101
ありがとうございます!
103デフォルトの名無しさん:2009/08/18(火) 18:07:00
map { } @list
のように、クロージャ(?) をとる関数はどうやって定義すればいいですか。
104デフォルトの名無しさん:2009/08/18(火) 18:30:09
>>79
その実社会を知らないオナニー野郎呼ばわりの村井純がいなければ、
今の日本のインターネットは無いも同然なわけだが…。

ってか、色々な官庁や巨大な電話業界と戦って、通信回線にデータを
流すことを認めさせ、さまざまな組織を回線で繋いでネットワークを
作っていったわけで、道の無いところに道を開いてきたというか、
めちゃくちゃ実践派だぞ?

まあ、アプリケーション層の人間から見れば、また違った感想なのかも
しれないけど。
105デフォルトの名無しさん:2009/08/18(火) 18:34:59
>>103
プロトタイプで&

List::UtilモジュールのList/Util/PP.pmとか参考にするといいんじゃないかな。
106デフォルトの名無しさん:2009/08/18(火) 21:59:56
すいません。PerlでRubyのpにあたるものは何ですか?
配列の配列をデバッグ出力したいんですけど。
107デフォルトの名無しさん:2009/08/18(火) 22:54:04
Data::Dumper
108デフォルトの名無しさん:2009/08/18(火) 23:05:26
>>107
ありがとうございます。
109デフォルトの名無しさん:2009/08/19(水) 01:47:22
>>99
正規表現を使うか
indexとsubstrで抽出するかって感じ

普通に正規表現が簡単
110デフォルトの名無しさん:2009/08/19(水) 01:51:30
>>108
Data::Dumper より YAML のが便利
タイプが少ないしなによりログ取りたいときに出力が簡単
111デフォルトの名無しさん:2009/08/19(水) 09:24:47
>>99
Web::Scraper。

>>104
最近の若いのは村井純(とその大いなる功績)も知らないのな。
ISO-2022-JPから半角カナを省いたのはどう考えても正解だろ。
半角カナなんて弊害ばかりで互換性とAA以外に何か存在意義があるわけ?
112デフォルトの名無しさん:2009/08/19(水) 10:18:56
LWP::UserAgentを使ってHTTPリクエストを送信すると
TE: deflate,gzip;
が勝手に付加されてしまい、レスポンスがgzip圧縮で返ってきてしまいます
gzipの変換で不要なトラブルに遭いたくないのでTE: deflate,gzip;を付加しないようにしたいのですが、どうすればよいでしょうか
113デフォルトの名無しさん:2009/08/19(水) 10:53:41
>>111
結局規格なんか決めても世の中が従わなかったら失敗なんだよな。
混乱がよけいひどくなっただけ、という見方もできる。そしてこれだけの
AAが生み出された今となってはAAを保存できないISO-2022-JPは
イマイチだな。過去の遺物でいんじゃね?
114デフォルトの名無しさん:2009/08/19(水) 10:56:30
>>111
そいつがAA級戦犯か!
115デフォルトの名無しさん:2009/08/19(水) 11:21:30
>>112
use LWP::UserAgent;
push(@LWP::Protocol::http::EXTRA_SOCK_OPTS, SendTE => 0); #最初に実行しとく

ネットで見つけて使ってるけど、これでほんとにいいのか俺もよくわかってないw
116デフォルトの名無しさん:2009/08/19(水) 11:30:50
>>105
サンクスです。プロトタイプなんてPerlにあるんですね。

117デフォルトの名無しさん:2009/08/19(水) 14:15:16
>>113
世の中は一部を除いて従いませんでしたよ。GmailでAA送ってみ。
つーかISO-2022-JPで半角カナ使う人間がどれだけ馬鹿にされてきたか知らないんだな。

顔文字程度ならともかくいわゆるAAは特定のフォントセット・ポイント数で見られることを前提としてるから、
いまやPC同士メールくらいにしか用途がなく、等幅フォントや任意のポイントで見られる場面が
比較的多いISO-2022-JPとは無関係の世界だろ。

>>114
だれうま。
118112:2009/08/19(水) 16:00:59
>>115
無事TE:を消すことができました!
ありがとうございました
119デフォルトの名無しさん:2009/08/19(水) 16:40:05
perl+htmlで掲示板を作っています。他は正常動作するのですが、auの機種のみ

■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エンコード/デコードのせいかと思ったのですが、受け取り時点でこんな化け方をされるとどうすれば良いのやら……
何か解決法は無いでしょうか。
120デフォルトの名無しさん:2009/08/19(水) 17:17:35
携帯のメールって半角カナを送信できないのかな?
携帯を持ってないから確認できないや。
121デフォルトの名無しさん:2009/08/19(水) 17:45:07
122デフォルトの名無しさん:2009/08/19(水) 17:54:51
>>120
携帯はキャリア内ならそのまま出せるんじゃないかな?
RFCに準拠しないメールアドレスとかもOKなぐらいだし。

PCのメーラーは、全角カナに変換してから送信とかが
多いような気がするけど。

>>111
ついでにAAも頼む。
123デフォルトの名無しさん:2009/08/19(水) 18:11:59
>>121
おうふ
申し訳ない、いってきます
124デフォルトの名無しさん:2009/08/19(水) 19:35:06
組み込み関数と同じ名前の関数を定義してしまったとき、もとの組み込み関数を別名などで呼び出すことは可能ですか。
たとえば map() という名前の関数を組み込み関数とは別の用途で使いたくて、sub map ... と上書き定義したのですが、
その場合にもとの組み込み関数をどうやって呼び出すかがわかりません。

ちなみにPythonだと組み込み関数を上書きしても、もとのを __builtins__.map() のような感じで呼び出せるので、
同じことがPerlでもできるのではないかと思い、質問しました。
125デフォルトの名無しさん:2009/08/19(水) 19:49:53
>>124
http://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.
126デフォルトの名無しさん:2009/08/19(水) 21:08:33
>>124
read()
という関数を呼び出すとき、
&read()にすると自作関数
read()にすると組み込み関数が呼び出される
127デフォルトの名無しさん:2009/08/19(水) 21:53:38
>>124
CORE::hoge でもいけるよ
128デフォルトの名無しさん:2009/08/19(水) 23:41:28
>>124
&mapとmap()は別に認識されるのでは?
129デフォルトの名無しさん:2009/08/20(木) 04:40:38
&での呼び出しはプロトタイプ無視と引数自動設定の二大うんk仕様があるんじゃなかったっけ?
あと、宣言位置がおかしくてもむりくり呼び出される仕様。

間違ってたらすまん。
130デフォルトの名無しさん:2009/08/20(木) 08:37:17
>>129
再現させてみてないけど、ちょっと前C書いてた手癖で
sub xxx(){ ... } って書いちゃったけど普通に引数受け取ってたってことがあったな。
これって仕様か?
131デフォルトの名無しさん:2009/08/20(木) 11:36:26
>>125-129
ありがとうございました。CORE::map() で呼び出せました。
132デフォルトの名無しさん: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

よろしくお願いします。
133デフォルトの名無しさん:2009/08/20(木) 12:14:38
>>132
perlsub(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と「,」を省略できるのは最初の引数の
ときだけ。
134デフォルトの名無しさん:2009/08/20(木) 13:30:36
>>133
了解しました。ありがとうございます。
135デフォルトの名無しさん:2009/08/20(木) 13:55:12
Perlのglob()は '**/*.pm' のような、zshライクな書き方はサポートしてないのでしょうか。
もしそうなら、'**/*.pm' のような書き方をサポートした関数やライブラリがあればおしえてください。
136デフォルトの名無しさん:2009/08/20(木) 14:02:44
137デフォルトの名無しさん:2009/08/20(木) 15:24:28
>>136
ありがとうございます。
138デフォルトの名無しさん:2009/08/20(木) 21:25:52
>>130

sub hoge($$){ ($hoge, @huga) = @_; …

でパッケージ内でしか呼び出さんかったら普通に動いて
パッケージ外で呼び出すと@hugaには第三引数しか入らんというわけわからん仕様につい最近悩まされた記憶がある
139デフォルトの名無しさん: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についての記述が少なすぎて、
どう使ってよいのか(書式やクラスの指定など)
分からず悩んでいます。
140129:2009/08/21(金) 12:18:18
>>130
俺も試してないけど、呼び出すときに &sub としたなら、しっかりプロトタイプが無視されてる
141デフォルトの名無しさん:2009/08/21(金) 13:33:29
ソースコードを見ながらブレイクやステップでデバッグをするのって無料だとEclipseしかないですかね?
142デフォルトの名無しさん:2009/08/21(金) 18:24:05
$aaa->{verkanri} = [qw/zip-open folder-check start-up close-out/];
foreach (@{$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って変数にハイフンを使うことが出来ないはず。
なにか特殊な規則でもあるのでしょうか?
143デフォルトの名無しさん:2009/08/21(金) 18:28:32
連投、申し訳ないです。

$aaa->{bbb} = [];
$aaa->{"bbb"} = [];

上記2つの違いは何なのでしょうか?
144デフォルトの名無しさん:2009/08/21(金) 18:39:15
>>143
"を省略しただけ
145デフォルトの名無しさん:2009/08/21(金) 19:24:14
>>142
変数名にはハイフンを使えないが、ハッシュのキーにはそのような制限は無い。
146デフォルトの名無しさん:2009/08/21(金) 19:53:25
>>144さん、>>145さん
ありがとうございました!
147139:2009/08/21(金) 23:56:56
質問しといて、事故解決したのでとりあえず報告
$mem = XML::Xerces::MemBufInputSource->new("$xml",length($xml));
を追加して
$memをパーサに食べさせれば無事パースできました。
148デフォルトの名無しさん:2009/08/22(土) 01:24:47
@source_s, @source_t が同要素長の配列のとき、
同一の添え字となる要素両方を用いた適当な条件をテストし、
パスしたものだけを、それぞれ、@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の苦手な添え字式アクセス、表面上のコード行数、中間変数
これらをバランスさせるような書き方はないでしょうか。
149デフォルトの名無しさん:2009/08/22(土) 01:26:38
@passed_s = (3, 4, 5, 6); @passed_t = (6, 5, 4, 3); # この例での結果
でした。
150デフォルトの名無しさん:2009/08/22(土) 01:37:17
my @souce_st = map { [$source_s[$_], $source_t[$_]] } 0..$#source_s;
形式でデータを持っておいて、

my @passed_st = grep $_->[0] * $_->[1] > 15, @source_st;

てするのがいいんだろうな、きっと。
151デフォルトの名無しさん:2009/08/22(土) 06:26:07
数珠つなぎにすればスマートになるというものでもなかろうに

my @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[$_];
}
152デフォルトの名無しさん:2009/08/22(土) 13:32:03
>>151
配列スライスでできそうに思っていたけど、思いつかなかったんだ。
ありがとう。

頭が錆びてきているのかな。。。
153デフォルトの名無しさん:2009/08/23(日) 19:12:47
てす
154デフォルトの名無しさん:2009/08/26(水) 11:30:57
これって、シンボリックリファレンスみたいな感じですけど、use strictで通るってことは違うんですかね?

use strict;

my $func_name = 'plus';
print Foo->$func_name(1, 2); #=> 3

package Foo;
sub plus { shift; $_[0] + $_[1] }
155デフォルトの名無しさん:2009/08/26(水) 12:24:55
Perlにはサブルーチンの数に制限がありますか?

というのも、requireでいくつかのサブスクリプトに分散してサブルーチンを作っているんですが、
サブルーチンへの分岐がスルーされるという現象に見舞われています。
ところが、requireの記述の順序を変えるとこれがスルーされなくなる代わりに、それまで処理され
ていた別のサブルーチンが処理されなくなるという具合です。

さらに、処理が行われないサブルーチンを含むスクリプト定義をコメントアウトし、メインルーチンでは
処理が行われないサブルーチンへの分岐をそのままにした状態で実行してもエラーにならないのです。

個々のサブルーチンについては、特にエラーは出ないのですが…
156デフォルトの名無しさん:2009/08/26(水) 12:48:03

補足です。requireはメインルーチン文頭に条件分岐なしで記述してあります。
157デフォルトの名無しさん:2009/08/26(水) 13:05:39
>>155
>Perlにはサブルーチンの数に制限がありますか?

Perlよくしらないけど、ないんじゃないかなあ。
問題は別のことが原因だとおもう。たとえばサブスクリプトで同じ名前の関数を
定義しているために、読み込む順番によって上書きされたりしなかったりとか。
158デフォルトの名無しさん:2009/08/26(水) 13:16:20
159デフォルトの名無しさん:2009/08/26(水) 13:34:53
手さぐりしてないで、有効なサブルーチンをリストしてみれ。
160デフォルトの名無しさん:2009/08/26(水) 13:51:20
>>158
アロー演算子の後のスカラー変数は動的なメソッド呼び出しをするという機能なんだ。
賢くなった。
d
161デフォルトの名無しさん:2009/08/26(水) 15:53:12
>>157
まさにその通りでした…(恥)orz
162デフォルトの名無しさん:2009/08/26(水) 15:54:32
申し遅れました、>>157さん・>>159さん、ありがとうございましたm(_ _)m
163デフォルトの名無しさん:2009/08/27(木) 12:05:48
なぜハッシュリファレンスへのアクセスで、従来と似たような$href{one}としないで、
$href<one>と山括弧にしたのですか?

404 Blog Not Found:perl - $@%&*のよしあし
http://blog.livedoor.jp/dankogai/archives/50772506.html
164デフォルトの名無しさん:2009/08/28(金) 23:50:15
Test::Simpleのインストールで下記のエラーが発生するのですが、解決方法ないでしょうか?
過去の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/
165デフォルトの名無しさん:2009/08/29(土) 00:23:40
use utf8;
use Encode;
open(FH,'c:\hoge.txt');
binmode(FH,':utf8');
my $x = <FH>;
$x =~ s/ア//g;
print encode('utf8',$x);
close(FH);

hoge.txt(utf8で記述されている)から一行抜き出して、その文から「ア」を削除したいんですけど、
こんな感じのソースを書いてみたら案の定期待した通りには動きませんでした。
どうすれば期待通りの挙動になってくれるんでしょうか、誰か教えてください
166デフォルトの名無しさん:2009/08/29(土) 00:51:28
>>4 を読め
167デフォルトの名無しさん:2009/08/29(土) 08:57:56
>>164
1. t/以下を読んで原因を探って解決。
2. バギーでも少々動けばいいやと思うなら cpan -if Test::Simple。
168デフォルトの名無しさん:2009/08/29(土) 13:02:19
>>166
>>4は読んでますけど関係無いですよね?
Dos窓はきちんとutf8で動かしてるし、単純にutf8なソースの中で正規表現を使う方法だけ知りたいんです。
169デフォルトの名無しさん:2009/08/29(土) 13:45:53
読みかたが足らん。100回読め。>>4を100回読め!
自分のコードと、どこがどう違うか
1行1行しっかり吟味しろ
170デフォルトの名無しさん: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進数って言うのかな?
171デフォルトの名無しさん:2009/08/29(土) 17:53:09
ちょっと違うけど。
my @ary = ('a'..'z', '0'..'9', '_');
my $len = scalar @ary;
for my $i (0..100) {
    print $ary[$i % $len];
}
172デフォルトの名無しさん:2009/08/29(土) 17:57:40
>>171
配列に37文字組み込んでってことですね
大変参考になりました
即レス頂きありがとうございました!
173デフォルトの名無しさん:2009/08/29(土) 20:27:12
どうでもいいけど、プロは a = a++ なんてコードは書かない
174デフォルトの名無しさん:2009/08/30(日) 01:08:32
>>170
まだ初心者だけど、>>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;
}
175デフォルトの名無しさん:2009/08/30(日) 01:09:31
続き

sub 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] );
}
176デフォルトの名無しさん:2009/08/30(日) 01:10:45
続き

sub 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
177名無しさん@そうだ選挙に行こう:2009/08/30(日) 04:22:41
どうでもいいけど、プロは$aと$bにmyは付けないw
178名無しさん@そうだ選挙に行こう:2009/08/30(日) 05:30:03
お前の発言の方がどーでもいいわw
ざっと探してみたけどperlじゃ36進数のサンプルないぞ
さすがにCとVBはあったけど
で、37進数やろ
お前が37進数やってみればいいやろプロさんwww
179名無しさん@そうだ選挙に行こう:2009/08/30(日) 06:42:37
$aが特殊変数である事実が、どうでも良い取り扱いな訳ないだろ。
180名無しさん@そうだ選挙に行こう:2009/08/30(日) 12:09:26
$a <=> $b と書いて、しまったソートが逆だった、という時に、
最小の労力で逆転させるにはどうすれば
181名無しさん@そうだ選挙に行こう:2009/08/30(日) 12:37:25
下記サイトにある、

\*import = cgi_fixup();

って何をしているのです?
そもそも、\*import ってのが何を表しているのかがさっぱりわからん。

http://blog.livedoor.jp/dankogai/archives/50805754.html
182 ◆TWARamEjuA :2009/08/30(日) 13:59:59 BE:3812257-BRZ(10101)
>>180
reverse
183名無しさん@そうだ選挙に行こう:2009/08/30(日) 14:15:03
reverseってコンパイラ的には読む方向を変えてるだけなんだろうか
184名無しさん@そうだ選挙に行こう:2009/08/30(日) 17:44:31
別スレにある下のプログラムが動かないんだけどこれだけだとだめなの?ちなみに環境はアクティブパールの最新版

use 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 ) );
}
185名無しさん@そうだ選挙に行こう:2009/08/30(日) 17:53:17
>>184
なんかこんなの出てきたぞ。意味わからんけど動いてるんじゃね

0秒:SEED=0000 場所(19,21,59)
1秒:SEED=41C6 場所(9,1B,40)

中略

65535秒:SEED=0CA6 場所(18,79,36)
186名無しさん@そうだ選挙に行こう:2009/08/30(日) 19:22:46
Unrecognized character \x81ってエラーが出ていたら笑ってやる
187デフォルトの名無しさん:2009/08/30(日) 23:11:59
>>186
ごめん、その通りなんだ
初めていじるので全く意味がわからない・・・
188デフォルトの名無しさん:2009/08/30(日) 23:30:43
出たことあるなあ
漢字についての取り扱いでよそからコピペした時だったので、
しばらく悩んだ
189187:2009/08/31(月) 00:00:57
自己解決しました
190デフォルトの名無しさん:2009/08/31(月) 22:24:36
perl初めたばかりだけど
基礎らしい二分検索のプログラム書こうとチャレンジしてるんだが方法が思いつかない。

ソート済の対象ファイルを配列に取り込んで、配列個数調べて
個数nの半分の値の所で比較して比較して……って感じで流れは分かるんだけど

一応検索で該当箇所見つけ出してそこに1行突っ込む、って部分は出来たんだけど……
191デフォルトの名無しさん:2009/08/31(月) 22:26:48
二分検索のアルゴリズムが理解できてないのか?
perlの文法がわからなくてプログラムコード化できないのか?
192デフォルトの名無しさん:2009/08/31(月) 22:35:57
(3,4,5)みたいな行列が与えられたときに

0,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回まわせばそりゃ楽なんだが、再帰でやってみようとしてもどうも
うまくいかない・・・。どんな風に書けばいいかな?
193デフォルトの名無しさん:2009/08/31(月) 22:44:24
>>191 二分探索は
 ソートされているデータを、まず要素の真ん中で検索し、比較対象が上か下か調べる
 それを更に上と下で区切ったほうのさらに真ん中で同様の処理 
 繰り返し最後の値が見つけ出すまでやる・・・・で良かったかな

 配列取り込んで、配列の数出して、
 それを1/2してまではなんとかなるけど、
 そこから先、どのように書いたらいいかが見当付かないんです・・・・
194デフォルトの名無しさん:2009/08/31(月) 23:47:12
>>192
これでどうだ

sub foo {
my ($n, @rest) = @_;
return map {
my $i = $_;
@rest ? map { "$i, $_" } foo(@rest) : "$i\n"
} (0 .. $n-1);
}

print foo(3, 4, 5);
195デフォルトの名無しさん:2009/09/01(火) 01:10:58
>>193
そこまで分かってるなら、あとはコーディングするだけじゃん。
perlの文法がわからないの?
だったら入門書や解説サイトを読めばいいやん。
196デフォルトの名無しさん:2009/09/01(火) 01:47:37
>>195
if関数で ひたすら大か小かで判定するかしか思い浮かばなくて……

 whichでその大か小かの判定だけさせた無限ループにして
 一致した時点でlastで抜ける みたいな感じでいいのでしょうか……
197デフォルトの名無しさん:2009/09/01(火) 01:52:53
思い浮かんだなら形にしてみ
198デフォルトの名無しさん:2009/09/01(火) 01:59:35
>>196
バイナリ検索は、配列を切ったりはったりせずに、インデクスの上下でせめていくといいよ
とりあえず再帰を使った例を出しとく。でも普通は効率化のため再帰じゃなくループにする

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"; }
}
199デフォルトの名無しさん:2009/09/01(火) 23:24:28
下記サイトに記載されている関数は何をする関数でしょうか?

Perl 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
200デフォルトの名無しさん:2009/09/02(水) 09:52:55
>>199
hash_seedはハッシュDBの構造が理解できれば何のことかすぐわかるはず。
201デフォルトの名無しさん:2009/09/02(水) 22:07:37
ハッシュの配列について質問があります

例えば、
my %hogehoge;

foreach(0..10){
push(@{$hogehoge{pos}},[$_,$_+1]);
}

されたものがある場合、どうやって$hogehoge{pos}を表示すればいいのでしょうか?
202デフォルトの名無しさん:2009/09/02(水) 22:37:25
こうするか
foreach (@{$hogehoge{pos}}){
print $_;
}
あるいは
$hogehoge{pos}->[0]; # 連番で
203デフォルトの名無しさん:2009/09/02(水) 23:29:50
>>202
それだと、こうなってしまうのですが・・・
ARRAY(0x1004f668)ARRAY(0x1004f830)ARRAY(0x1004f890)ARRAY(0x1004f8f0)ARRAY(0x1004
f950)ARRAY(0x1004f9b0)ARRAY(0x1004fa10)ARRAY(0x1004fa70)ARRAY(0x1004fad0)ARRAY(0
x1004fb30)ARRAY(0x1004fb90)
204デフォルトの名無しさん:2009/09/03(木) 01:45:42
>>203
そりゃ、そのまま吐いたらそうなるなぁ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]でやるかなぁ
205デフォルトの名無しさん:2009/09/04(金) 09:53:49
>>202
print "@$_" for @{$hogehoge{pos}};
206デフォルトの名無しさん:2009/09/04(金) 10:00:28
my %hogehoge = map [ $_, $_+1 ], 0..10;
}
207デフォルトの名無しさん:2009/09/04(金) 10:14:27
>>201
デバッグで値を見たいとかではなくて?

my %hogehoge;

foreach(0..10){
push(@{$hogehoge{pos}},[$_,$_+1]);
}

use Data::Dumper;
use Dumpvalue;

print Dumper($hogehoge{pos});
Dumpvalue->new->dumpValue($hogehoge{pos});
208デフォルトの名無しさん:2009/09/04(金) 16:00:18
Param::Validateモジュールの使い方を日本語で解り易く解説しているWebサイトを教えてください。
CPANに上がってる英文マニュアル見たがさっぱり、自動翻訳してもっとわけわかめになった。
209デフォルトの名無しさん:2009/09/04(金) 21:06:08
           YES → 【ヒットした?】 ─ YES → なら聞くなよ。氏ね。
         /                \  
【検索した?】                     NO → なら、ねぇよ。氏ね。
         \                   
            NO → 氏ね。
210デフォルトの名無しさん:2009/09/05(土) 20:42:45
Perl素人のオレに教えてくれ。いや、ください

初心者サイトとかを回りながら、ファイルを読み込んで表示するだけのcgiを作ろうとしたんだけど
ファイルを二個読み込もうとするとインターナルサーバエラーとか言われる
IO::FILE使わなければ問題なく動くんだけどなぜなの? IO::FILEは二回呼び出せないの?
211デフォルトの名無しさん: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;
}
212デフォルトの名無しさん:2009/09/06(日) 01:09:29
> my $io = IO::File->new($$logfile, 'r');
$$って
213デフォルトの名無しさん:2009/09/06(日) 02:37:24
>>212
できた! ありがとん

でもなぜ$$logfileじゃだめなんだぜ?
my $logfile = shift; にファイル名へのリファレンス格納→$$logfileでデリファレンスっていう流れだと思ったのに……
何か根本的に間違ってんのかな
214デフォルトの名無しさん:2009/09/06(日) 06:36:13
Perlでは文字列と数値は同じような扱いをしますが、Dumpすると内部的には
区別されてますよね?

数値なのか文字列なのかをプログラム内で判断する方法ってあるんですかね?
困っているわけではなく、単なる興味本位なのですが。

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
215デフォルトの名無しさん:2009/09/06(日) 07:10:02
>>214
気にしたこと無かったけどぐぐったら見つけた

http://oshiete1.goo.ne.jp/qa1737534.html
こんなやり方あるんだねー
216デフォルトの名無しさん:2009/09/06(日) 07:50:08
>>214
Devel::Peekができてるんだから出来るんだろうよ。
ソース読んでみ。
ちなみにこの挙動については友人と議論したことがあるが、
数値か文字列か区別できたところで使いどころがない。
そもそも仕様外だから危なっかしくて使えねー。

ちなみに数値にしたけりゃ +0すりゃいいし、文字列にしたけりゃ .''すりゃいい。
217デフォルトの名無しさん:2009/09/06(日) 08:09:31
>>213
> でもなぜ$$logfileじゃだめなんだぜ?

デリファレンス
218デフォルトの名無しさん:2009/09/06(日) 08:16:46
>>215
ちょっと違うような。。。

>>216
Devel::PeekはXSで書かれているんで自分にはよくわからんです。
219デフォルトの名無しさん:2009/09/06(日) 08:18:20
>>214
おすすめはblessしたクラス内で扱うこと。
トリッキーな使い方は可読性、可搬性を下げるのみ。
自己満足はできるかもしれないが。
220デフォルトの名無しさん:2009/09/06(日) 10:48:10
文字と数値を区別しないで済む。あれこれ悩む必要が無くなる。
それがperlの特徴なのに。(スクリプト系言語はたいていそうなてる)
これじゃまるで、パンツの見えないミニスカートを買ったのに
パンツの見せ方を教えてください、って言ってるようなもん。
221デフォルトの名無しさん:2009/09/06(日) 12:51:42
文字列中にある単語をマッチさせて複数取り出すにはどうすれば綺麗に書けますか?

今やりたいことは、あるウェブページ中にある画像のURLだけを取ってきたいと思っています。
 $contents = get($url); # LWP::Simple
 $contents =~ /(http:\/\/[^"]+[.]jpg)/; # jpgだけゲット
 $image = $1;
↑こうやりますと最初にマッチしたものは取り出せるのですが、
 2番目以降もまとめて上手く配列などに取り出せないでしょうか。
222デフォルトの名無しさん:2009/09/06(日) 12:59:34
gつけて@に入れる
223デフォルトの名無しさん:2009/09/06(日) 13:20:57
>>222
ありがとうございます。
置換のときは使っていたのですが、こんな風にも使えるのですね
224デフォルトの名無しさん:2009/09/06(日) 15:00:28
while ( $contents =~ m/(http:\/\/[^"]+[.]jpg)/g ) {
print "$1はうんこ\n";
}
225デフォルトの名無しさん:2009/09/06(日) 16:45:39
>>218
簡単な方法は、$foo ^ $foo の結果を見ること。
0だったら$fooは数値、空文字列だったら$fooは文字列。
数値をお互いにXORするとゼロになるし、
文字列をお互いにXORするとナルストリングになる。

>>221
本当に画像だけ取って来たいなら素直にWWW::Scraper使え。
それだと本文中のURLも拾うぞ。それでもいいなら構わんが。
226デフォルトの名無しさん:2009/09/06(日) 17:13:52
>素直に○○使え

最近、こういう言い回しが増えたよね。
べつにひねくれて星を睨んで「○○」を使わないワケじゃないと思うよ。
ただ「○○」という便利なものが存在するとは知らなかっただけだと思うよ。
なんかさ、「素直に○○使え」って言い回しするヤツって
女子校生が「ちょ〜〜〜やばいしぃ〜〜」とか言ってるのと同じ臭いがする。
オツムが弱そう。バカっぽいな。
227デフォルトの名無しさん:2009/09/06(日) 18:30:40
>>226
素直に○○する、ってのは、(深く考えず)○○した方が物事がすんなりと運ぶ、という意味なんだが。
辞書があるなら引くといい。
228デフォルトの名無しさん:2009/09/06(日) 18:35:23
(深く考えずに)すんなりと○○した方がよい、か。
229デフォルトの名無しさん:2009/09/06(日) 18:47:04
>>226
素直にやばいしぃ〜〜
230デフォルトの名無しさん:2009/09/06(日) 19:11:04
>>225
ほー、WWW::Scraperで画像をスクレーピングできるとは知らなかった。
Web::Scraperは知ってたけど。
231デフォルトの名無しさん:2009/09/06(日) 19:20:01
>>227
韓国の辞書も北朝鮮の辞書も持ってません
232デフォルトの名無しさん:2009/09/06(日) 21:30:07
>>320
画像->画像表示を示すURI、WWW::Scraper -> Web::Scraperの間違いだな。
訂正サンクス。

>>231
「単品で迷うなら素直にランチにしなよ」とか普通に使う用途なんだが、
こんな簡単な日本語取り違えるとはゆとりのなせる業か。
>オツムが弱そう。バカっぽいな。
233デフォルトの名無しさん:2009/09/06(日) 21:40:07
>>225
空文字列じゃなく "\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
234デフォルトの名無しさん:2009/09/06(日) 21:47:31
>>233
そのようだな。補足サンクス。Cと混同していたようだ。
235デフォルトの名無しさん:2009/09/06(日) 21:53:24
>>232
で?
その”普通に使う用途”が載ってるのは、韓国の辞書?北朝鮮の辞書?
236デフォルトの名無しさん:2009/09/06(日) 22:01:59
>>235
引くに引けないのはわかるけど、負け戦で頑張っても意味無いよ。
黙って日本語を勉強しなおすといい。
237デフォルトの名無しさん:2009/09/06(日) 22:03:40
>>235
日本の辞書の例:
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義と考えるのが普通。
238デフォルトの名無しさん:2009/09/06(日) 22:04:56
つーか大陸のレッテル貼れば何とかなるとか思ってある辺りがもうね。
239デフォルトの名無しさん:2009/09/06(日) 22:07:36
変なタイミングで中韓出してくる子は、大抵日本のお荷物。
240デフォルトの名無しさん:2009/09/06(日) 22:49:12
>>237
やっぱりチョンの会社の辞書を出したか。今は日本に帰化してるが。
241デフォルトの名無しさん:2009/09/06(日) 22:55:57
>>211をコピペして実行してみたけど、正常に実行できる。
問題点は他にあったんじゃ?
242デフォルトの名無しさん:2009/09/06(日) 23:32:31
>>241
レスありがと
211だけど、仰るとおりperlのプロセスがループしてた
正常な状態だったら問題なく動いたわ
かなり時間を費やしてしまった……

基本的に引数は参照渡しでいいんだよね?
243デフォルトの名無しさん:2009/09/06(日) 23:34:02
>基本的に引数は参照渡しでいいんだよね?
どこでそんなの習ったんだ?
244デフォルトの名無しさん:2009/09/06(日) 23:36:47
>どこでそんなの習ったんだ?

どこかのサイトに書いてあった記憶がある
片っ端から初心者向けサイト回ってたからどことは言えないけど
オレが勘違いしてるのかな
245デフォルトの名無しさん:2009/09/06(日) 23:59:09
たぶん、値のコピーを作らないように参照渡しにする、って書いてあったんだろうけど
Perlの関数呼び出しは値渡しじゃなくて変数渡しだから、わざわざリファレンスにする必要はないよ。
@_には引数がコピーされて入っているのではなく、引数そのものの別名になっている。
246デフォルトの名無しさん:2009/09/07(月) 00:02:33
配列やハッシュを渡すときは必要だけど。
247デフォルトの名無しさん:2009/09/07(月) 00:17:22
レスありがとん

変数を渡すときはそのままでも値がコピーされなくて
配列とかハッシュはコピーされちゃうからメモリが勿体無いと

勉強になったわ
248デフォルトの名無しさん:2009/09/07(月) 03:17:01
>>247
サブルーチンの引数として配列やハッシュを複数渡すと、単一のフラットなリストとして @_ に展開されますが、エイリアスとしての動作は変わらないため値のコピーは発生しません。
>246 が言う必要性とは、「単一のフラットなリスト」にされては困る場合、すなわち引数を渡された関数内で個々の配列を峻別して処理しなければいけない場合に、参照渡しが必須になるという意味です。
ちなみにハッシュのキーに限り、キーそれ自体は変数ではないため、エイリアスの内容を変更しても元のハッシュのキーは変化しません。
249デフォルトの名無しさん:2009/09/07(月) 04:52:06
>>233
>空文字列じゃなく "¥x00" x 文字列長 になるんじゃないかな

じゃあ、結局データが文字列か数値かを知りたいときはどうするのがいいんでしょうか。
今まさに1と"1"を別に扱いたい場面に直面しています。
250デフォルトの名無しさん:2009/09/07(月) 05:25:56
>>249
データ構造を作り直して回避する。
251233:2009/09/07(月) 05:56:07
>>249
いや俺に訊かれても。その二つを区別しなきゃいけない状況に陥った事なんて無いし。

sub is_num { ($_[0] ^ $_[0]) !~ /^\x00/ }
print is_num($_) ? 'num' : 'str', "\n" for 0, '0', '+1e3', +1e3;

…とでもしときゃいいんじゃない。すっごくアホ臭いけど。
252デフォルトの名無しさん:2009/09/07(月) 06:35:52
はじめてCPANパッケージを作ろうとしている最中です。
質問があります。

(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   # 機能強化版
 のように用途別・目的別に別々のパッケージを用意しようとしているんですが
 こういうのはまずいでしょうか。何か問題があれば教えてください。
253デフォルトの名無しさん:2009/09/07(月) 07:32:29
>>249
だから$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より。
254デフォルトの名無しさん:2009/09/07(月) 07:38:21
つーかここまで言って数値と文字列の見分け方が分からないってことは
ズブの素人だろうから、「基本的にPerlにそんなことはできない」と言い切った方が良かったかな。

1と'1'を区別したい理由かコードか何か晒してみ?多分瑕疵があるから。
255デフォルトの名無しさん:2009/09/07(月) 07:41:49
>>240
小学館ってチョンの会社だったの?
256デフォルトの名無しさん:2009/09/07(月) 07:47:09
俺も長年Perl使ってるが、'1'と1を明確に区別する必要性に駆られた記憶がないな。
参考に、どういうケースなのか教えて欲しい。
257デフォルトの名無しさん:2009/09/07(月) 07:51:52
>>256
>>249ではないが、友人が自作フレームワーク作ってて、引数の型によって
挙動を変えたいっつー場面で数値と文字列の比較の話を出してきた。
当然止めとけと言っておいた。

ドキュメント化されてない部分だからいつ仕様が変わってもおかしくないしな。
258デフォルトの名無しさん:2009/09/07(月) 08:55:52
データ型を検証するようなプログラムなら、1と'1'が区別できないと困る。
たとえばPerlでJSONのバリデータを作ろうとしたけど、1と'1'が区別できなくてまじ困る。
たとえば「name は文字列である」というスキーマを定義したとして、
{ "name": "1" } # これはvalid
{ "name": 1 } # これはだめ
としないといけない。
でもPerlでは1と'1'の区別をどうすればいいのかわからないから、正しい検証ができない。

#自分が使わないからといって、他の人も同じだとは思わないでください。お願いします。
259デフォルトの名無しさん:2009/09/07(月) 09:43:18
>>258
設計が悪い。

260デフォルトの名無しさん:2009/09/07(月) 09:51:43
>>258
http://search.cpan.org/~makamaka/JSON-2.15/lib/JSON.pm
読んでみ。数値も文字列で格納することがあることが分かる。

どうしても必要ならJSONを自分でパースしてチェックすればいい。
JSONのレイヤーの問題なんだからPerlのレイヤーに落としてチェック
しようとする発想が間違っている。
261デフォルトの名無しさん:2009/09/07(月) 10:10:20
テストコード書いてみたよ
use 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"}
262デフォルトの名無しさん:2009/09/07(月) 11:32:39
このスレが賑わう時はいきなりレベルが上がるから勉強になるわ
263デフォルトの名無しさん:2009/09/07(月) 11:43:21
> #自分が使わないからといって、他の人も同じだとは思わないでください。お願いします。

これには同意するが、スクリプト言語で文字の1と数値の1を見分けたい、ってのは
やっぱ何かが間違ってる
264デフォルトの名無しさん:2009/09/07(月) 12:09:03
>>263
> これには同意するが、スクリプト言語で文字の1と数値の1を見分けたい、ってのは
> やっぱ何かが間違ってる


間違ってるのはそこじゃなくてアプローチ。
東京から熱海にいくのに「飛行機でいきたいので簡単な方法を教えてください」というようなもんだ。

そりゃ羽田-静岡富士山経由してもいけるが
新幹線を使おうよ。小田急+JRでもいい。


って話。
265デフォルトの名無しさん:2009/09/07(月) 12:47:25
↓ここでD51プレート持った鉄男登場
266デフォルトの名無しさん:2009/09/07(月) 12:53:15
>>263
>スクリプト言語で文字の1と数値の1を見分けたい、ってのは
>やっぱ何かが間違ってる

えーなんで?
*Perlでは*間違っているということなら同意するけど、スクリプト言語一般に広げないでほしい。
つーか、integerとstringの見分けがつかない言語が存在するなんて初めてしったわ。
PHPですらis_string()とかあるのに。
267デフォルトの名無しさん:2009/09/07(月) 14:17:09
Rubyだと逆に厳格だよね
268デフォルトの名無しさん:2009/09/07(月) 15:08:15
>>266
> つーか、integerとstringの見分けがつかない言語が存在するなんて初めてしったわ。

見分けがつかないんじゃなくて、区別されてないんだろ。
269デフォルトの名無しさん:2009/09/07(月) 15:16:31
つ シェルスクリプト
Perlの出自を考えれば文字列と数値を区別しないのも当然といえば当然。
270デフォルトの名無しさん:2009/09/07(月) 15:27:31
JSONも良いですが、symbolとstringをも区別するS式が最強ですね
271デフォルトの名無しさん:2009/09/07(月) 16:04:06
Perl/Tk を使って縦書き形式のテキストビューワーを作ろうとしているのですが、
括弧や句読点、長音記号等を 90度横倒しにして表示する良い方法が無いでしょうか?
272デフォルトの名無しさん:2009/09/07(月) 16:09:10
句読点は横倒しでおkじゃないぞ。
273デフォルトの名無しさん:2009/09/07(月) 16:20:56
>>271
単に縦書き用フォントを使えばいい。

何でも横倒しにすりゃいいってもんじゃないぞ。句読点もそうだが、
波ダッシュ字形問題が、縦書き用フォントを横にするだけでおkと思った
馬鹿外人のせいで起こってしまったことを忘れるな。
274271:2009/09/07(月) 16:28:52
>>272>>273
ご指摘、ご教示ありがとうございます
読み込んだ横書きテキストデータ中の文字を
横書きで問題が出る字形だけ
縦書き字形に変換するという方法で
なんとかやってみようと思います
275デフォルトの名無しさん:2009/09/07(月) 16:41:07
>>274
だから全部縦書き字形にしろって。お前なら絶対見落とすから。影響受けるのは記号だけじゃねーぞ。わかるか?
こういうのは意固地にならずに安直に安全側に転ぶように設計するのが鉄則。

何度も書くが、波ダッシュ問題は問題が出ない字形だと思ってそのまま横倒しにして起きた事故なんだから。
276デフォルトの名無しさん:2009/09/07(月) 17:08:47
>>261に欠陥発見。
×say $foo->{foo} ^ $foo->{foo} eq '0' ? '数値' : '文字列';
○say +($foo->{foo} ^ $foo->{foo} eq '0') ? '数値' : '文字列';

0.1は数値と扱われるようですね。'0.1'で文字列でした。失礼しました。
277デフォルトの名無しさん:2009/09/07(月) 17:10:10
また間違えた
○say +($foo->{foo} ^ $foo->{foo}) eq '0' ? '数値' : '文字列';
278274:2009/09/07(月) 18:04:21
>>275
フォント情報の中に入ってる横書き字形/縦書き字形変換テーブルにバグがあるとしたらもう私にはどうしようもありません。
279デフォルトの名無しさん:2009/09/07(月) 18:21:16
>>278
じゃUTF-8変換とか恐ろしくて使えないな。今後もShift_JISとかEUC-JPで頑張ってください。
多分バグが出る可能性よりも君がミスる可能性の方が高い。
280デフォルトの名無しさん:2009/09/07(月) 19:51:04
>>260
>数値も文字列で格納することがあることが分かる。
なんでこんなことするの?

>どうしても必要ならJSONを自分でパースしてチェックすればいい。
「すればいい」じゃなくて、Perlでは「自分でパースしてチェックするしかない」だよね。

>JSONのレイヤーの問題なんだからPerlのレイヤーに落としてチェック
>しようとする発想が間違っている。
えー、数値と文字列が区別できるような言語なら何の問題もないのに。
Perlではそれができないのを、「発想が間違い」とかいってごまかさないでほしい。
281デフォルトの名無しさん:2009/09/07(月) 20:06:21
>>280
> なんでこんなことするの?

魔法を使うため
282デフォルトの名無しさん:2009/09/07(月) 20:21:59
JSONのバリデータの、どこで内部構造の判定が必要なのかが分からない。
果たしてそれはバリデータなのか、物体Xではないのか。
283デフォルトの名無しさん:2009/09/07(月) 20:40:28
{"PI": 3.14, "unko":[1,1,2,3,5]}
といったデータを、json_validate($json_obj, {"/PI" => "float", "/unko/*" => "int"});
みたいにチェックする場合じゃないの
284デフォルトの名無しさん:2009/09/07(月) 21:18:42
>>283
その処理系は知らないから分からないが、Cライクな型を調べるものとして、
1000桁の数値であってもJSONとしてはvalidなのだから、
やはり文字列で判定すべきではないのか。
285デフォルトの名無しさん:2009/09/07(月) 21:35:51
>>253
>とりあえずお前はこれは読んどけ。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」という形式のほうが好まれるんでしょうか。


286デフォルトの名無しさん:2009/09/07(月) 21:50:23
で、module-starterは試してみたの?
287デフォルトの名無しさん:2009/09/07(月) 22:05:09
>>268
> 見分けがつかないんじゃなくて、区別されてないんだろ。


区別せずに都合よく使えるようにしてあるんだよ。
厳格に区別するほうがよほど簡単なのに。
288デフォルトの名無しさん:2009/09/07(月) 22:07:11
>>273
> 波ダッシュ字形問題

ってなんですか?
涙っしゅ??
289デフォルトの名無しさん:2009/09/07(月) 22:38:38
双方噛み合って無いやりとりもこのスレの華
290デフォルトの名無しさん:2009/09/07(月) 22:45:58
>>287
>区別せずに都合よく使えるようにしてあるんだよ。
区別せずに使えるのは利点だとしても、区別できない(見分けがつかない)のは欠点だよな。
291デフォルトの名無しさん:2009/09/07(月) 22:54:32
>>290
変数アクセス履歴を残しておけばいいわけだな
292デフォルトの名無しさん:2009/09/07(月) 23:14:53
>>286
module-starterをインストールすると、READMEのフォーマットがわかるの?
わかってないのに無理して回答するのやめようぜ。初心者が混乱するだけだから。
もしわかっててその回答なら、あまりにとんちんかんすぎる。
293デフォルトの名無しさん:2009/09/08(火) 00:11:14
>>286
プラグインModule-Starter-PBP入れてね。
294デフォルトの名無しさん:2009/09/08(火) 01:02:28
295デフォルトの名無しさん:2009/09/08(火) 01:07:39
どうしても型の区別がしたいなら、静的型付けをエミュレートした変数を作り、そこに格納しておくという手段も用意されています。
今回の議論で望まれている動作とは異なるかもしれませんが、運が良ければ CPAN の Variable::Strongly::Typed が参考になるでしょう。
296デフォルトの名無しさん:2009/09/08(火) 01:58:57
ひとつのサブルーチンで、スカラ、リスト、ハッシュを渡すと
それぞれ別の挙動をとるようには出来ますか?

それとも、単にスカラだけ引数に取るようにして
リストやハッシュは呼出側で参照にしてから
渡してもらうほうが賢明なのでしょうか?
297デフォルトの名無しさん:2009/09/08(火) 02:11:28
URI モジュールのように
スカラー変数をブレスされたリファレンスのように扱えるオブジェクトは
どういう仕組みでできているのでしょうか
ソース読んだけど意味不明。。。
298デフォルトの名無しさん:2009/09/08(火) 03:51:48
>>297
やっぱ use overload でいろんな演算子とかを独自に定義するんでないか
299デフォルトの名無しさん:2009/09/08(火) 08:37:44
>>296
> それとも、単にスカラだけ引数に取るようにして
> リストやハッシュは呼出側で参照にしてから
> 渡してもらうほうが賢明なのでしょうか?


その方が確実かなあ。
もっと確実なのはサブルーチンを分けることなんだけど、なんでひとつにまとめたいのさ?
300デフォルトの名無しさん:2009/09/08(火) 09:12:42
>>298
ありがとうございます
調べてみます
301デフォルトの名無しさん:2009/09/08(火) 09:44:37
>>297
sub X(\$) {...}
302デフォルトの名無しさん:2009/09/08(火) 09:51:43
>>290
必要でないからあえて削除されたんだよ。
型にこだわることで起こる煩わしさのほうが多いから。

それにバリデータなんてどっかで誰かがもう作ってるだろ。
あえてパールで作り直すのは自由だけど、能力不足を棚にあげて言語のせいにされてもね。
ガタガタいうなら適切と思う言語を選べばいい。
言語のせいにするやつは、言語を変えてもできないだろうから。
303デフォルトの名無しさん:2009/09/08(火) 10:00:09
>>280
> えー、数値と文字列が区別できるような言語なら何の問題もないのに。

区別できないところに大きなメリットがある。

例えばPHPはPerlと同じく自動型変換を可能としたが、型は残したままにしたために
大変な混乱を大量のバグを生んだ。

で、区別ができないとどう困るのか具体的な返事がまだないのだが?俺は15年くらいPerl書いてるけど
困ったことなぞ一度もないぞ。

>>285
読んだんなら続きは責任もって答えてやる。
書いてないってことはREADMEやChangesにはフォーマットなし。自由に書いてよし。ってことだ。読み取れないのか。

パッケージとファイル名は基本的に一致すべしと考えておけ。で、名前空間の汚染は非常に嫌われるからなるべく少なく。
この辺はIRCでソース晒して相談するといい。あまり糞なパッケージに普遍的な名前をつけられると他が迷惑する。

バージョンのつけ方は好きに汁。5.10.1みたいのでもいいし、5.00503みたいのでもいい。後者の書き方をすると
普通バージョン番号とパッチ番号(005/03)とみなされる。最初は謙虚に0.0.1とか0.00001にしとけ。
304デフォルトの名無しさん:2009/09/08(火) 10:19:36
>>288
ググるくらいできんのか。
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])で挙動をスイッチするような実装とか最近よく見かけるぞ。
305デフォルトの名無しさん:2009/09/08(火) 10:34:51
「本質的にスカラーは型を持たない」
  -- Larry Wall, プログラミングPerl, O'Reilly, 1997, p43

Perlは内部的にスカラーを数値や文字列で扱ってるだけで、「型が区別できない」わけではない。
「数値や文字列はあっても、数値型や文字列型なんかない」のである。そこんとこ間違えないように。
306デフォルトの名無しさん:2009/09/08(火) 11:13:56
Validateする目的は、(JSONを媒体とした)データを受け取ったPerlのプログラムを正常に動作させるためですよね?
それなら、データがJSONレベルで数値だったか否かは全く問題にならないのでは?
JSON表現の "1" と 1、このどちらも、Perlレベルでは文字列としてでも整数値としてでも正常に扱えるんですから

どうしてもJSONレベルでのValidateを望むのであれば、
JSONデコーダから作るしかないのですね。Ruby等、データに型が備わっている言語であれば、
確かにJSONデコーダとJSONレベルのValidatorは完全に分離可能でしょう。
でも、Perlにはそれが出来ない。仕方のないことです
307デフォルトの名無しさん:2009/09/08(火) 12:04:55
JSON表現では区別できるならどのように読み取ったかを
後から判別できるような情報を残しておくことは可能。
既存のパーサーが区別しないというだけの話で
言語のせいにしたところで問題が解決するわけではない。
数値と文字列の区別がある言語であってもパーサーが区別しなければ同じこと。
308デフォルトの名無しさん:2009/09/08(火) 12:26:56
>>303
>書いてないってことはREADMEやChangesにはフォーマットなし。自由に書いてよし。ってことだ。読み取れないのか。

書かれてないから質問しているのに・・・
「書いてないってことはフォーマットなし」なんて読み取れるわけないでしょ。
書かれてないことは「不明」だと判断するのが普通じゃね?どういう頭の構造してるんだよ。

そのページはCPANパッケージの作り方についてすべてを網羅しているの?
もしそのページに書かれてないことは自由に判断していいなら、テストスクリプトのファイル名だって、
パッケージのファイル名だって、自由にしてもいいことになるだろ。でも実際にはそうじゃないじゃん。
書かれてないことは「不明」なんだから、分かっている人に聞いてみて意見をあおぐのが常識的な行動じゃないか?
「書いてないから何をやってもいい」というおまえみたいな考えこそ大迷惑。


しかしまー、あれだ、自分が紹介したページが見当はずれだったことはまるで反省せず、
「読み取れないのか」と言い放つなんて、なんという傲慢ぶり。まるでdank○gai。
309デフォルトの名無しさん:2009/09/08(火) 12:39:35
>>308
流れ見てると全くもって君の言うとおりだと思うけど、最後に例えでその名前を出すのはダメだろうw
310デフォルトの名無しさん:2009/09/08(火) 12:40:08
>>284
>1000桁の数値であってもJSONとしてはvalidなのだから、
>やはり文字列で判定すべきではないのか。
なんで1000桁の数値なら文字列にしないといけないの?
1000桁だろうと、数値は数値としてもっておけばいいじゃん。
C言語じゃあるまいし、スクリプト言語なら桁数の多い数値でもふつうに扱えるようになっていてもらわないと。
311デフォルトの名無しさん:2009/09/08(火) 12:51:23
>299 >304
ありがとうございます。素直にスカラを取るようにします。
312デフォルトの名無しさん:2009/09/08(火) 13:12:40
JSONでの型をバリデートする話とはちょっと違うんだけどずいぶん昔に
WebアプリケーションでASINをJSONで吐いてJSからあれこれするときに
{ASIN=>$asin} みたいなので、$asin =~ /^[0-9]+$/ だったりすると
{"ASIN":1234} みたいなJSONを吐き出しやがって閉口した覚えがある。
これだけならまだいいんだが $asin =~ /^0[0-7]+$/ だと
8進数に変換されてえらいことになった。

手元で試したら再現しなかったので最近のJSON.pmは大丈夫ぽいが。
313デフォルトの名無しさん:2009/09/08(火) 15:55:55
perlは変数自体に型はないけど、データには型はあるがな。見分けられないわけもないだろよ。
まぁ、perlは非常に弱いLvで変数の型を決め付けてるぞ。
文字型と判断されるか数値型と判断されるかで、挙動が変わるビット演算子がある。唯一それだけ。
これは変数の経歴を記録してる。


関係ないけど、バイナリデータ扱ったら、ヌル文字だらけでとんでもない目に遭った。
もう文字列の0は真にしてくれよ。binmodeって書いたときだけでいいから。せめて'0000'は真だろ!
あと、明示的に指定せずにほっといたら'0000'を勝手に0にすんのもやめてくれ、って思った。
314デフォルトの名無しさん:2009/09/08(火) 17:50:24
>>308
質問の内容が書いてあるとは一言もいっていないが?
テストのファイル名も分からない状態のあなたはまずこれを100回読めという意味だよ。
だから100回読んだあなたにちゃんと補足で答えてるだろ。

勝手に勘違いしてファビョって礼もなしにそれか。
315デフォルトの名無しさん:2009/09/08(火) 17:59:14
スクレイピングするスクリプトを作るときのサポートライブラリで、
ページの構造をスクリプト作成に便利なようにてきとーに整形して表示するというのをけっこう前に見かけて、
あーこれ便利そうだなーと思ってそのままだったんです

今探そうと思ったらぜんぜん見つかりません
何か心当たりのある方いますか?
316デフォルトの名無しさん:2009/09/08(火) 18:07:45
>>314
分不相応にプライドの高い間抜けな質問者のオーラを
事前に察知して華麗に無視できなかったお前が悪い。
317デフォルトの名無しさん:2009/09/08(火) 18:12:44
>>310
> スクリプト言語なら桁数の多い数値でもふつうに扱えるようになっていてもらわないと。
use bignum;を使え。

> なんで1000桁の数値なら文字列にしないといけないの?
効率が悪すぎる。

>>313
変数をそのまま真偽値判定に突っ込むな。
318デフォルトの名無しさん:2009/09/08(火) 19:06:41
ディレクトリの中にあるテキストファイルから、任意の文字列を発見した時に
その文字列が含まれるファイル名を出力したいんだけど
どうすればいいの
教えてエロい人!!
319デフォルトの名無しさん:2009/09/08(火) 19:07:57
>>315
どっかで見たな
320デフォルトの名無しさん:2009/09/08(火) 19:23:27
>>302
>必要でないからあえて削除されたんだよ。
ということは、以前は機能として存在したということか。どのバージョンで削除されたか教えてくれ。

>型にこだわることで起こる煩わしさのほうが多いから。
そんなわけない。だったらJSもRubyもPythonも煩わしいことになるけど、そうはなってない。

>それにバリデータなんてどっかで誰かがもう作ってるだろ。
>あえてパールで作り直すのは自由だけど、能力不足を棚にあげて言語のせいにされてもね。
上のほうで出たのはJSONのバリデータなんだけど、それはすでにPerlにあるの?
ぐぐったけど見つからんぞ。せっかくPerlにないものを作ろうとしてくれてる人がいるのに
なんでこんな反応ばっかりなんだろうね。

>ガタガタいうなら適切と思う言語を選べばいい。
>言語のせいにするやつは、言語を変えてもできないだろうから。
これに関しては言語を変えたら簡単にできるこだろ。
数値と文字列の判定なんて、PHPですら簡単にできることなのに。ガタガタ言い訳カッコワルイ。
321デフォルトの名無しさん:2009/09/08(火) 19:36:58
>>318
ディレクトリをマウスで右クリック
「検索(E)」
ファイルに含まれる単語
322デフォルトの名無しさん:2009/09/08(火) 19:44:52
>>321
すいません、windowsを使っていないので
それはできませんorz
323デフォルトの名無しさん:2009/09/08(火) 19:50:03
>>314
>質問の内容が書いてあるとは一言もいっていないが?
すげー!質問したやつに関係ないURLを紹介しておいて、文句をいわれたら『答えが書いてあるとは誰もいってない』と逆切れ!
言い訳もここまでくるといっそすがすがしいな。

>勝手に勘違いしてファビョって礼もなしにそれか。
無関係なURLを紹介しておきながら「読み取れないのか」と言って相手のせいにするようなやつのくせして、礼だけは求めるのかよ。
相変わらずのdank○gai的傲慢さだな。論理がつながってないところもdank○gaiにそっくりだ。
あれか、Perl使うとみんなdanみたいなのになるのか?danが今のようなdanになったのはPerlのせいなのか?
324デフォルトの名無しさん:2009/09/08(火) 19:56:32
>>323
> あれか、Perl使うとみんなdanみたいなのになるのか?danが今のようなdanになったのはPerlのせいなのか?

うん! その通りだよ!!
逃げて!! Perlから逃げて!! 手遅れにならないうちにPerlから逃げてぇ!!
325デフォルトの名無しさん:2009/09/08(火) 19:56:35
>>320
シンタックスレベルのバリデータなら既にCPANに転がってるよ
http://search.cpan.org/dist/Test-JSON/
326デフォルトの名無しさん:2009/09/08(火) 20:00:13
>>260, >>313の話から考えると、
Perlのある値は、(その時点で)文字列or/and数値としてメモリ上に表現されているって情報しか持ってなくて
その値の由来が文字列か数値かなんて情報は持ってないとか?

そうだとすると、型っていうより、Perlの値は文字列と数値の二つの側面があるってイメージで
型の判別が出来る・出来ない、というより、そもそも判別する対象(文字列型・数値型)がないのかな

これであってる?教えてくださいPerl上級者さん><
327デフォルトの名無しさん:2009/09/08(火) 20:11:31
>>326
方向はだいたいあってるんだぜー。
もっと詳しく知りたければ Devel::Peek あたりで遊んでみることだぜー。
328デフォルトの名無しさん:2009/09/08(火) 20:14:00
しらんけど C++には Variant型ってクラスで作られた型があるな
329デフォルトの名無しさん:2009/09/08(火) 20:15:08
>>327
ありがとう
sv.hにスカラー値っぽいのが定義されてたけど、どうもそうみたいですね〜
もうPerl使ってないけど、4間年も使ってたのに気付かなかったw 勉強になりました
330デフォルトの名無しさん:2009/09/08(火) 22:12:10
>>323
何でそんなに興奮してるのか知らないけど、
続ければ続けるほど自分が皆から馬鹿にされるだけの書き込みを続けても
意味無いと思うよ。
331デフォルトの名無しさん:2009/09/08(火) 22:45:32
>>318
grep -rh 検索文字列 ディレクトリ
332デフォルトの名無しさん:2009/09/08(火) 22:48:13
>>320
ことか。どのバージョンで削除されたか教えてくれ。



> そんなわけない。だったらJSもRubyもPythonも煩わしいことになるけど、そうはなってない。

煩わしいよ。


> 上のほうで出たのはJSONのバリデータなんだけど、それはすでにPerlにあるの?


こまけーことイチイチ聞かなきゃ作れないひとには期待してない。
333デフォルトの名無しさん:2009/09/08(火) 23:25:33
>>331
わかりました。ありがとうございます
334デフォルトの名無しさん:2009/09/08(火) 23:30:58
数値と文字列の区別が煩わしいと思う人も居るし
文字列に数値のように振舞われるのが煩わしい人も居る

前者にとって、数字を足すのにいちいち変換するのは苦痛だし
後者にとって、"0"が偽なのは地雷でしかない
335デフォルトの名無しさん:2009/09/08(火) 23:32:01
まだデュエルしてんのか。デュエリスト板でやれ
336デフォルトの名無しさん:2009/09/09(水) 00:56:14
>>334
> 文字列に数値のように振舞われるのが煩わしい人も居る

プログラマが区別できてないなら何しても同じ。
シンタックスエラーかランタイムエラーかの違いすらない。

> 後者にとって、"0"が偽なのは地雷でしかない

イミフ。
歴史的にゼロを偽とするのが習慣。
シェルについては、これも歴史的理由でゼロを真とする習慣だが。
337デフォルトの名無しさん:2009/09/09(水) 01:31:16
0でなく"0"な
338デフォルトの名無しさん:2009/09/09(水) 02:39:02
>>284
ためしにJSON::Syckに1000桁の数字入れたら数値 : Infになりやがった。
JSON.pmは優れたことに文字列に変換して格納してくれてる。マニュアルにも
書いてあったがこれは立派な挙動。

>>313
どう考えても君が悪いと思う。ヌル文字は偽じゃないし、なにを勘違いしてるのか知らんが、
'0000'も真だ。'0'が真で'0x00'を偽にしたいんなら、アスキーコードで判定させればいいし
Perlはその手段を提供している。

> あと、明示的に指定せずにほっといたら'0000'を勝手に0にすんのもやめてくれ、って思った。

は。ソース出してみ。Perlはそんなにお行儀悪くない。

>>326
当然由来までは保存してない。だいたいその解釈であってる。

>>334
よく初心者が引っ掛かるところだが、仕様を理解すれば地雷を踏むことはなくなる。
ただし、テキストファイル末尾の改行文字なし'0'だけはどうすることもできない。
339デフォルトの名無しさん:2009/09/09(水) 07:30:14
>>325
それはJSONが文法的に正しいかどうかをチェックするだけのチェッカーであってバリデータではない。
きみはスキーマバリデータが何かわかってないようだ。
文法をチェックするだけなら1と’1’の違いが問題になるわけがない。
340デフォルトの名無しさん:2009/09/09(水) 08:06:39
>>339
自分が何を言ってるか、理解してる?
341デフォルトの名無しさん:2009/09/09(水) 09:14:15
>>337
> 0でなく"0"な

文字としての比較なら
eqとかne
使えば?

比較演算子使わずに済ますのってZ80でXOR Aするような古くさいイメージ。
342デフォルトの名無しさん:2009/09/09(水) 10:02:56
地雷ってのは思わぬところで踏むものだと思うよ
343デフォルトの名無しさん:2009/09/09(水) 10:44:44
>"0"が偽なのは地雷でしかない

↑コイツ・・・最高にアホだな
344デフォルトの名無しさん:2009/09/09(水) 10:46:15
$unko = undef ; print "\nundef is " , ($unko ? "TRUE" : "FALSE");
$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");
345デフォルトの名無しさん: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信者に言わせると「そういうことをすること自体が間違い」らしいです。
別にどんな言語だって万能じゃないのだから、うまくできないことがあったら
「それはこの言語ではうまくできない」と素直に認めればいいだけなのに、
「そんなことをするほうが間違っている」とわめく痛い信者が多い今日この頃。


346デフォルトの名無しさん:2009/09/09(水) 11:39:31
>>345
そのすぐ後の >307 をスルーしてるのはわざとか
どうしてもPerl自体の問題にすり替えたい様子だが
347デフォルトの名無しさん:2009/09/09(水) 11:42:09
JSONバリデータなんぞ、再帰下降法使っても3時間ありゃ書けるだろうに。
出来ないという奴は、もう、そういうことにしとけ。
348デフォルトの名無しさん:2009/09/09(水) 11:43:10
ほらまた、すぐそういうこと言う。3時間以内に書いて来いって言われるぞw
349デフォルトの名無しさん:2009/09/09(水) 12:02:28
>>345
「自分にはできないから言語が悪い」のですね。
わかります。
350デフォルトの名無しさん:2009/09/09(水) 12:16:20
CPANをユーザーディレクトリで利用するために本当に必要な記述ってなに?
351デフォルトの名無しさん:2009/09/09(水) 12:26:16
>>350
CPANは管理者権限で利用するのが正統
352デフォルトの名無しさん:2009/09/09(水) 13:13:10
>>348
いいんじゃない言われても。馬鹿は放置するだけ。
353デフォルトの名無しさん:2009/09/09(水) 15:03:46
”0” は48(0x30)で真だろ?
354デフォルトの名無しさん:2009/09/09(水) 15:11:09
>>351
わかりました
諦めます
355デフォルトの名無しさん:2009/09/09(水) 15:36:48
>>350
use lib 'ディレクトリ';


のこと?
質問の意図がつかめない。
356デフォルトの名無しさん:2009/09/09(水) 16:34:03
>>353
いったいどこの3流学校でそんな事を習ったんだ?
357デフォルトの名無しさん:2009/09/09(水) 16:46:30
東村山第三小学校だけど
358デフォルトの名無しさん:2009/09/09(水) 18:24:29
中州産業大学だけど
359デフォルトの名無しさん:2009/09/09(水) 19:25:45
nullとの比較は$hoge == undefでおk?
360デフォルトの名無しさん:2009/09/09(水) 19:31:17
えっ?
361デフォルトの名無しさん:2009/09/09(水) 19:37:56
>>359
nullは無い。
defined($hoge)
で未定義をチェック。
362デフォルトの名無しさん:2009/09/09(水) 19:38:34
>>361
ありがとう。
久しぶりにperlをやったから、完全に忘れてる
363デフォルトの名無しさん:2009/09/09(水) 22:15:59
あと、 == は数値比較だから気をつけろ
364デフォルトの名無しさん:2009/09/09(水) 22:18:43
> defined($hoge)

すぐカッコつけたがるよね、最近の若者は。
365デフォルトの名無しさん:2009/09/09(水) 22:36:10
あー、おれもカッコつけたがる若者だわ。
カッコつける場合とつけない場合ってなに?
366デフォルトの名無しさん:2009/09/09(水) 22:42:30
なんかjavaよりめちゃくちゃ速く感じた
本当に速いかわからないけど
367デフォルトの名無しさん:2009/09/10(木) 00:19:45
>>365
優先順位をはっきりさせたいとき。
好み。
368デフォルトの名無しさん:2009/09/10(木) 00:26:44
昔中途半端にカッコつけてたらドツボにハマった
それ以来できる限り自然体でいようと思った

print (1 + 2) * 3, "\n";
369デフォルトの名無しさん:2009/09/10(木) 00:28:04
ifの括弧内に単品で書くなら省くかな
でも複数条件組み合わせるとか、後置ifの条件に入れるときは書きたい

まあ好みだな
370デフォルトの名無しさん:2009/09/10(木) 02:13:48
if (defind $i) {ほげ}
if (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)) {ほげ}
371デフォルトの名無しさん:2009/09/10(木) 03:03:38
C使いからすると括弧の無いifは我慢ならん
372デフォルトの名無しさん:2009/09/10(木) 03:30:32
JSONを知らないから、外れた事言ってるかもしれないが、
perlは文字と数値を区別しないんだから、区別したいケースが
あるとしたら、外部からのデータな訳だよね?それなら外部から
入力する時に文字をエスケープすれば良いだけじゃないの?
"123"→"%31%32%33",123→"123"とかして。
373デフォルトの名無しさん:2009/09/10(木) 08:00:24
>>372
JSONは通常文字入力をエスケープする仕様にはなってないので、
そういう迂回はすべきでない。


ぎゃーぎゃー騒いでたひと、しまいには
Perlで使うわけではないのにPerlでバリデーション処理したいという
訳のわからないことをいいだした。
重箱のスミつついて意味のない優越感に浸りたかったのだろう。

ほら、あれだ。
「俺の出身小学校からオリンビック選手が出たんだぜ。(俺って)スゲーだろ?」「お前んとこはしょぼいお笑いタレントしかでてないよな?俺の勝ちだな。」
ってレベルな感じ。
374デフォルトの名無しさん:2009/09/10(木) 11:28:58
>>371
かなり重症なC言語脳ですね。
視野が狭すぎますよ。
じぶんの殻に閉じこもりすぎです。
世間は広いんですよ。
もっと多くのものを見て聞いて学ぶべきですよ!
375デフォルトの名無しさん:2009/09/10(木) 11:44:46
かっこを付けてPerlの世界から弾き出され、$を付けてCの世界からも弾き出され
376デフォルトの名無しさん:2009/09/10(木) 11:53:36
かっこ付けない専売特許はRubyのほうが上でしょ?
377デフォルトの名無しさん:2009/09/10(木) 12:06:15
>>376
ベタPerlを自認するRubyが?
378デフォルトの名無しさん:2009/09/10(木) 12:07:49
>>374
そうです!
リスプはカッコの多い言語ですって坂村先生がいってました!
379デフォルトの名無しさん:2009/09/10(木) 13:24:09
>>376
おいおい。それはもしかしてマジレスなのか?
380デフォルトの名無しさん:2009/09/10(木) 14:38:13
>>376
やってみれば分かると思うが、文法的にはRubyのが省略できる条件は制限されるよ
逆に、出来る場面は省略する人が多いけど
381デフォルトの名無しさん:2009/09/10(木) 15:07:30
>>374
えらく風呂敷広げたなw
382デフォルトの名無しさん:2009/09/10(木) 16:13:15
if文のかっこなしはPerl 6からだね
383デフォルトの名無しさん:2009/09/10(木) 16:29:23
>>382
おいおい。それはもしかしてマジレスなのか?
384デフォルトの名無しさん:2009/09/10(木) 16:42:53
>>383
これ↓ができるのはPerl 6からでしょ?

if $x < 0 {
$y = 2;
$z = 3;
}
385デフォルトの名無しさん:2009/09/10(木) 16:45:56
後置の話してたんだろ
386デフォルトの名無しさん:2009/09/10(木) 17:09:11
$a = 1 if $b ne "";

こんなやつでしょ?
これはC++使いだけど特に気にならなかった。
要は三項演算みたいな感じだし
387デフォルトの名無しさん:2009/09/10(木) 19:34:55
>>198 今更ながらありがとう。
 結局ループになってしまったけど……
 一応、該当があれば別のサブルーチンに飛んで、無い場合は最も近い配列の場所を見つけ出すようにしたつもり
 既に配列(@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;
}
388デフォルトの名無しさん:2009/09/10(木) 19:36:35
} else {
if ($hai[$mid] lt $in) {
$min = $mid - '1';
} elsif ($hai[$mid] gt $in){
$max = $mid + '1';
} elsif ($hai[$mid] eq $in){
&・・・・・       #サブルーチンへ
          last;
         }
       }
}
}

スペース消えてるけど、一応二分探索ループです……
>>198さんのような再帰はうまくつかえなかった……
389デフォルトの名無しさん:2009/09/10(木) 23:35:57
久しぶりにCを書いたら、
@array = (0, 1, 2);
に相当するようなことの書き方すら判らなくなってた
390デフォルトの名無しさん:2009/09/11(金) 00:03:44
perl でソースを複数のモジュールに分けて書いた場合
配布する時は汎用モジュールと同じ様に
個人的なモジュールも CPAN に登録するの?

そのプログラムを使うユーザは
プログラムの入ったディレクトリ・ツリーごと扱って
$HOME/bin とかに入れたりするの?

コンパイルすれば単体の実行ファイルになって扱い易くなるだろうけど
ソースのまま配布したいんだけど……。
391デフォルトの名無しさん:2009/09/11(金) 00:06:53
つ perldoc FindBin
つ perldoc lib
392デフォルトの名無しさん:2009/09/11(金) 02:50:22
use FindBin;
use lib "$FindBin::Bin/lib";
とするか
use FindBin::libs;
でいけるんですね。

取っ掛かりが出来たので OOP だとどうなるのかとか
標準的なディレクトリ構成とかを調べて見ようと思います。
ありがとう。
393デフォルトの名無しさん:2009/09/11(金) 07:50:59
>>390
今CPANはネームスペースがアレなことになっているので、それだけはやめれ。手段ががいしゅつだから省く。
モジュール登録する時も、IRCなどで名前空間の妥当性とCPANに登録する必要性を審議しらもらってからにした方がいい。
394デフォルトの名無しさん:2009/09/11(金) 07:53:17
>>387

ファインチューニングしてないけど、こんな感じ?


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;
}
395デフォルトの名無しさん:2009/09/11(金) 09:06:50
>>394自己レス。

> &subroutine if $$a[$s
これは削除して呼び出し側でチェックしないとだめだわ。
でないと何度も呼ばれてしまう。
396デフォルトの名無しさん:2009/09/11(金) 16:51:05
数値の 0 を参照させたい時はどうしたらいいのでしょう?
397396:2009/09/11(金) 17:02:32
自己解決しました
398デフォルトの名無しさん:2009/09/12(土) 11:10:10
ファイル名を取得するとき、opendirとglobどっちを使うべきなのでしょうか?
399デフォルトの名無しさん:2009/09/12(土) 11:47:16
File::Slurpのread_dirオススメ

400デフォルトの名無しさん:2009/09/12(土) 16:42:48
ファイルグロブなんか使ったらいかんと誰かがブログで書いてたよ
401デフォルトの名無しさん:2009/09/12(土) 17:41:16
>>400
それって結局「いかん根拠なんてないじゃん」という話じゃなかったか?
402デフォルトの名無しさん:2009/09/12(土) 20:35:07
.と..をいちいち除外しなくていい
403デフォルトの名無しさん:2009/09/12(土) 22:42:15
古いperlは、ファイルグロブはシステムに依存してた。
(「ファイル名が長過ぎます」エラー等のperlの外の問題を切り離す事が出来ない。)
つー事で古くからの人間は「グロブなんざ使うんじゃねえ。」と言いがち。
で、それら諸先輩に影響を受けた人々が、本来の根拠と別に理由をこじつけ
「だからグロブは使いません!」って言ってる(人もいる)。

今となってはどっちでも良いんでねえの?10年以上前の常識だし、
俺はグロブ使わんけど。
404デフォルトの名無しさん:2009/09/12(土) 23:31:36
>>398
opendirはファイル名のみとりたいときに便利。

globはパスごととりたいとき便利。
405デフォルトの名無しさん:2009/09/13(日) 00:38:38
あー
パスは自前で管理してファイル名とくっつけて開くのが当然だと思ってたけど、
別にそんなことしなくてもいいか
406デフォルトの名無しさん:2009/09/13(日) 01:48:50
> "There's more than one way to do it" ということで、
407デフォルトの名無しさん:2009/09/13(日) 03:34:06
Perl界の重鎮、子飼弾氏は以下のように述べております。

404 Blog Not Found:perl - glob,readdir, and regexp
http://blog.livedoor.jp/dankogai/archives/51058540.html
408400:2009/09/13(日) 08:39:41
今更ただのシャレだったなんていい出しづらい雰囲気だな
409デフォルトの名無しさん:2009/09/13(日) 11:02:01
えっ・・・みんな気づいてなかったのか?
410デフォルトの名無しさん:2009/09/13(日) 11:58:28
はいはい、>>407は気がついていた。偉い偉い。
411デフォルトの名無しさん:2009/09/13(日) 12:55:27
関数名を動的に指定して実行することはできますか。
sub f1 { print "f1()¥n"; }
sub f2 { print "f2()¥n"; }
...
とあるときに、
my $func = "f2";
$func();
のように実行したいんですけど、できないでしょうか。
ちなみに $func() はシンタックスエラーになり、&$func() は use strict しているとエラーになりました。
412デフォルトの名無しさん:2009/09/13(日) 13:15:31
>>411
my $func = \&f2;
&$func();

もしunix環境があるなら man perlref を見るといいよ。
サブルーチンへの参照の扱いがいろいろ書いてあるから。
413デフォルトの名無しさん:2009/09/13(日) 13:16:47
>>411
その関数に限れば、

main->$func;

で呼べますが。
414デフォルトの名無しさん:2009/09/13(日) 13:19:49
eval "&$func()"とかも使えるね
415デフォルトの名無しさん:2009/09/13(日) 14:08:14
どうもありがとうございます。

>>412
関数名は変数で指定したいので、残念ながらその方法は使えないようです。

>>413
パッケージ名を指定すると呼び出せるのですか。なるほど。
パッケージ名が長いと面倒ですけど、この方法でやってみます。
416デフォルトの名無しさん:2009/09/13(日) 14:34:00
>>415
クラスメソッドとして呼び出してるから第一引数が
自動的に追加されるが、それでもいいのか?

#!/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__
417デフォルトの名無しさん:2009/09/13(日) 14:56:26
スコープを絞って、no strict 'refs'するのが正攻法?

{
no strict 'refs';
$func->();
}
418デフォルトの名無しさん:2009/09/13(日) 17:17:12
>>411
これでよければ簡単。


$func{f1}= sub { print "f1() n"; };
$func{f2}= sub { print "f2() n"; }

my $func = "f2";
$func{$func}();
419デフォルトの名無しさん:2009/09/13(日) 18:25:33
Text::MicroTemplate でキャッシュを使うにはどうしたらいいでしょうか。
ドキュメントを見るかぎりにおいては、

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 の使い方を知っている人がいれば教えてください。
420デフォルトの名無しさん:2009/09/13(日) 22:39:43
>>411
AUTOROAD じゃダメなの?
421デフォルトの名無しさん:2009/09/13(日) 23:48:59
windowsXP+ActivePerl5での質問です。
windows media encoderで映像をライブ中継したいのですが
ライブ中継中だけ、ブラウザにメディアプレイヤーが表示されるようにしたいです。
サーバ側のwindows media encoderが起動されていることがPerlで確認できれば
そのようなことが可能だとおもったのですが、そのような関数はありますか?

また、もっといい方法あったら教えていただきたいです。
422デフォルトの名無しさん:2009/09/14(月) 00:54:50
Windowsのコマンドプロンプトから
>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
でやってみたのですが駄目でした

どなたかいいやりかた教えてください。
423デフォルトの名無しさん:2009/09/14(月) 00:57:46
>>422 はWeb::Scraperの話です
424デフォルトの名無しさん:2009/09/14(月) 01:28:19
エラーメッセージ隠蔽者
425デフォルトの名無しさん:2009/09/14(月) 07:30:15
426デフォルトの名無しさん:2009/09/14(月) 09:19:05
>>425
ありがとうございます

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側はもういいかなという感じです。文字化けが厄介なので。




427デフォルトの名無しさん:2009/09/14(月) 11:03:49
……
428デフォルトの名無しさん:2009/09/14(月) 14:20:02
どのパッケージからでもパッケージ名を付けずに呼べるようなサブルーチンを定義できますか?
もちろん、名前空間的に危ういことは百も承知で。
用途としては、個人用のスクリプトでよく使う処理を纏めておきたいって感じです。
429デフォルトの名無しさん:2009/09/14(月) 15:48:12
普通に(package宣言せずに)関数を別ファイルに定義してuseなりrequireなりすればよくね?
430デフォルトの名無しさん:2009/09/14(月) 16:10:04
package宣言してもimportしちゃえば問題無いと思われ。
431デフォルトの名無しさん:2009/09/14(月) 16:41:51
ま、そのうち後悔するからモジュールにしてuseするようにしとけ。
Exporter使えばそんなに難しくないし。
432デフォルトの名無しさん:2009/09/15(火) 02:50:59
overloadプラグマをuseしたときに使える関数一覧はありませんか?
overload::StrValとかが何する関数か知りたいです
433デフォルトの名無しさん:2009/09/15(火) 03:08:13
434デフォルトの名無しさん:2009/09/15(火) 04:10:08
マニュアルを読まなくなった次の時代には、マニュアルという概念自体が失われる。
435デフォルトの名無しさん:2009/09/15(火) 09:29:23
>>429-430
use、require、importと色々試しましたが最初の1回しか効かないような…?
とりあえず>>431に出ているExporterを覚えてみます。ありがとうございました。

…というか、色々探してたら
欲しい処理は既にCPANにあったと言うオチ…お騒がせしました。
436デフォルトの名無しさん:2009/09/15(火) 14:35:00
>>435
凝った事しない限り大抵そのオチだから気にしなくても。
437デフォルトの名無しさん:2009/09/16(水) 08:50:40
>>436
変なスレが上がってる
438デフォルトの名無しさん:2009/09/16(水) 09:54:55
はじめまして、こんにちは。 Perl 4 や Perl 5.005 の時代からやってきました。
私のような古代人が最近の Perl 5.10 くらいのモダンな Perl のコードを
書けるようになるのにおすすめの書籍やドキュメントがあれば教えてください。
439デフォルトの名無しさん:2009/09/16(水) 11:31:39
440439:2009/09/16(水) 11:34:07
>>438
間違えたこっちだった
ttp://perl-users.jp/nowpast.html
441デフォルトの名無しさん:2009/09/16(水) 14:56:23
>>438
本はモダン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)。
442デフォルトの名無しさん:2009/09/16(水) 19:29:52
すっかりJavaみたいになっちゃって
443デフォルトの名無しさん:2009/09/16(水) 19:51:10
HTML::Templateがold styleでTemplate Toolkitがmodern扱いなのは遺憾に思う。
444デフォルトの名無しさん:2009/09/16(水) 20:00:47
あほなSmarty野郎どもがHTMLをSmartyコードで大量汚染している現状を見ると、HTML::Template(またはHTML::Template::Pro)くらいが丁度いいよな。
機能が絞られているとはいえ不自由した事全然無いし。
445デフォルトの名無しさん:2009/09/16(水) 23:17:12
>>442
ねー。まあ完全にOOへ移行したんだから仕方ないと思う。5のはやっつけなんちゃってOOだし。
bless実装だけでOO移行するとかLarryの頭の中はどーなってんだか。

>>443
誰かがそれ書いてたけどTTは重くて最近は評判悪いよ。
下手に高機能だからモデルとビューの分離に失敗しやすいし。
テンプレート重いのは致命的だし。
ClearSilverくらいがちょうどいい。

HTML::Templateは<>で囲っちゃいかんだろ。何文書かわからん。
TTは逆に意味不明な文字列扱いになってしまう。まあロジックだから
それでいいと考えることもできる。
CSは<?cs ... ?>で囲ってあるので一応お行儀が良い。
446デフォルトの名無しさん:2009/09/16(水) 23:56:58
俺はPerl5のOOは好きだけどね
いつの間にかC++やJavaの、クラスを作るあれがオブジェクト指向って
ことになってるけど、本来はオブジェクトを作れればオブジェクト指向
だったわけで、その辺りを垣間見れるのがいい
447デフォルトの名無しさん:2009/09/17(木) 00:12:30
>445
別に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>
448デフォルトの名無しさん:2009/09/17(木) 00:48:23
とあるリストを返す関数があり、その中から私が欲しいのは2番目の要素だけなのですが
これをfuncA()[1]と書くとエラーになり、funcA()->[1]と書くと想定した値は返って来ません。
my @ary = funcA(); $ary[1];だと想定通りの値を得ることができました。
関数が返すのがリストで、その一部のみが欲しい場合、一旦配列に格納するしか無いのでしょうか?
449デフォルトの名無しさん:2009/09/17(木) 00:51:04
…「一部」って紛らわしいかも知れない。
欲しいのはその1要素のみです。スカラーコンテキストを仮定してます。
450デフォルトの名無しさん:2009/09/17(木) 02:20:21
(funcA())[1]
451デフォルトの名無しさん:2009/09/17(木) 03:44:00
カッコエエ!
452デフォルトの名無しさん:2009/09/17(木) 08:12:42
>>450
一部ならこんなのもオケ。
> (funcA())[1,3,5]


spliceも使えるかも。
453デフォルトの名無しさん:2009/09/17(木) 09:50:46
>>450
行けました。ありがとうございます、こんな書き方が出来るなんて…

>>452
カッコエエw
454デフォルトの名無しさん:2009/09/17(木) 09:54:55
>>447
それがオプション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];

みたいに出来る。これは文法に曖昧さがないため括弧は不要。
455デフォルトの名無しさん:2009/09/17(木) 11:37:03
>>454
解説ありがとうございます。別に括弧がイヤとかではないです。
自作関数では無いので、できれば関数の中身は変更したくなかったのです。
456デフォルトの名無しさん:2009/09/17(木) 22:24:46
ある配列に 25-001-2009 の形の 日-月-年データがあって、その配列を比較してその結果で置換したいんだ
この場合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はループを回すごとに値が変わります。
457デフォルトの名無しさん:2009/09/17(木) 23:10:48
>>456
配列をスキャンしながら、その配列自体を変更するのは、
とくにその結果で要素が増減する場合は、たいてい面倒くさい処理が必要になる。

おれはそういうときは別の作業用配列にデータを作っていって、
最後にもとの配列に書き戻すようにする。
458デフォルトの名無しさん:2009/09/18(金) 00:14:07
>>456
日本語でオケ
459デフォルトの名無しさん:2009/09/18(金) 02:06:39
>>456
ちょっと簡略化したけどこういう感じ?ようわからんけど

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日違いだよってのには対応しなくていいんだよな?
460デフォルトの名無しさん:2009/09/18(金) 12:37:10
こんなんなった。複数日は対応したが月またぎは知らんぞ。_で区切ってevalさせてるとこがミソだ。

#!/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]) . ", ";
}
461デフォルトの名無しさん:2009/09/18(金) 12:41:26
結果:
2009_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するだけだからそこんとこはなんとかしてくれ。
462デフォルトの名無しさん: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);
}
463デフォルトの名無しさん:2009/09/18(金) 14:12:39
DateTimeで処理する方がいいんじゃないかな?
@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;
464デフォルトの名無しさん:2009/09/18(金) 14:29:00
456だけど条件一部抜けてた……折角書いて頂いたのに申し訳ないです

〜で繋ぐのは年月同じ、日1日ずれのみ、他は全部,で繋いで、年月日全部同じは置換しない
20〜23のような時に、21や22と比較する場合は置換しない

置換する方の配列で置換される要素はループ1回につき1つだけです
どれとどれが比較されるかはループ1回ごとに別に作成した条件式で決定されています




ここの処理で一週間詰まってるんです……どうかお願い致します
465デフォルトの名無しさん:2009/09/18(金) 15:35:47
>>464
お前、もうこっち来い

Perlでリクに答えるスクリプトを作るスレ
http://pc12.2ch.net/test/read.cgi/tech/1086143976/

で、日本語がよくわからないから
入力:ほげほげ
出力:ほげほげ
って感じで具体例のパターン書いて
466デフォルトの名無しさん:2009/09/18(金) 17:42:31
>>456
こうか?


ある配列に 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

という場合はどうしたいかとか決まらないと実装できない。
467デフォルトの名無しさん:2009/09/18(金) 22:19:15
perlでcronみたいなスケジューリングを実現するモジュールってありますか?
468 ◆TWARamEjuA :2009/09/18(金) 23:16:55 BE:1742382-BRZ(10101)
crontab につらつらとファイル名を描けばよいのではないかと思うのであります。
469デフォルトの名無しさん:2009/09/19(土) 00:34:39
>>468
バッチジョブを管理したいのですが、
ジョブが結構増えてきてcrontabをこれ以上汚したくないなと。
YAMLとかでジョブ管理出来たら綺麗かなーと思ったのです…。
470デフォルトの名無しさん:2009/09/19(土) 04:55:47
Schedule::Cron
471デフォルトの名無しさん:2009/09/19(土) 05:45:05
>>464
25-001-2009 26-001-2009 27-001-2009 28-001-2009 29-001-2009 30-001-2009 01-002-2009
ときた場合どうなる?値は配列にだけ入ってるんだよな。ソートはされてるのか?

> 置換する方の配列で置換される要素はループ1回につき1つだけです
> どれとどれが比較されるかはループ1回ごとに別に作成した条件式で決定されています

ここ日本語に翻訳してくれ。それかソース晒してくれ。
俺かなり頑張ったんだが違いますごめんなさいだとかなり凹む。
472デフォルトの名無しさん:2009/09/19(土) 05:50:54
>>463
こんなんなるぞ。
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したりごにょごにょしてるのはこれ防ぐため。
473デフォルトの名無しさん: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
);
474デフォルトの名無しさん:2009/09/19(土) 07:02:20
この状態から、また追加する要素と追加される要素が1つずつ選ばれる。
例えば、

追加する要素:$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
);
475デフォルトの名無しさん: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」
が含まれているので何もしない。
476デフォルトの名無しさん:2009/09/19(土) 08:00:05
質問。
use Test::Simple tests => 3;
のように、「use パッケージ名」のあとに引数を指定できるようにしたいのですが、
useで指定した引数ってどうやって参照すればいいのでしょか。
(@_や@ARGVを試してみましたが、違うようです。)
よろしくお願いします。
477デフォルトの名無しさん:2009/09/19(土) 08:05:51
BEGIN { require Test::Simple; import Test::Simple tests => 3; }

とだいたい同じこと
478デフォルトの名無しさん:2009/09/19(土) 08:31:50
>>477
仕組みを聞いているんじゃなくて、方法を聞いているんですけど。

じゃあ質問を変えます。importの引数はどうやって参照できますか。
たとえば「import Test::Simple tests=>3」のようにあったとして、Test::Simpleパッケージから「tests=>3」を参照する方法を教えてください。

ググったところ、「importの引数は@EXPORTや@EXPORT_OKに指定したものでインポートしたいものを指定する役割をもつ」と
いうような説明があったのですが、この説明ではimportの引数を参照する方法がわかりませんでした。
479デフォルトの名無しさん:2009/09/19(土) 08:50:27
ふくしの大学?に通ってるんですけど!
package Unko;
sub import {
for(;;) { print @_; }
}
return 1;

use Unko unko => "unko";
480デフォルトの名無しさん:2009/09/19(土) 09:27:17
>>478
import呼ばれるんだからimport定義すればいいだけだろ。頭悪いの?
481デフォルトの名無しさん:2009/09/19(土) 09:37:11
Test::Simple->import('tests', 3);
イメージではこっちが分かりやすいかも。
482デフォルトの名無しさん:2009/09/19(土) 11:01:35
>>475
24〜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はもうちょっと勉強してからいじった方がいいと思うな。
483デフォルトの名無しさん:2009/09/19(土) 11:23:55
>>470
ありがとう。試してみます。
484デフォルトの名無しさん:2009/09/19(土) 11:31:16
>>478

Test/Simple.pmにimport関数を作る。

-- Test/Simple.pm --
sub import {
print @_;
goto &{Test::Builder::Module::import}; #=>本来呼ばれるべきimport関数に飛ばす
}

@_の第1引数にパッケージ名(Test::Simple)が入っており、それ以降に use で指定した引数
が入っている。
485デフォルトの名無しさん:2009/09/19(土) 12:12:54
>>484
CPANモジュールの中いじっちゃダメだろw
486デフォルトの名無しさん:2009/09/19(土) 12:34:31
>>485
そうだね。
ごめん、ごめん。

>>484でなく、以下を追加する。

BEGIN {
package Test::Simple;
sub import {
print "@_";
goto &{Test::Builder::Module::import};

}
}
487デフォルトの名無しさん:2009/09/19(土) 12:53:08
>>479
ありがとうございます!
import って関数なんですか?Perlの予約語だと思ってました。
477で
>import Test::Simple tests => 3
のような書き方をしているんですけど、Test::Simpleのあとにコンマがない呼び出し方って、
予約語じゃなくてもできるんですか。Perlすごい。
あと、importを自分で定義すると use Exporter 'import' とバッティングしてしまうようなんですけど、
これは仕方ないことでしょうか。

>>480
頭は悪いです。すみません。
importは予約語だと思ってたので、再定義するという発想はありませんでした。
Perlは特殊変数が多いから、useの引数もきっと特別な変数かなんかで参照できるのだろうと思ってました。
やっぱりPerlは頭がいい人のための言語ですね。低能には難しすぎる。
488デフォルトの名無しさん:2009/09/19(土) 13:08:52
>>486
数字のとこだけなら、1行で取り出せるよ。
ずっとソース読んでたw

>>487
> あとにコンマがない呼び出し方って、 予約語じゃなくてもできるんですか。
sub hello{print @_} hello 'a';
最初から何もしなくても出来るよ。

>バッティング
それをオーバーライドという。オブジェクト志向における正しい挙動。
仕方ないんじゃなくてそれで合ってる。

> useの引数もきっと特別な変数かなんかで参照できるのだろうと思ってました。
なかなかいい勘をしていらっしゃる。必ず参照できるとは限らないけどね。この場合なら数字んとこは取れるよ。
489デフォルトの名無しさん:2009/09/19(土) 13:09:34
指向な。
490デフォルトの名無しさん:2009/09/19(土) 13:25:29
オブジェクト歯垢
491デフォルトの名無しさん:2009/09/19(土) 13:26:05
>>488
数字はどこかのパッケージ変数に入ってるの?
492デフォルトの名無しさん:2009/09/19(土) 13:55:57
ハッシュのリファレンスがあるとき、
そのハッシュの浅いコピーのリファレンスを得る良い方法があれば教えてください。

my $foo = {};
my $bar = {%{$foo}};

とかいうのは思い付いたんですが、
もっとシンプルかつ明解で効率良くモダンでよりスマートでスタイリッシュな方法が
あればお願いします。
493デフォルトの名無しさん:2009/09/19(土) 16:45:47
>>491
ourな変数(オブジェクト)に入ってる。ソース読めば分かる。

>>492
日本語がよくわかんないです。
494492:2009/09/19(土) 17:24:49
>>493
すみません、 >>492 の後半は、
「ほかにもっとマシな、あるいは俺ならこうする、という方法があれば教えてください」
ということで、ひとつよろしくお願いします。
495デフォルトの名無しさん:2009/09/19(土) 20:11:31
>>494
いや、だから何をしたいのか分からないよその文章じゃ。
例もデリファレンスしてまたリファレンス作ってるだけだし
なにがやりたいんだか不明。
496デフォルトの名無しさん:2009/09/19(土) 21:45:09
>ハッシュの浅いコピーのリファレンス
意味不明
497デフォルトの名無しさん:2009/09/19(土) 21:55:00
>>464
>>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;
}
498デフォルトの名無しさん:2009/09/19(土) 21:55:44
>>497の続き

sub 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;
}
499デフォルトの名無しさん:2009/09/19(土) 22:06:09
>>484,486
ありがとうございます!import関数を定義して、その中でgotoを使えばいいんですね。
gotoとか知らなかったので、import関数を定義しただけでは立ち往生してしまうところでした。

>>488
>sub hello{print @_} hello 'a';
>最初から何もしなくても出来るよ。
関数名と最初の引数との間のコンマは省略できるのは知っています。
そうじゃなくて、import test::Simple tests=>3 のような書き方だと、第1引数と第2引数の間の
コンマも省略されていて、これは「何もしなくても出来る」ことはないからimportは予約語だと思ってました。

> それをオーバーライドという。オブジェクト志向における正しい挙動。
この場合はオーバーライドはまったく関係ないと思います。理由は継承関係を設定してないからです。
use Exporter 'import'; としただけでは継承関係は設定されませんよね?だからオブジェクト指向でいうオーバーライドとは関係ないんじゃないでしょうか。

>>482
>普通の人ならこの一言で一発で教えてやる気なくなるわな。
>なんで誰もちゃんと教えてくれないかわかってないんだろ。
>1つ勉強になったな。
ちゃんと教えてくれる親切な人は他にいたので助かりました。
あとimportが予約語じゃないというのはひとつ勉強になりました。
500デフォルトの名無しさん:2009/09/19(土) 22:20:44
スタックのような動作をする(もちろんそれ以外にも色々と機能がある)オブジェクトを作ろうとして
標準の関数にならい、pushとpopを定義しました。
その中で標準のpushとpopを使うために、main::pushやmain::popと書いたのですが
Undefined method &main::push などと言われてしまいます。
どのように書けば良いのでしょうか?
501デフォルトの名無しさん:2009/09/19(土) 22:30:41
>>499
これを実行すればわかるんじゃないかな?

package foo;
sub func { print "@_\n" }

func foo 1, 2;
foo->func(1, 2);
502デフォルトの名無しさん:2009/09/19(土) 22:41:31
>>499
こうすれば引数の内容を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";
503デフォルトの名無しさん:2009/09/19(土) 23:23:31
>500
(ユーザ定義でない)組み込み関数を使うならCORE::popとかCORE::pushとか。
504492:2009/09/20(日) 00:20:11
>>495
うーん、コピーしたハッシュのデータのリファレンスを得たいのです。

> 例もデリファレンスしてまたリファレンス作ってるだけだし
いや、そうはなってないと思うんですが。

my $foo = {};
printf "%s %s %s\n", $foo, \%{$foo}, {%{$foo}};
# => HASH(0x8103a48) HASH(0x8103a48) HASH(0x81038e0)

$foo をデリファレンスしてまたリファレンス作った \%{$foo} は $foo と同一オブジェクトですが、
{%{$foo}} の方は $foo とは異なるオブジェクトになっていると思います。
後者のように、値がコピーされた別のオブジェクトを得たいです。

>>496
浅いコピー (shallow copy) って普通に言わないですかね?
505デフォルトの名無しさん:2009/09/20(日) 01:23:54
> my $foo = {};
> my $bar = {%{$foo}};
> もっとシンプルかつ明解で効率良くモダンでよりスマートでスタイリッシュな方法が

いや、それで十分「シンプルかつ明解で効率良くモダンでよりスマートでスタイリッシュな方法」なんだが。
敢えて添削するなら括弧を1組み省略できる。

my $bar = {%{$foo}};
 ↓
my $bar = {%$foo};

この辺りのリファレンス/デリファレンス、複合データ構造に関しては、オライリーの「プログラミングPerl」を読めば最低限の基礎情報は書いている。
さらに深く知りたければ「実用Perlプログラミング第1版」を読めばいいよ・・・と言いたいが、日本のお馬鹿な書店は「第1版」とは別物の「第2版」(第1版の追補版であって、改訂版ではない)しか置いてないから残念でした。
まー図書館とかを探してくれ。
506デフォルトの名無しさん:2009/09/20(日) 06:24:05
>>499
import Test::Simple test => 3 は print FH 'hoge' と同じ構文
ちなみに new Hoge::Huga 'foo' と書けるけど、newはただの関数名だったりするのと同じ

それから別に @ISA にパッケージ名をぶちこむのだけが継承でないし、new するだけがオブジェクト指向ではない
もっと概念的なものだ

あと一言いわせてもらうと余計な一言が多い
507デフォルトの名無しさん:2009/09/20(日) 09:30:28
>>499
いや、そのスキルで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教えるの止めろ。
508デフォルトの名無しさん:2009/09/20(日) 09:36:50
goto LABEL ならともかく goto &SUB; くらい許してやれよ
509デフォルトの名無しさん:2009/09/20(日) 09:38:30
>>503
出来ました。COREというパッケージがデフォルトで読まれているのですね。
手元のラクダをよく読んだらCORE擬似パッケージと書いてありました…読み込みが足りなかったようです。
精進します、ありがとうございました。
510デフォルトの名無しさん:2009/09/20(日) 09:39:41
>>502
ああ、同じ人か。普通のことのように書くなよ。素人相手にCPANモジュールの名前空間汚す
ようなdirtyなハック教えて「できるようになるよ。 」じゃねーだろ。どんだけ無邪気だよ。
大規模開発の末端プログラマだったらどうすんだ?相手のレベルみて話しろ。他が迷惑するだろ。
Test::Simpleの挙動が変 -> Test::Simpleを再インストール -> 状況変わらず の不条理ループ開始。
511デフォルトの名無しさん:2009/09/20(日) 09:40:12
たしかに 初期段階でgotoに触れてしまうと、全部そっちに逃げる思考になりがちだかんな
512デフォルトの名無しさん:2009/09/20(日) 09:42:49
>>508
極力避けるべき方法だし、この人はsubとgotoの違いほとんど分かってないだろ。
そんな人に教えちゃダメだ。多分ここがなぜsubじゃなくgotoか説明できないと思われ。
513デフォルトの名無しさん:2009/09/20(日) 09:56:19
>>511
だろ?俺はこの15年でgotoなんかプロダクトに使ったことなんかないぞ。
汚いことするからgotoが出てくる。その辺は分かるだろ?
例えばCatalystは61ファイル中1回もgoto使ってないぞ。
CPANを見渡すと、スピードがネックになるようなものや、コアな部分に触れるようなモジュールにgotoが多い。
でもYAMLで1回、Mooseで8回だ。素人が使うもんじゃないことくらいわかるはず。

>>478
> たとえば「import Test::Simple tests=>3」のようにあったとして、Test::Simpleパッケージから「tests=>3」を参照する方法を教えてください。

この時点で「普通はできません」と答えなかった住人の責任でもあるな。俺も含め。
514デフォルトの名無しさん:2009/09/20(日) 10:21:29
open(NEWFILE, ">shinki.html") ;

で自動的にshinki.htmlを作ってに書き込むようにしてるんだけど
下に自動的にフォルダも作って test/shinki.html
に書き込むようにするにはどう書けばいいですか?
515デフォルトの名無しさん:2009/09/20(日) 10:40:54
CPANモジュールの名前空間を汚さないエレガントな方法が知りたい
516デフォルトの名無しさん:2009/09/20(日) 11:06:39
>>515
名前空間は汚さないが残念ながらエレガントな方法はない。また素人が真似するといかんので、
ヒントはTest::Builderが大事なものをourしちゃってるとこだ。ソース見れば一発で分かる。

正直相手が素人だと分かりきってるのに>>502のような方法を提示する人の気が知れん。
○○に刃物って言葉があるだろ。この素人さん、今後もつまらんことで他人のモジュール
の内臓いじくりまわすに100ペリカ。困ったらgotoもすぐ発動するだろうな。
517デフォルトの名無しさん:2009/09/20(日) 11:09:18
立派な正義感(笑)がいるときいて
518デフォルトの名無しさん:2009/09/20(日) 11:17:58
>>517
正解が出ないからって拗ねるな。
519デフォルトの名無しさん:2009/09/20(日) 11:51:51
しつもん: 所持金0ですけど、新幹線で東京から博多まで行けますか?

かいとう: 改札口を突破して猛ダッシュしろ

まいらのやってることは、こんなレベル
520デフォルトの名無しさん:2009/09/20(日) 12:02:03
>>505
バカなのはオライリーだろ。
中身が全然違う本を同じ題名で出す意味がない。
521デフォルトの名無しさん:2009/09/20(日) 12:09:28
>>514
おれはそういうとき自力でフォルダを作ってるけど。他に方法あるのかな

my $filepath = "test/shinki.html";
use File::Path;
use File::Basename;
File::Path::make_path( File::Basename::dirname($filepath) );
open(NEWFILE, ">$filepath");
522デフォルトの名無しさん:2009/09/20(日) 12:28:34
Activeperl5.10.1,PAR-0.994,PAR-Packer-0.991を使用して
exeファイルを作成した際
元のスクリプトにuse Encode;を使用していると
exeファイル実行時に

プロシージャエントリポイントPerl_croak_xs_usageがダイナミックリンクライブラリperl510.dl
から見つかりませんでした

とerrorが出るのですが解決方法(エラー文自体理解できてませんが)はありますでしょうか?
523デフォルトの名無しさん:2009/09/20(日) 13:12:38
>>519
はげどー。

>>521
それが模範回答じゃないかなぁ。まあ他にモジュールがあるかも知れんが。
それか
$filepath ~= s#([^/]+)$##;
$filename = $1;
system("mkdir -p $filepath");

って良い子は真似すんなよ。
524デフォルトの名無しさん:2009/09/20(日) 20:17:07
あとはPath::Class使う手もあるか

use Path::Class::Dir;
my $d = Path::Class::Dir->new('test', 'foo', 'bar');
$d->mkpath;
my $f = $d->file('shinki.html');
my $fh = $f->openw;
525デフォルトの名無しさん:2009/09/21(月) 06:32:33
>>4を見て思ったのですが、

use utf8;
use open IO => "encoding(cp932)";
use open ":std";
use Encode;

でもいいんですかね?
526デフォルトの名無しさん:2009/09/21(月) 07:45:26
>>523
> それか
> system("mkdir -p $filepath");


mkdir $filepath;
527デフォルトの名無しさん:2009/09/21(月) 10:49:54
>526
それだと深いディレクトリ作れないだろ。./test/が存在しないときに./test/test2/test3/とか作れない。
528デフォルトの名無しさん:2009/09/21(月) 11:48:00
なんのためにpオプション付けてると思ってんだよ
529528:2009/09/21(月) 11:48:41
とても恥ずかしい
530デフォルトの名無しさん:2009/09/21(月) 11:56:45
>>525
一箇所コロンが抜けてる……けど、無くても動くっぽい?
use open IO => ":encoding(cp932)";

ファイルのエンコーディング設定も入るから、そこは注意。
531デフォルトの名無しさん:2009/09/21(月) 13:49:14
system関数を使うのと、system関数の引数をWindowsコマンドプロンプトで直接実行したものの比較

system('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 関数とコマンドプロンプトでは、若干の違いがあるんだね。
532デフォルトの名無しさん:2009/09/21(月) 14:16:06
>>531
Windowsでmkdirに-pオプション付けると
"-p"って名前のフォルダが作られない?
うちでは作られた
533デフォルトの名無しさん:2009/09/21(月) 15:15:24
>>530
コロンが抜けていたのは自分のタイポですね。
すみません。

open.pmを見てみると、

$layer =~ s/^://;

と、コロンを消してから処理をしているように見えます。
結局、コロンはあってもなくてもいいのかな?
534デフォルトの名無しさん:2009/09/21(月) 18:02:29
>>533
付いてなくても動くかも知れないけど、PODでは付けることになってるし、
明文化されてない部分だから、付けといた方がいいと思う。
535デフォルトの名無しさん:2009/09/21(月) 20:50:57
>>527-529
> >526
> それだと深いディレクトリ作れないだろ。./test/が存在しないときに./test/test2/test3/とか作れない。

> $filepath ~= s#([^/]+)$##;
> $filename = $1;
> system("mkdir -p $filepath");


どーなんだろー?
536デフォルトの名無しさん:2009/09/21(月) 22:11:09
>>>535
言う前にやってみろよw
UN*X標準のmkdirはデフォルトでは1つのディレクトリしか作れないから。
537デフォルトの名無しさん:2009/09/22(火) 00:02:13
Windows 2000 や XP だと中間ディレクトリが作られるね。
外部コマンドを利用する場合は特に、利用している OS などの環境を明確にしないと、
延々と話が噛み合わないで平行線を辿ると思う。

しかし、 >>531 を見ると、まあ言われてみれば納得できる挙動ではあるんだけど、
ActivePerl にはかなり黒魔術が入ってそうだねえ。

てか、折角 Perl はそういう OS の差異を吸収する層たり得るソフトウェアなんだから、
Perl でできることは極力 Perl でやるべきかと。
538デフォルトの名無しさん:2009/09/22(火) 09:08:48
>>534
そうですね
539デフォルトの名無しさん:2009/09/22(火) 13:08:17
Perl TkのTextウィジェットを使って
文字列の入出力をする方法はどのようにするのでしょうか?
Entryウィジェットを使ったサンプルはWeb上から見つけたのですが、
Textウィジェットを用いたものはないもので。。。


540デフォルトの名無しさん:2009/09/22(火) 16:51:57
>>539
$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 辺りを参照で。
541デフォルトの名無しさん: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",);
}
という具合の書き方をいつもしているのですが
なんだか重複した記述が多いし、もうちょっとスマートな書き方がないものかと
いつもうんざりしています。
こういう場合の定石パターンってなにかあるのでしょうか。
皆さんどうコーディングされてます?
542デフォルトの名無しさん:2009/09/22(火) 21:27:52
my %args = (ARG_0 => 'a', ARG_1 => 'b');
$args{ARG_2} = 'c' if CONDITION;
my $obj = Klass->new(%args);
543 ◆TWARamEjuA :2009/09/22(火) 21:47:01
my $obj = Class->new(ARG_0 => "a", ARG_1 => "b", /condition/ ? ARG_2 => "c" : undef => undef);
って通るのかしら?
544デフォルトの名無しさん:2009/09/22(火) 22:03:42
>>541
重複しないことが必ずしもスマートとは限らない。
現状のままの方が読みやすい気がする。
545デフォルトの名無しさん:2009/09/22(火) 22:19:16
>>542
若造がいきがってムチャしてる、って感じがするな。
後々のことを考えてるのかな。
その場かぎりの使い捨てコードならソレでもいいかもしれないけど。
546デフォルトの名無しさん:2009/09/22(火) 22:48:50
my @params = ( ARG_0 => "a", ARG_1 => "b", ARG_2 => "c" );
my $obj = Class->new( /condition/ ? @params[0..3] : @params[0..5] );
547デフォルトの名無しさん:2009/09/22(火) 23:09:07
>>546
もういいからやめろ
548デフォルトの名無しさん:2009/09/22(火) 23:32:46
>>541
本当にARG_2がoption的な要素なら、
my %opt = (
 ARG_2 => 'c'
) if /condition/;
my $obj = Class->new(
 ARG_0 => "a",
 ARG_1 => "b",
 %opt,
);
って書き方するかなぁ。
そうじゃないなら>>544の言う通り、そのままの方がメンテしやすい
549デフォルトの名無しさん: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
550 ◆TWARamEjuA :2009/09/23(水) 01:28:09
1200件もhitするのか。。。
ひとまずRock54してくるです。。。
551デフォルトの名無しさん:2009/09/23(水) 07:56:28
コードゴルフ用の問題みたいだね
552デフォルトの名無しさん:2009/09/23(水) 13:49:46
>>541
もし毎回同じパラメータ渡してるなら、サブルーチンの受け取るパラメータを直す。
それが難しければ、ラッパーをかます。
ベタウチはバグの元。
プログラム書法にも書かれてる。
「汚れ仕事は機械にやらせよう」

ただし、同書は冒頭で戒めてるので注意。
「わかりやすく書こう。うますぎるプログラムはいけない」
根拠は可読性とメンテナンス性。
553デフォルトの名無しさん:2009/09/23(水) 17:32:22
こっち↓

my $data = do{local $/; <$fh>};

と、こっち↓

read $fh, my $data, -s $fh;

では、どちらを使うのがいいのでしょうか?
554デフォルトの名無しさん:2009/09/23(水) 17:48:49
>>553
どっちもだめ。
【理由】意図不明

555デフォルトの名無しさん:2009/09/23(水) 17:52:10
どっちでもいいんじゃね
効率はやや上のほうがよさそうだけど。下はファイルサイズ調べに行かなきゃならんわけだし
556デフォルトの名無しさん:2009/09/23(水) 18:24:04
>>554
これを意図不明って、絶望的にPerlのスキルが足りないんじゃね?
557デフォルトの名無しさん:2009/09/23(水) 19:58:27
tp://www1.axfc.net/uploader/Sc/so/28995.zip&key=vip
ネットの勉強がてらに作ったモノです
友人に見せたら汚いコードだと言われました
どこあたりがおかしいのでしょうか
558デフォルトの名無しさん:2009/09/23(水) 21:09:19
>>555
ベンチマークを取ってみた。
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%     --
559デフォルトの名無しさん:2009/09/23(水) 21:12:42
>>557
こんなもんじゃないの。
少なくとも昔の2chのコードより100倍まし。
560デフォルトの名無しさん:2009/09/23(水) 21:12:51
へぇー。 -s & readの方がはやかったか〜
まぁ、言われてみれば
読み込む量があらかじめわかってりゃそりゃバッファの確保も楽(っていうか一発?)だしそりゃ速いわな
561デフォルトの名無しさん:2009/09/23(水) 21:31:51
ついでに、sysreadもベンチを取ってみた。
条件は、>>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%    --
562デフォルトの名無しさん:2009/09/23(水) 21:33:02
activeperl のverで
5.8.9.826 と 5.10.1.1006 での差違って
主に何です? ご存じの方いませんか
563デフォルトの名無しさん:2009/09/23(水) 21:41:54
>562
http://www.activestate.com/activeperl/features/
のActivePerl 5.10 Highlightsは見たの?
564デフォルトの名無しさん:2009/09/23(水) 22:15:20
binmode $fh; をかましてバイナリ読み込みにすると、差が縮まった。

Benchmark: 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%    --
565デフォルトの名無しさん:2009/09/23(水) 23:23:06
この方が分かりやすい。

my $data=`cat $file`;
566デフォルトの名無しさん:2009/09/23(水) 23:53:34
どうでもいいんだが、

#=>

こいつがちんぽに見えてしょうがない
どうにかならんか
567デフォルトの名無しさん:2009/09/24(木) 00:36:07
毛を剃れば=>になる
568デフォルトの名無しさん:2009/09/24(木) 02:08:46
perlでwmvの再生時間を取得したくて、調べていて
Image::ExifToolというモジュールで出来るようだということがわかりました。
具体的なソースコードがないので、どのようにwmvの再生時間を取得すればいいのか悩んでいます。
よろしければ再生時間の取得方法が載っているサイトなど教えていただけたらと思います。
569デフォルトの名無しさん:2009/09/24(木) 02:40:20
ソースコードが無いってなんで?
これでしょ?
http://search.cpan.org/~exiftool/Image-ExifTool-7.89/lib/Image/ExifTool.pod
570デフォルトの名無しさん:2009/09/24(木) 10:29:03
cpan をユーザーディレクトリで運用したいです
書かなければならないとする設定が説明サイトによってまちまちなんですが、
最新版ではどう記述するのが本当なんですか?
571デフォルトの名無しさん:2009/09/24(木) 13:33:50
以下の2つの結果が違うのですが、

print join(',', (1,'','','',2)), "\n";
print join(',', (1,,,,2)), "\n";

perlでは,,,というのはどういう解釈がなされるのでしょうか?

--------
JavaScriptみたいな結果を期待していたのですが・・。
alert([1,,,,2].join(',')); // -> 1,,,,2
572デフォルトの名無しさん:2009/09/24(木) 14:09:42
>>571
http://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 です。以下同様。) この暗黒面を使うよう勧めているわけではありません。
573デフォルトの名無しさん:2009/09/24(木) 15:09:05
>>572
ありがとう御座います。ズバリです!
納得いきました。
574デフォルトの名無しさん:2009/09/24(木) 16:07:02
>>564
バイナリリードにすると差がなくなるのは、<$fh>方式では、バイナリリードだと確保するバッファーが
大きくなるからでしょうか?
575デフォルトの名無しさん:2009/09/24(木) 16:34:29
多重定義されたメソッド(関数)で、2つ上のメソッドを呼び出すにはどうすればいいのでしょうか?

package 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を期待
576デフォルトの名無しさん:2009/09/24(木) 17:36:56
shift->Super::foo とか Super::foo(shift) じゃだめ?絶対的な指定になっちゃうけど。
二つ上っていう相対的な呼び出し方はわかんね
っていうか、そういうことがやりたいケースなんてあるかな?ちょっと興味あるアル
577デフォルトの名無しさん:2009/09/24(木) 18:11:57
ディスパッチャーを自作すればいけるかー。evalでもいいけど

package 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") }
578デフォルトの名無しさん:2009/09/24(木) 18:22:06
>>576-577
ありがとうございます。

単に勉強中の者でして、任意の上の階層のメソッドを呼び出す命令があるのかなーと
思ったしだいです。
579デフォルトの名無しさん:2009/09/24(木) 19:28:52
>>578
そういう使い方では継承の意味がないのでは?
580デフォルトの名無しさん:2009/09/24(木) 23:02:56
>>579
深く突っ込まれても、まだ勉強の途中なのでよくわからんです。
SUPER::の項目を見てて、そういう命令があるのかなーと思っただけなんで。
581デフォルトの名無しさん: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]
しか出力されなく困ってます。どなたか知恵を御貸しください……
582デフォルトの名無しさん:2009/09/25(金) 02:07:37
>>581
$list[m] .= "〜" . $a; (※ 



$list[m] = $list[m] . "〜" . $a; (※ 
583デフォルトの名無しさん:2009/09/25(金) 09:06:19
念のために確認しておくが

× $list[m]
○ $list[$m]

というオチじゃないだろうな?
584570:2009/09/25(金) 09:11:01
あら、みんなシステムワイドで使ってるん?
ユーザーディレクトリで運用してる人は稀?
585デフォルトの名無しさん:2009/09/25(金) 09:28:16
>>584
ローカルにtar.gzからlocal::libをインストールして、あとはその設定使ったcpanでインストールしてるけどそういう意味?
586デフォルトの名無しさん:2009/09/25(金) 11:55:47
変数名を動的に指定して、その変数の値をとってくることはできますか。
PHPでは
$x = 10;
$var = 'x';
echo $$var; // 10 が表示される
ということができるんですけど、Perlで同じことをするにはどうしたらいいですか。
587デフォルトの名無しさん:2009/09/25(金) 11:56:24
ユーザー権限でcpan shell使えば、ユーザーディレクトリにインストールされない?
588デフォルトの名無しさん:2009/09/25(金) 11:59:10
>>587
されるんだったらこのへんのブログ記事はみんな仕込みだな
ttp://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=makepl_arg&num=50
589デフォルトの名無しさん:2009/09/25(金) 12:10:38
>>586
同じく$$varでいいけど、そういうプログラムは行儀悪いからやめとけ。
590デフォルトの名無しさん:2009/09/25(金) 12:19:44
sage
591デフォルトの名無しさん:2009/09/25(金) 12:24:12
>>583 あー確かに$list[$m]になってましたね、申し訳ないです
$mは別の所で既に求めてあり、変わることのない定数ですが……

printで挿入動作のすぐ後で確認してみた時はうまく挿入されているのですが
次のループの時にはまた初期状態に戻ってしまっているようです……
592デフォルトの名無しさん:2009/09/25(金) 12:25:21
>>591
だったらループを晒さないと。
593587:2009/09/25(金) 12:28:05
>>588
うーん、一度
cpan> o conf init
で再設定してみては?
594デフォルトの名無しさん:2009/09/25(金) 14:21:52
>>592 すいません、ループ自体は他の動作も混ざってるので200行近くあるんです……
595デフォルトの名無しさん:2009/09/25(金) 14:27:53
>>594
ここに貼り付ければおk
http://codepad.org/
596デフォルトの名無しさん:2009/09/25(金) 14:34:03
>>591
だったら一行一行チェックしないと
597デフォルトの名無しさん:2009/09/25(金) 15:31:30
>>594
「他の動作」を削っていって、不具合の再現する最小ケースのコードを作ってみ。
598デフォルトの名無しさん:2009/09/25(金) 16:19:27
> printで挿入動作のすぐ後で確認してみた時はうまく挿入されているのですが
> 次のループの時にはまた初期状態に戻ってしまっているようです……

この人に足りないのは、「デバッグする」ということ。
いちおうすぐ後に print文を入れてみたのはエライが
その後で行き詰っているな。
もっと print を入れろ。たくさん入れろ。しつこいくらい入れろ。
print でコードがイッパイ埋め尽くされるまで入れろ!
そうすればどこで変になったか特定できるはずだろ。
599デフォルトの名無しさん:2009/09/25(金) 16:25:19
print でコードがオッパイ埋め尽くされるまで入れろ!だと!?

ってレスされることを狙ったよな?よな?
600デフォルトの名無しさん:2009/09/25(金) 18:32:10
>>589
行儀よく

${$var}


あれリファレンスと同じだ
601デフォルトの名無しさん:2009/09/25(金) 18:35:37
>>581
ループごとに変数初期化してる気配
602デフォルトの名無しさん:2009/09/25(金) 19:32:41
>>594
perl以前にそもそもな違和感を覚える。

200行ものループがあるのは、明らかにおかしい。
一関数でも200行はおかしい部類に入るのに、
それがループともなると、さらに話もデバッグも難しくなる。
603デフォルトの名無しさん:2009/09/26(土) 02:12:34
perl ならループの中身が200行くらいあっても不思議じゃないだろ
604デフォルトの名無しさん:2009/09/26(土) 02:29:33
絶対にbetter wayが存在するだろ
605デフォルトの名無しさん:2009/09/26(土) 03:03:05
>>603
不思議じゃないが、おかしい。
「perlなら」とか言い訳してる場合じゃなくおかしいものはおかしい。直すべき。
606デフォルトの名無しさん:2009/09/26(土) 11:33:59
プログラミングする目的は綺麗なコードを書く事じゃないし
行儀のいいコードを書く必要性は場合よる

LLであるPerlならそういうケースに見回れる可能性は低いから
むしろ「おかしい」って突っ込みの方が自分本位で正当性に欠ける気がするんだよ!
607デフォルトの名無しさん:2009/09/26(土) 12:11:35
プログラムは本来動けばいい物でしょ

そこに、保守性、生産性という需要があれば可読性のあるソースを
速度やコンパクトさを求めるなら、可読性や保守性は両立できない

だからそもそもソースの書き方に正しいとか間違いなんて言うのは野暮
608デフォルトの名無しさん:2009/09/26(土) 12:37:30
>>607
些細なバグを直しやすくするアドバイスが
そんなに気に入らないか?

下手くそな書き方で無駄な時間潰すより
素直に耳を傾けたほうがよほどいいと思うが?
609デフォルトの名無しさん:2009/09/26(土) 12:47:48
「速くする前に、まず正しくしよう」

「だめなプログラムを修正するのはやめて、全部書き直そう」
610デフォルトの名無しさん:2009/09/26(土) 12:48:08
>>607
Damian Conwayを真っ向から否定ですね、わかります
611デフォルトの名無しさん:2009/09/26(土) 12:48:12
>>606 >>607
はぁ?
そんなの綺麗で可読性のあるコードを書かない言い訳になんかならんよ。
実際「動けば良い」じゃ済まないから現に >>581 みたいな質問が出てるんじゃんよ。
「おかしい」ったら「おかしい」んだよ。
612デフォルトの名無しさん:2009/09/26(土) 12:59:02
>>606-607
思考が若いねぇ。いったい何処で習った手法なのかなー? 趣味のプログラム書き殴りだけで、
それなりの規模の保守運用を伴う実務経験無さそうだねぇ
613デフォルトの名無しさん:2009/09/26(土) 13:00:50
プログラミングの鉄則


1 動くこと
2 正しく動くこと
3 上記を満たすためにわかりやすく書くこと

614607:2009/09/26(土) 13:06:36
一応SEだからソース管理するスタンスで言えば
綺麗で可読性のあるコードを書くのは反対しないよ

だがここはあくまで書き方の自由度の高いPerlのスレであり
大規模プロジェクトで生産性、保守性を目的にしたソースを第一とするとはどこにも書いていないと言いたいだけ
615デフォルトの名無しさん:2009/09/26(土) 13:10:05
そうかそうか
616デフォルトの名無しさん:2009/09/26(土) 13:10:39
>>607 の理論は正しくないと思うけど
>>608
この問題に対する、「分割や抽象化されてない巨大なコードはバグりやすいよ」ってアドバイスならいいけど、
>200行ものループがあるのは、明らかにおかしい
みたいに、プログラミング一般に適用可能な意見とするのは違うなーと思った
こういう考えをむやみに初心者に植え付けるのは、コーディングオナニーの原因にもなるしね
常に必要なことではない、ってことを理解してもらうために発言したんだよ
617607:2009/09/26(土) 13:12:57
>>612
習うと言われても
私の若い頃は工業高校なんかでBASICかFORTRAN、アセンブラしか教えられていなかったから
実務経験で培った知識しか無い
これ以上はスレ違いだし606を擁護するのはやめとく
618デフォルトの名無しさん:2009/09/26(土) 13:35:06
> みたいに、プログラミング一般に適用可能な意見とするのは違うなーと思った
> こういう考えをむやみに初心者に植え付けるのは、コーディングオナニーの原因にもなるしね
いいや、プログラミング一般に適用可能だし、むやみに初心者に植え付けるべき考えだよ。
ところで「コーディングオナニー」って何?

特に >>581 の場合なんかは、どうせスコープを見誤ってバグってるんだろうから、
効率とか云々は一旦棚に上げて、 use strict; use warnings; した上で、
200行のコードをどんどん関数に分割していけば、まずいところはすぐ見つかると思う。
619デフォルトの名無しさん:2009/09/26(土) 13:45:27
保守性も、動くこと優先も、両方考慮すべきことだよ

多人数開発だったり、サポート期間の長いソフトだと前者の重要性が
高くなるだけで、別にそれが全てじゃない。

Perl の場合、たいてい動けばよいの方の比重が高くなると思うな
まあ、どうでもいいけど
620デフォルトの名無しさん:2009/09/26(土) 13:49:02
200行のループしかないプログラムだったり
621デフォルトの名無しさん:2009/09/26(土) 14:11:14
>>618
>コーディングオナニー
ああ、リアルで使っても結構通じちゃうから、同じ気持ちで使ってたよ。気付かなくてごめんね

意味だけど、本来の目的や本質は疎かにして、自分が正しいと信じてることを機械的に行うことだよ
病的なまでにコードを整理したり、やたらリファクタリングに時間をかける人がいるんだよ。文脈におけるメリットも考慮せずに
(実を言うと、昔は自分もそうだったしね)

コードを整理することが保守性やメンテナンス性を高めることに繋がるという事に異議は無いよ
ただ、そういうことが常に求められているわけではないので、
その手段である「綺麗なコードを書くこと」は、プログラミング一般に適用出来ない。そういうこと

>>619
同意
622デフォルトの名無しさん:2009/09/26(土) 14:13:57
s/機械的/盲目的/
623デフォルトの名無しさん:2009/09/26(土) 15:08:40
200行もあるコードにおかしさを嗅ぎつけるってのは
プログラマにとって身に付けるべき重要な嗅覚だろ。
そんな嗅覚の未発達な初心者に対しては、
ちゃんとこれはおかしいと諭してあげるべきじゃないのか。

200行もあるが故に見通しが悪く自力で問題解決できなくなり、
200行もあるが故にコード片を晒すこともできずこれ以上の助言ももらえない、
そんなにっちもさっちもいかなくなった質問者に対して、
200行のコードでも動けば問題ない、ってのがアドバイスになるのか?おかしいだろ。
624デフォルトの名無しさん:2009/09/26(土) 15:13:44
やってればセンスある奴は早い時期に勝手に気づくさ。
気づかないのはセンスナッシングで他のことにも気づかないってことで
625デフォルトの名無しさん:2009/09/26(土) 15:50:33
よそでやれ
626デフォルトの名無しさん:2009/09/26(土) 15:57:03
いや、ここでやる(`・ω・´)
627デフォルトの名無しさん:2009/09/26(土) 15:58:19
ハゲ・ズラ板でやれ
628 ◆TWARamEjuA :2009/09/26(土) 16:18:45 BE:1634235-BRZ(10101)
つ 夢・独り言@2ch掲示板 http://changi.2ch.net/yume/
629デフォルトの名無しさん:2009/09/26(土) 16:24:52
>>628
行ってらっしゃーい
630デフォルトの名無しさん:2009/09/26(土) 18:08:27
> 綺麗で可読性のあるコード

これを言い出すとモメる原因になる。
いったい<誰>にとって綺麗で可読性のあるコードであるか。
おまえか?おれか?
主観を押し付けるなよ。
631デフォルトの名無しさん:2009/09/26(土) 18:26:43
>>630
そんな中二病丸出しの発言する奴は無視するだけでしょ。
632デフォルトの名無しさん:2009/09/26(土) 19:49:32
「綺麗さ」に関して標準の測定法が無いから、主観の問題になる。
というか、ズルや政治的意図で歪められたりする。

perltidyなどのフォーマッタを通したコードが綺麗で良いとすると、
複雑さなどは計算に入れないのか、などなど。
一度は通っておくといい道。
633デフォルトの名無しさん:2009/09/26(土) 21:16:08
mecabについての質問です。

文字列をmecabに入れる際にeuc-jpにエンコードし、名詞だけを抽出し
デコードしてブラウザに出力させようとすると、大半は通常通りに取得できますが、一部の単語が文字化けします。
調べてみたら漢字に限らず、ひらがな・カナ文字でも文字化けしています。

考えられる原因はなんでしょうか?OSはfedora9です。
634デフォルトの名無しさん:2009/09/26(土) 21:49:44
ここでやる(`・ω・´)

(´;ω;`)ブワッ
635デフォルトの名無しさん:2009/09/26(土) 22:12:43
(´;ω;`;:..

(´;ω;;:;:::...

(´;;:;::;..
636デフォルトの名無しさん:2009/09/26(土) 22:14:07
(´;;:;::;..

(´ ∀;;:;:::...

(´ ∀`)
637デフォルトの名無しさん:2009/09/27(日) 00:08:32
PERLでのImage Magickの使い方について教えてください

画像ファイルを読み込んだあと、画像のプロパティ(タイトル、標題、コメントなど)を
セットしてから出力することはできるでしょうか。
638デフォルトの名無しさん:2009/09/27(日) 01:43:41
>>637
もちろんです。

man Imagemagick
639デフォルトの名無しさん:2009/09/27(日) 05:53:38
(´・ω・`) 。。゚o。○

(´・ω 。o。゚。o○

。。o。o゚O゚。o゚o○。o゚
640デフォルトの名無しさん:2009/09/27(日) 08:07:26
2chにコードを貼り付けるとき、インデントを全角スペースにしたりしますよね。
みなさんはそれをどのように変換してますか?

エディタの機能でうまくできるものなのでしょうか?
641デフォルトの名無しさん:2009/09/27(日) 09:25:39
s/\t/  /g;
642デフォルトの名無しさん:2009/09/27(日) 09:57:50
>>641
それじゃダメだろ
643デフォルトの名無しさん:2009/09/27(日) 11:16:51
>>640
Perlで「各行の先頭から続く複数の空白を、同じ数の&amp;nbsp;に変換して出力する」コードを書けば良いじゃない
644デフォルトの名無しさん:2009/09/27(日) 11:18:24
あれ?表示が変だな
あんど、えぬ、びー、えす、ぴー、せみころんね
645デフォルトの名無しさん:2009/09/27(日) 11:29:21
&nbsp;
646デフォルトの名無しさん:2009/09/27(日) 11:41:45
すべてのスペースを&nbsp;に変換すっと、今度は文字数制限にひっかかっかるやもやがな
s/(?<=^|\G)[ \t]/&nbsp;/mgx
647デフォルトの名無しさん:2009/09/27(日) 11:49:50
どうでもいい議論が続いてるな。エディタで置換すればいいだろ
>>641でいいと思うけど。
いつも半角スペース2個を全角1個にしてるからvimなら%s/ / /gcで置換できる
648デフォルトの名無しさん:2009/09/27(日) 12:19:15
641じゃデコボコになるだろ・・
649デフォルトの名無しさん:2009/09/27(日) 12:28:43
>>641
今どきハードタブ使ってるひとはあまりいないんじゃない?
650デフォルトの名無しさん:2009/09/27(日) 13:04:24
Damian Conway先生に怒られるしね
651デフォルトの名無しさん:2009/09/27(日) 13:11:40
>>649
あなた、井の中の蛙さん?
652デフォルトの名無しさん:2009/09/27(日) 13:49:34
そうだけど何か? ゜_゜
653デフォルトの名無しさん:2009/09/27(日) 16:07:09
かわいそうに
654デフォルトの名無しさん:2009/09/27(日) 17:07:39
>>653なんか、ダッシュ村のため池の蛙なんだぜ。

655デフォルトの名無しさん:2009/09/27(日) 19:30:25
来月にリャマ本の日本語第5版くるんだね
中身結構かわってるかなあ
656デフォルトの名無しさん:2009/09/27(日) 22:27:04
>>646
コード載せた場合、先に引っかかるのは
大概行数制限のほうだと思う
657デフォルトの名無しさん:2009/09/28(月) 21:50:38
さがってる
658デフォルトの名無しさん:2009/09/28(月) 23:07:51
下がってても落ちないよ
659デフォルトの名無しさん:2009/09/30(水) 00:14:06
s!>(back|return)<!>戻る<!si;

これやるとエラーダイアログが出るんです。

問題が発生したため、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 はウンコですか?
660デフォルトの名無しさん:2009/09/30(水) 12:42:56
>>659
デリミタは#とか括弧類にしてくれ。

あとPerlのせいにすんな。

FreeBSDやLinuxの5.10.1ではそのコードは普通に動くから、
5.10.1がウンコなんじゃなくてActivePerlが正規表現モジュールか何かの
Winへの移植に失敗してるんだろ。
5.10.1リリース後一ヶ月以内のスピード移植版に文句言うとか何様かと。
修正リリースが出るだろうからバグ報告でもして座って待ってろ。
661デフォルトの名無しさん:2009/09/30(水) 13:48:36
=~で全角数字だけの文字列だったらを取り除くにはどうすれば良いのでしょうか?
ttp://ash.jp/code/unitbl21.htmを参考にしようと思ったのですが、どう書けばよいか分かりません。
お願いします。
662661:2009/09/30(水) 13:50:08
使用している文字コードはutf-8です。
663デフォルトの名無しさん:2009/09/30(水) 13:58:29
s/[0123456789]//g
みたいな?
664デフォルトの名無しさん:2009/09/30(水) 15:40:47
>>661
s/^[0-9]+$//
665デフォルトの名無しさん:2009/09/30(水) 17:38:18
>>659
んー、WindowsXPで普通に動く。
666デフォルトの名無しさん:2009/09/30(水) 19:58:03
XSを勉強中です。
長さを指定して文字列を作成し、あとから文字を詰め込みたいのですが、やり方がわかりません。
自分で試したのはこんなコードです。

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の文字列が返されるだけでした。
おしえてえらいひと。
667デフォルトの名無しさん:2009/09/30(水) 19:59:37
失敗した。インデントを全角空白にしました。

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

よろしくお願いします。
668デフォルトの名無しさん:2009/09/30(水) 20:03:39
なんかC++みたいだな
669デフォルトの名無しさん:2009/10/01(木) 07:53:07
>>668
XSが何か分かってないだろ。
ちゃんとPerlの質問だ。

質問にも答えたいが朝食を作らないと。
670デフォルトの名無しさん:2009/10/01(木) 09:24:05
>>667
SvPOK_onlyかSvPOK_only_UTF8が必要なんじゃね?
671デフォルトの名無しさん:2009/10/01(木) 09:26:25
>>666
あーちなみに文字列の突っ込み方は合ってるし、
そっち方面の質問がメインならC/C++のスレに行きな。ちなみに勘だが、

SV *
hoge()

ここがおかしいんじゃないか?SV *返すことってできたっけ?
インクルードファイルやMODULE行がないのは端折ってるだけだよな?
672デフォルトの名無しさん:2009/10/01(木) 09:32:21
5バイトしか取ってないのにNULLを6バイト目に入れてるけどいいの?
673デフォルトの名無しさん:2009/10/01(木) 09:32:52
あ、いいのか。
674デフォルトの名無しさん:2009/10/01(木) 09:33:11
>>672
6バイト取ってるでしょ。マニュアル嫁
675デフォルトの名無しさん:2009/10/01(木) 09:34:07
先越されるとは思わんかった。>>673>>671へだ。SV *自体問題ない。
676デフォルトの名無しさん:2009/10/01(木) 09:46:21
newSVpvと文字列コピーするところ以外は
やりたいことは一緒なんだから比べてみ。
677デフォルトの名無しさん:2009/10/01(木) 10:10:11
SVの実体が何か明示する前に文字列と決め付けてるからまずいんじゃないか。
いきなりnewSVみたいな低レベルの関数使うと怪我をするよ。
SV *string = newSVpv(" ", 5);としたらどうなる?
678デフォルトの名無しさん:2009/10/01(木) 12:52:54
スペースは5個な。まあ6バイトallocしてくれてるはずだから、
初期化するまで値が不定になるだけで実害はないと思うが
679デフォルトの名無しさん:2009/10/01(木) 23:23:46
>>668
たしかにコードはC++チックですね。コメントが // だったり、変数宣言が先頭になかったり。

>>669
668さんはXSが何かわかったうえでの発言だと思いますよ?

>>670
RETVALUE = string;
の行の前に
SvPOK_only_UTF8(string);
を追加してみましたけど、状況は変わらずでした。

>>677
newSVpvn(" ", 5) ですよね。それだとうまくいくんですが、これだとコピー元の文字列を
あらかじめ用意してないといけないので、今回の目的には適合しませんでした。

で、いろいろ調べて、New() と Safefree() と newSVpvn() を使うことにしました。
でもこれだと New() でバッファを用意して、文字列を埋めて、newSVpvn() でコピーして、・・・と
しなきゃいけないから、newSVpvn() でコピーするのが無駄かなあとは思うんですけど、
これしかうまくいかないので、そうします。
アドバイスいただいたみなさん、ありがとうございました。


680uy50% ◆e6.oHu1j.o :2009/10/02(金) 23:15:29
ラリーウォールさんの書いたperlのソースってどこかで見れませんか?
どんなものでもいいです
681デフォルトの名無しさん:2009/10/02(金) 23:26:04
682デフォルトの名無しさん:2009/10/03(土) 01:34:21
Mail to [email protected]

このメアドがまたすげー
683uy50% ◆e6.oHu1j.o :2009/10/03(土) 02:33:27
>>681
見つからないんですが、どこのページに?
684デフォルトの名無しさん:2009/10/03(土) 04:31:47
mapのような書き方をするメソッドを実装したいんですが、
もしかして第一引数に勝手にインスタンスが入るのでsubが省略できなかったりしますか?
685デフォルトの名無しさん:2009/10/03(土) 04:32:13
あ?
686デフォルトの名無しさん:2009/10/03(土) 05:06:10
>>679
どうせ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
687デフォルトの名無しさん:2009/10/03(土) 05:13:25
>>686
あなたには答えてほしくありません。
688デフォルトの名無しさん:2009/10/03(土) 05:20:57
>>684
日本語がよくわからんが....。map { some_code } @foo;のようなことがしたいなら、

my_map(&@){ ... }
:
my@bar = my_map { some_code } @foo;

で出来る。
map BLOCK LIST
map EXPR, LIST
の2つの書式を満たす方法は知らん。
689デフォルトの名無しさん:2009/10/03(土) 05:23:18
>>687
回答者を選ぶなら質問するな。
そもそも俺が何番の人か分かってるのかなこの人。勘違いだと思うんだが。
何番かアンカー晒してみ。
690デフォルトの名無しさん:2009/10/03(土) 05:24:10
あー>>687が質問者じゃなくて単なる煽りの可能性もあるな。だったらすまん>>687
691デフォルトの名無しさん:2009/10/03(土) 05:47:31
普通に考えてそうだろ.
692デフォルトの名無しさん:2009/10/03(土) 07:03:49
 CODE:
  int 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;
693デフォルトの名無しさん:2009/10/03(土) 13:40:30
>>688
すみません、サブルーチンの場合にそう書けるのは知ってます
クラスをオブジェクトとして作ったときに、$hoge->map({ $_ =~ /hoge/} @huga) というmapメソッドを書く方法はないのか知りたかったのです
しかしこのとき実装側では sub map($&@){… としなければいけないため、呼び出し側のsubが省略できないじゃないですか
なので、これをなんとかできないものかと思いまして…
694デフォルトの名無しさん:2009/10/03(土) 14:08:52
メソッドの呼び出しはプロトタイプ効かないから無理くさくね?
695デフォルトの名無しさん:2009/10/03(土) 14:13:13
やはりそうですか…
ありがとうございました
696デフォルトの名無しさん:2009/10/03(土) 14:26:36
ttp://deepneko.dyndns.org/kokotech/2009/06/mecabwikipedia.html
このサイトに書いてあるようにしたのですが、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
697デフォルトの名無しさん:2009/10/03(土) 15:17:11
>>696
これなら初心者の自分でも書き直せる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;
698デフォルトの名無しさん:2009/10/03(土) 15:49:41
>>693
map $hoge (....)とは書けるんだがな。
メソッド呼び出しはリストしか受けないから無理でしょ。
699デフォルトの名無しさん:2009/10/03(土) 22:35:23
WWW::SourceforgeJP ver.0.0.1 リリース
http://acapulco.dyndns.org/blog/2009/10/03/wwwsourceforgejp
700デフォルトの名無しさん:2009/10/03(土) 23:25:10
正規表現でマッチした文字列そのものを取得したいです

例えば
"hoge huga" =~ /(\s|\d)/
という正規表現があったとき、
' 'ではなく'\s'を取得したいです

可能でしょうか
701 ◆TWARamEjuA :2009/10/03(土) 23:30:31 BE:1307243-BRZ(10101)
可能でしょうねぇ。。。
702デフォルトの名無しさん:2009/10/03(土) 23:36:15
700じゃないけど、どうすればできるか知りたい。
役に立つ気はしないけど。
703デフォルトの名無しさん:2009/10/03(土) 23:46:01
(?{})とか(??{})を駆使すればいけるかもしれないけど
デフォでそんなインターフェイスは用意されてないっしょ
704デフォルトの名無しさん:2009/10/04(日) 00:03:31
>>703
??{}ですか
参考になりました、調べてみますね
ありがとうございました
705デフォルトの名無しさん:2009/10/04(日) 00:03:35
おれも知りたい。
706700: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',
);

という感じのハッシュのキーを合成して、一番最初にマッチしたものの名前を返す関数の作成だったので、
これでいけそうです
707700: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

と、期待通りの結果を返してくれました
これは一回通った正規表現に対してはサブパターンは呼び出されないということなんでしょうか。。。
708デフォルトの名無しさん:2009/10/04(日) 04:32:58
レキサ作ってんのか。。。
709デフォルトの名無しさん:2009/10/04(日) 10:06:58
>>707
>>706のレス見たときに、関数化してハマるんだろうなーと思ったらマジでハマっててワロタ

my $regex → local our $regex
my $ret → local our $ret
これでどうかな?
昔、そういうプロギラムを書いていたときには、こいつで回避出来たよ

多分、正規表現リテラルは初回の正規表現コンパイル時に、クロージャのようにローカル環境をキャプチャするけど
再度、同じ正規表現を与えてリテラルのパスを通ってもキャプチャが発生しない
なので、正規表現の中ではmy変数は使わず、グローバル変数を使えばOKと
710700:2009/10/04(日) 14:05:04
>>709
おお!いけました!
ありがとうございます

use strictすることでこんな罠が生まれていたとは思いもしませんでした
正規周りは魔物が住んでますね…
711デフォルトの名無しさん:2009/10/04(日) 16:12:52
utf8で書かれた文章をeuc-jpで新しく保存しようとすると開けなくなります
何が原因でしょうか。また解決するにはどうすれば良いでしょうか?
712デフォルトの名無しさん:2009/10/04(日) 17:21:40
777
713デフォルトの名無しさん:2009/10/04(日) 17:25:40
>>711
use utf8とかその辺りが原因の気が。
714デフォルトの名無しさん:2009/10/04(日) 20:45:37
>>713
csvファイルなのですがutf8のtext.csvを
nkf -e test.csv > test2.csv
で変換すると、開けなくなります。
715デフォルトの名無しさん:2009/10/04(日) 21:42:37
おいおい、言ってることがめちゃくちゃだな。
何をしようとして、何をしたら、どうなって欲しいのに、どうなったか、具体的にキチンと書いてみ。
716デフォルトの名無しさん:2009/10/04(日) 22:00:58
Web::Scraperでデータの抽出しているのですが
XpathをFirebugで取得してWeb::Scraperに処理させると、Xpathがずれてしまいます。
Firefoxのレンダリングでタグが追加変更されているのが原因みたいです。

PerlからFirefoxでレンダリング済みのタグを取得することはできないのでしょうか?
よろしくお願いします。
717デフォルトの名無しさん:2009/10/05(月) 00:34:57
ttable を除去すればいけるけど…
そういうことじゃなくて?
718デフォルトの名無しさん:2009/10/05(月) 00:42:14
>>717
tbody以外にもページによって
tr[2]をtr[3]に変えたりとか
/table/tbody/tr/tdが追加されてたりとか
center/div/div/fontが追加されたりとか

単純なパターンで取れない感じがするので、いっそのことFirefoxでレンダリング済みのソースを
perlから取れないかな?と思ったのです。
719デフォルトの名無しさん:2009/10/05(月) 16:57:25
卒業研究でperlを使うことになったんですが、
linux環境でMeCab.pmのperlモジュールを使用するにはどうしたらいいのでしょうか?
linuxはvine3.2です。
720デフォルトの名無しさん:2009/10/05(月) 18:33:11
フロストバイトエンジンがPC版でどのくらい綺麗になるのか見てみたい
721デフォルトの名無しさん:2009/10/05(月) 18:35:36
>>720
ごめん、ごばった
722 ◆TWARamEjuA :2009/10/05(月) 18:36:03 BE:1742382-BRZ(10101)
>>719
ググればすぐに出てくるんですけれども。。。
ttp://www.alwaysfine.jp/2008/03/spamassassin_32wo.html

いわゆる犬学生なんでしょうね。。。
723デフォルトの名無しさん:2009/10/06(火) 10:51:28
. 1. HTML    で検索した結果 1〜10件目 / 約5,040,000,000件
. 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件
724デフォルトの名無しさん:2009/10/06(火) 11:01:41
>>715
保存でeuc-jp指定とnkfで-eとは違うのですか?
無知ですみません。
725デフォルトの名無しさん:2009/10/06(火) 11:37:51
>>724
出力はeucって指定してるけど、入力の指定は?
もとのファイルがUTF8だということをnkfに教えてやらなければダメなのかもね。
nkfの説明書をよく読んでみてよ。
726デフォルトの名無しさん:2009/10/06(火) 12:06:40
ある2種類の要素数が同じ配列データがあって
片方は末尾までデータが入っているのですが
もう片方は末尾に半角スペース1個だけが入っています

この配列をファイルに書き出す際、前者は全て書き出し、後者は最後の配列のみ書き出さないようにしたいのですが、うまくいきません

ループ中に配列aの最後n番目が半角スペースなら書き出さない場合、
if($a[$n] eq " "){
last;
}
では駄目なのでしょうか
携帯からなので読みにくいですがよろしくお願いします
727デフォルトの名無しさん:2009/10/06(火) 12:40:35
デバッグという概念が失われて久しい……
728デフォルトの名無しさん:2009/10/06(火) 13:18:59
改行が入ってんだろ
729デフォルトの名無しさん:2009/10/06(火) 14:04:23
>>726
デバッグしろ。

if($a[$n] eq " ") がヒットしているか調べろ。$a[$n]の中身を調べろ。
730デフォルトの名無しさん:2009/10/06(火) 16:09:48
perl のデバッガって何がおすすめですか。
731デフォルトの名無しさん:2009/10/06(火) 16:17:19
Data::Dumperでデータの中身見てDevel::Peekでutf8フラグ見るくらいしかやったことないな
732デフォルトの名無しさん:2009/10/06(火) 18:55:01
ifの前ぐらいに
print "!!! HELLO !!! $n='$a[$n]'\n";
って書いておくといいよ。
733デフォルトの名無しさん:2009/10/07(水) 01:31:47
>>726
if($a[-1] eq " "){
output @a[0..$#a-1];
}else{
output @a;
}
734デフォルトの名無しさん:2009/10/07(水) 01:35:46
>>733
pop @a if $a[-1] eq " ";
output @a;
735デフォルトの名無しさん:2009/10/07(水) 02:18:49
2行の文字列があって、
1行目の文字列を2行目の文字列の任意の場所に挿入
その後1行目を改行ごと削除
という作業はどう書けばいいでしょうか?
736デフォルトの名無しさん:2009/10/07(水) 03:34:48
>>735
splitで切って2つの文字列に分けて、substrで1行目を2行目に入れればいい。
737デフォルトの名無しさん:2009/10/07(水) 07:10:08
>>735
日本語が妖しいので確認


入力> 2行一組の文字列
出力> それぞれの組を1行にまとめた文字列
処理> 改行を削除した1行目を2行目の任意の場所に挿入


738デフォルトの名無しさん:2009/10/07(水) 07:46:29
>>736
chomp(@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って戻り値は代入後の文字列だっけ?
ググっても見つからなかった。
739デフォルトの名無しさん:2009/10/07(水) 10:47:16
> ググっても見つからなかった。

最近の Perl を良く知らないのですが perldoc などのオフィシャルなドキュメントは存在しないのでしょうか?
740デフォルトの名無しさん:2009/10/07(水) 11:07:25
>>738
どっちかというと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];

とか試してみれば理解できると思います。
741デフォルトの名無しさん:2009/10/07(水) 11:12:40
>>739
あるよ
perldoc -f substr
で調べられる
742デフォルトの名無しさん:2009/10/07(水) 13:06:10
正規表現で、abもしくはxyもしくは12を含むは、

/ab|xy|12/

と書きますが、ab、xy、12の全て含むはどう書くのでしょうか?
743デフォルトの名無しさん:2009/10/07(水) 13:30:17
>>742
ab,xy,12をすべての順列で並べて

ab.*xy.*12|ab.*12.*xy|...

と書けばいい。

無理に正規表現だけでやらずに

/ab/ && /xy/ && /12/

とした方が楽だと思うけどね。
744デフォルトの名無しさん:2009/10/07(水) 13:43:19
>>743
d
745デフォルトの名無しさん:2009/10/07(水) 14:04:22
ファイルテスト演算子 -T って、
どうやってテキストファイルだと見破ってるの?
その原理とか注意事項ってある?
746デフォルトの名無しさん:2009/10/07(水) 14:19:45
>>745
とりあえずperlfunc読め。

ファイルテスト -T と -B の動作原理は、次のようになっています。ファイルの最初の数ブロックを調べて、
変わった制御コードや上位ビットがセットされているような、通常のテキストには現れない文字を探します。
そのような文字が、たくさん (>30%) 見つかるようであれば、そのファイルは -B ファイルであると判断され
ます; さもなければ -T ファイルとなります。最初のブロックにヌル文字が含まれるファイルも、バイナリ
ファイルとみなされます。 -T や -B をファイルハンドルに対して用いると、最初のブロックを調べる代わり
に、IO バッファを調べます。調べたファイルの中身が何もないときや、ファイルハンドルを調べたときに
EOF に達していたときには、-T も -B も「真」を返します。

「通常のテキストには現れない文字ってなんだよ!!」とか言いたくなったら、ソース読むしかないかな。
(pp_sys.cのpp_fttext)

でも結局30%だからあんまりアテにすると痛い目を見そうなんで俺は使わないね〜。
747デフォルトの名無しさん:2009/10/07(水) 14:31:29
マニュアル提示サービスはここですか?
748デフォルトの名無しさん:2009/10/07(水) 14:36:29
ちがいます
749デフォルトの名無しさん:2009/10/07(水) 15:16:53
>>747
そうです。
ここは、疑問を書けば、マニュアルの該当部分を張ってくれるスレです。
750デフォルトの名無しさん:2009/10/07(水) 15:18:04
ここは質問スレだよ(´・ω・`)
751デフォルトの名無しさん:2009/10/07(水) 15:22:25
そうです 質問スレです…
752デフォルトの名無しさん:2009/10/07(水) 15:35:33
そもそも、マニュアルに書いてあることが質問される時点で異常な状態だということを見失うなかれ。
753デフォルトの名無しさん:2009/10/07(水) 15:40:44
>>739
オフィシャルなドキュメントには記載が見つからなかったのです
754デフォルトの名無しさん:2009/10/07(水) 17:17:48
>>752
googleで-Tを検索したら何も出てこなかったんだよきっと
755デフォルトの名無しさん:2009/10/07(水) 22:03:27
>>752
じゃあ、substrに代入したときの返り値を調べてみてよ。
756741:2009/10/07(水) 23:02:37
>>755
あぁ、ごめん。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;
}
print
  join "\n", @res,
  "\n";
757デフォルトの名無しさん:2009/10/08(木) 04:05:10
>>755
なにがどう「じゃあ」なんだよwww
758デフォルトの名無しさん:2009/10/08(木) 04:53:55
$ perldoc -f substr
No documentation found for "perlfunc".

^^v
759デフォルトの名無しさん:2009/10/08(木) 06:39:44
>>756
マニュアルに記載のない使い方はしないほうがよいのか
代入文だからlvalueが保持されると考えるのがよいのかが知りたかった。
多分、後者だね。


コードについては、ヒアドキュメント使うと柔軟性に難があるから、下記のがいいかも。

@lines=<DATA>;

(プログラム末尾)
__DATA__
入力データ
入力データ



あと、入力が偶数行でなかったときはこけるね。
入力の妥当性を調べるのはプログラムの仕事だよ。

それから、任意ってそういうことだったのかな?
もとの要求が謎の多いものだから、こちらは乱数にしたのだけど。
760デフォルトの名無しさん:2009/10/08(木) 06:46:42
>>756
もう一度プログラム見た。
これ、正しくない。

挿入位置+1行目の長さが2行目の長さより短いと
順がおかしくなる。
761デフォルトの名無しさん:2009/10/08(木) 09:04:20
>>760
おぉ。ホントだ。台風で午前中休みにして暇になったから直した。
無理やり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;
}
762デフォルトの名無しさん:2009/10/08(木) 11:53:43
ハッシュ%hogeで
$hoge{$a}{$b}{$c}{$d}...{$n}
を定義した順番でkeyを
keysで取り出したい

普通モジュールの Tie:IxHash を使うらしいけど
それだと最初の$aのkeyだけ定義順番でとりだせて
%{$hoge{$a}}以降の深い構造でのkeyが
順番どうりならず、ばらばらにkeysで取り出されるようになる

どうにかして定義した順番でどの段階でも
取り出せるようにしたいんだけど
おしえて下さい。
763デフォルトの名無しさん:2009/10/08(木) 12:04:59
>>762
キーを配列にとっとけ。
$hoge{$fuga}{$foobar} = 'bar';
push(@hoge, [$a, $foobar]);


764デフォルトの名無しさん:2009/10/08(木) 12:07:39
$hash{a}{b}に値を入れる前に

tie %{$hash{a}}, 'Tie::IxHash';

しておけば、

keys %{$hash{a}}は順番に取り出せるよ。
765デフォルトの名無しさん: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

いい方法ないでしょうか
766デフォルトの名無しさん:2009/10/08(木) 15:45:51
>>765
配列だから同じキーが何回出てこようとちゃんと
保存されていて問題ないはずだが?
767765:2009/10/08(木) 15:46:38
あと
tie
すると前保持していた値がすべて真っ白になってしまうので
繰り返しのなかに>>764
いれられない状態。
一日なやんでもいい方法が思いつかない
768デフォルトの名無しさん:2009/10/08(木) 15:52:52
a b c d a b c d e f a g a
という順番でkeyがでてくるとする
とりだすときは
a b c d e f g
でとりだしたいんだけど
できる?>>766
769デフォルトの名無しさん:2009/10/08(木) 15:57:32
>>762
やり方が悪いので、データ構造を見直すべし。
770デフォルトの名無しさん:2009/10/08(木) 15:59:54
>>768
そんなのすでに取り出したかハッシュで管理してとばせばいいだけだろ。
771デフォルトの名無しさん:2009/10/08(木) 16:10:42
>>768
それこそハッシュ使って同じキーが出てきたらスキップするようにすればいい。
んで$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]);
772デフォルトの名無しさん:2009/10/08(木) 17:35:28
もしかしてこういうのでいいってオチか?

print sort keys %hash;

もしくは

print map $hash{$_}, sort keys %hash;
773デフォルトの名無しさん:2009/10/08(木) 18:44:55
よくわからんが、各層のキーをjoinしたものをハッシュキーにして
Tie::IxHashを使えばいいんじゃないのか。
774デフォルトの名無しさん:2009/10/08(木) 21:00:34
Perlで/etc/shadowに使うSHA512化されたパスワードを作ろうとしているのですが
/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";
775デフォルトの名無しさん:2009/10/08(木) 22:25:23
Webリソースのバイト数を取得するモジュールって何かありますか?
776デフォルトの名無しさん:2009/10/08(木) 23:12:20
>>775
Webリソースって具体的に何だ?
777デフォルトの名無しさん:2009/10/08(木) 23:20:33
>776
タイミングが悪くて非常に申し訳ない。
自己解決しました^^;

ダウンロード対象のつもりでした。html,zip,etc…
778デフォルトの名無しさん:2009/10/08(木) 23:21:56
perlってsocks串刺せますか?
779デフォルトの名無しさん:2009/10/08(木) 23:27:55
uaでいいんじゃないのか?
780デフォルトの名無しさん:2009/10/08(木) 23:28:35
ua…
LWP?とかいうのと関係ありますか?
781デフォルトの名無しさん:2009/10/09(金) 05:57:46
>>774
目的はクラッキング?
フツウの人はシャドウなんていじらないもんな。
782デフォルトの名無しさん:2009/10/09(金) 07:14:21
Pealのデバッガで変数を強制で変えるコマンドってある?

初心者な質問ですまん
783デフォルトの名無しさん:2009/10/09(金) 07:45:58
perlな
784デフォルトの名無しさん:2009/10/09(金) 08:52:12
>>782
普通に代入じゃだめなのん?
785デフォルトの名無しさん:2009/10/09(金) 09:14:52
>>774
そういうシステムならcryptもsha512対応してると思うので
そっち使えばいいと思う。同じライブラリ呼ぶので確実な
筈だよ。

print crypt('password', '$6$salt');
786デフォルトの名無しさん:2009/10/09(金) 14:08:33
>>774
車道クラックか?

>>777
解決したならそれを書くのが筋。HTTPレスポンスのことならHTTPヘッダの
Content-Length: 行で取れるよな。

>>782
スカラ型の内部値を変えたいのか?質問の意図がよくわからん。
数値にしたけりゃ
$foo += 0;
文字列にしたけりゃ
$foo .= '';
内部的にリファレンスとか整数型にしたいとかだったら簡単な方法は知らん。
787774:2009/10/09(金) 17:07:06
>>785
普通にcryptで出来るんですね・・・ありがとうございました。

>>781
>>786
趣味で自宅サーバーをやっているのですが
Perlからsystem関数でuseraddを使うためです。
誤解を招く質問をしてしまい申し訳ありません。
788777:2009/10/10(土) 03:46:06
>786
おっしゃる通り、HTTPレスポンスから取得出来ました。
Perlの質問ではありませんでした…
789デフォルトの名無しさん:2009/10/11(日) 01:53:02
自己解決しましたっつーのは自分が苦労して答えを導き出せたから
掲示板に答えが書かれてしまうと自分の苦労の価値が下がってしまうから
それを避けるための自慰行為。
「Webリソース」とか書くようなバ力は788なんかじゃなくてwcとかで解決したつもりだろ。
790デフォルトの名無しさん:2009/10/11(日) 03:25:57
>>787
お陰さまで私も勉強になりました。
今時のシステムはパスワード暗号化にsha512使ってるなんて
知りませんでしたから。
うちのシステムは何を使ってるんだろ?
791デフォルトの名無しさん:2009/10/11(日) 20:13:01
gzファイルをgzopenを使って読み込みこむことはできたんですが
日本語が文字化けしてしまいます
普通のtxtファイルなどは日本語でも文字化けしません
どうしたらいいんでしょうか
792デフォルトの名無しさん:2009/10/11(日) 20:20:33
>>791
使うな。
793デフォルトの名無しさん:2009/10/11(日) 20:25:11
gzopenを使うなってことですか?
794デフォルトの名無しさん:2009/10/11(日) 20:54:51
perlを使うな
795デフォルトの名無しさん:2009/10/11(日) 21:03:41
perlだとできないんですか?
それじゃphpでやってみます・・
796デフォルトの名無しさん:2009/10/11(日) 23:57:04
連想配列について質問です。
たとえばkeysでとりだしたハッシュの順序は一定ではないそうですが、
何回もperl *.plで実行しても同じ順序でキーが取り出されます。
ハッシュの順序はOS依存なんですか?それともperlのバージョン依存なんですか?
同じ環境のもとで同じプログラムにした場合はkeysでとりだされるキーも同じ順序になるのですか?
797デフォルトの名無しさん:2009/10/12(月) 00:12:59
ハッシュ依存じゃないの?
798デフォルトの名無しさん:2009/10/12(月) 00:17:12
>一定ではないそうですが

これは誰から聞いたの?
799デフォルトの名無しさん:2009/10/12(月) 00:35:34
別に乱数は使ってないよ
800デフォルトの名無しさん:2009/10/12(月) 00:51:45
一定ではないというのは環境によるんだろうが
ハッシュに順序の保障を求めるべきではないとは思う
順序の保障が欲しければリストを利用/併用すべきだろうな
801デフォルトの名無しさん:2009/10/12(月) 01:24:16
perlのバージョン依存。

perl5.10.0のperldoc -f keysでは、
===========
超訳。
perl5.8.1までは、セキュリティー上の理由から、
keysはプログラムを実行する度に違う順序で取り出されてた。
(順番自体は見た目上ランダムに決定されてる。ただし、
同一プロセス内で、hashに変更が無いならeach, valuesでも
keysと同じ順である事は保証される。)
===========
暗に「より新しいperlではkeysはhashに変更が無いなら
プログラムを複数回実行しても同じ順に取り出される。」
と言ってはいるが、それをkeysのperldocでは明文化は
してない。
ここまで調べて面倒になった。

俺も>>800氏と同じ見解だし。
802デフォルトの名無しさん:2009/10/12(月) 01:32:14
うそっ
わざわざランダムにしてたんだ

for (keys
っていう処理はするけど、大抵はsortとセットだから気にしたこともなかった
803デフォルトの名無しさん:2009/10/12(月) 02:52:49
>>801
逆だ。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
804デフォルトの名無しさん:2009/10/12(月) 03:59:09
セキュリティが理由なら、止めてしまう訳ないしな
805デフォルトの名無しさん:2009/10/13(火) 05:43:17
質問です。サブルーチンの途中でreturnせずに戻り値を返すことは可能でしょうか?

長文処理の自作モジュールに引数としてファイル名を渡し、
サブルーチン内で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;
}

素直に呼び出し側でファイルを開いて行単位でサブルーチンを呼ぶべきかとも思うのですが、
それもなんかスマートでない気がしてモヤモヤしています。よろしければ方向性だけでも示唆ください。
806デフォルトの名無しさん:2009/10/13(火) 06:03:32
コルーチン
807805:2009/10/13(火) 08:56:41
おお! これは!
ありがとうございます。ちょっと勉強してみます。
808デフォルトの名無しさん:2009/10/13(火) 09:12:49
>>805
> #ここで各行を処理してprint

ここでプリントサブルーチンを呼べば?
なんなら、子プロセスかスレッド開いて渡すか
IPCでデータ流し込みもできる。
809デフォルトの名無しさん:2009/10/13(火) 13:44:35
Perlでコルーチン使えるのかw
クロージャ渡すかカーソルオブジェクト作ればいいんじゃね
810805:2009/10/13(火) 19:37:22
>>808
レスありがとうございます
いろいろと方法があるんですね

場当たり的にググって済ませてきたけど
そろそろ体系的な解説本を読まなきゃダメだと思った次第。ありがとうございました。
811デフォルトの名無しさん:2009/10/13(火) 19:45:44
>>808,809でした
ageてるし

ありがとうございますです
812デフォルトの名無しさん:2009/10/14(水) 00:08:40
>>809
> Perlでコルーチン使えるのかw


coroとかいうのがあるらしい。
Cでコルーチン実装する記事をみたら、案外簡単な様子。


>>810
perlの場合、オンラインマニュアルが一番詳しく分かりやすいかも。
チュートリアルもあるし。
Linuxで使ってるなら、man perlしてみて。
813デフォルトの名無しさん:2009/10/14(水) 05:48:19
「オンラインマニュアル」ってさ、オンラインじゃ無くても「オンラインマニュアル」って言うんだよな
814デフォルトの名無しさん:2009/10/14(水) 05:54:13
インンターネット普及以前の意味でのオンラインだろ
815デフォルトの名無しさん:2009/10/14(水) 06:18:56
>>813
そういやオフラインミーティングという言葉も死語だね。
略してオフ会は今でも使う?
816デフォルトの名無しさん:2009/10/14(水) 08:13:33
>>813
もはや現在、ついったーのオフ会なんかだと実世界で隣にいてもオンラインで会話する有様。
817デフォルトの名無しさん:2009/10/14(水) 14:59:13
>>816
それはのとぴしが普及して以来ずっとそう。
818デフォルトの名無しさん:2009/10/14(水) 17:49:55
>>817
まあ、技術系はね。
819デフォルトの名無しさん:2009/10/15(木) 09:09:56
>>816
ついったーって外国のSNSと思ってた。
プログラマって孤高なひとが多いのかと思っていたけど、
人と混じるのが好きな人多いのかな。

自分は同類なひとと交じるのは嫌いだからオフ会には出ないけど。
820デフォルトの名無しさん:2009/10/15(木) 09:41:46
>>819
孤高ってのは
息がピタッと合う奴があんまり居なくて
結果的に孤高になるだけじゃないかな
821デフォルトの名無しさん:2009/10/15(木) 10:10:34
最近はiPhoneだな。
喫茶店で机を囲んで誰も喋らずにiPhone操作してる光景はもはや異様
822デフォルトの名無しさん:2009/10/15(木) 10:15:58
>>820
それは「孤高」じゃなく「孤独」なんじゃないw
823デフォルトの名無しさん:2009/10/15(木) 17:36:09
>>798
ハッシュの原理調べろ。一定なわけないから。というか、一定にならないように
腐心する必要があるのがハッシュのキー順序。

バージョン間で順序が違うことはある。ハッシュ値計算に、どっかのバージョンでビット演算が入った。

>>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
824デフォルトの名無しさん:2009/10/15(木) 17:36:21
>>813
いつの言葉だと思ってるんだ。サーバと端末(今だと端末エミュレータ)までの間がオンラインなんだよ。

>>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);
825デフォルトの名無しさん:2009/10/15(木) 18:12:03
>>819
単に、取り残されて排除されて孤立している人ほどネットの公開領域で叫ぶから
そう見えるだけじゃないのか?
826デフォルトの名無しさん:2009/10/15(木) 19:00:14
>>823-824
知ったかぶり
827デフォルトの名無しさん:2009/10/15(木) 21:35:30
示されたドキュメントも読めてないしなぁ。
828デフォルトの名無しさん:2009/10/15(木) 23:41:12
>>825
そっかあ。
私も取り残されて引きこもりで友達いないです。
ひとと交じるの嫌い。
立場的に無理矢理人付き合いさせられてるので
ますます一人になりたいのです。
ワザワザオフ会にでる気持ちは矢張りわかりませんが
直接会ってもみんな引きこもりモドキなんですね。
集まるのは同じ空気を吸いたいからだろか。
寄り添うだけで安心できるから?
わかりません><
829デフォルトの名無しさん:2009/10/16(金) 01:05:14
オフ会やったときない(´・ω・`)
830デフォルトの名無しさん:2009/10/16(金) 12:35:51
イメージを崩したくないから行かない(´・x・`)
831デフォルトの名無しさん:2009/10/16(金) 13:25:33
>>824
ランダムにするのがデフォルトだったのは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より)
832デフォルトの名無しさん:2009/10/16(金) 14:07:26
ここでする質問じゃないような気もするけど他に思いつかないので・・・
cpanで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

どうすればいいんでしょうか?
833デフォルトの名無しさん:2009/10/16(金) 14:45:02
>>832
cpan -i App::Cppref
では?
834デフォルトの名無しさん:2009/10/16(金) 14:55:11
>>833
やっぱりありません

$ 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/

どういうことなの・・・
835デフォルトの名無しさん:2009/10/16(金) 16:23:57
pcが拒否ってる・・・
836デフォルトの名無しさん:2009/10/16(金) 17:12:43
よくわからんが試してみたらMetadataの中にcpprefやApp::Cpprefという
文字列が見つからないな。なんかおかしいんじゃね?

急ぐんならcpanコマンド使わずに入れてみるとか。(tarball展開して
perl Makefile.PL; make; make install)
837デフォルトの名無しさん:2009/10/16(金) 18:05:06
>>836
そうですね。急ぎではないですがgithubからソースを取ってきました

必要ないかとは思いますが一応、騒いだ落とし前として・・・
Makefile.PL実行時に「readme_fromなんか定義してんじゃねえよ」とエラーが出る場合は
Module::Install::ReadmeFromPodを入れる必要があるようです

では、どうもありがとうございました
838デフォルトの名無しさん:2009/10/16(金) 18:23:53
ああっ、遅かったか。
cpan shell で
cpan> install KAZUHO/cppref-0.06.tar.gz
が常套手段なんだけど。
839デフォルトの名無しさん:2009/10/16(金) 18:45:30
>>838
なんでそんなことしなきゃインストールできんのかねぇ??
840デフォルトの名無しさん:2009/10/16(金) 18:50:48
あぁなるほど

cpan> install cppref-0.06.tar.gz

では試していたんですが、その前に名前空間を入れる必要があったんですね
ならinclineも同様の手段で入れられるかな
841デフォルトの名無しさん:2009/10/16(金) 18:58:55
>>840
すまんが>>838はコマンド打ってダウンロードしはじめた所でkillしたから
このケ
842デフォルトの名無しさん:2009/10/16(金) 19:00:13
ースできちんとインストール出来るか保証は出来ないよ。

って途中で送信してしもたorz...
843デフォルトの名無しさん:2009/10/16(金) 19:20:29
install自体はもう済んでいるのでお気になさらず
まぁcpanではエラー出ましたけど

Can't locate object method "arch_check" via package "PACK001" at inc/ExtUtils/MakeMaker.pm line 585.
844デフォルトの名無しさん:2009/10/17(土) 08:40:05
すいません超初歩的な質問だと思うんですが
$val が 1か4か9の時
という風な条件文を書くとき
$val == (1|4|9){
では間違っていますか?
初歩的過ぎるのかネットでの調べ方もいまいち掴めませんので教えて下さい。
845デフォルトの名無しさん:2009/10/17(土) 08:45:40
いやがらせ
846デフォルトの名無しさん:2009/10/17(土) 09:19:21
1 = 0001b
4 = 0100b
9 = 1001b
つまり (1|4|9) は 1101b なので 13

$val が 1か4か9の時はこう書く
if($val == 1 || $val == 4 || $val == 9){}
847デフォルトの名無しさん:2009/10/17(土) 09:26:40
>>844
その書式に極力合わせるなら、

$val =~ /^(1|4|7)$/ and do{
848デフォルトの名無しさん:2009/10/17(土) 09:48:47
>>844
ジャンクションですね、わかります
849844:2009/10/17(土) 10:25:03
お早い回答ありがとうございます。
やはり間違ってたんですね。どうも上手く行かない理由がやっとわかりました。
とりあえず地道に>>846の書き方で頑張ろうと思います。
>>847の方はまだ微妙に理解できないので、もっと精進しようと思います。

>>848も意味がどうにもわかりません。
850デフォルトの名無しさん:2009/10/17(土) 10:49:52
タイ━━━━||Φ|(|´|Д|`|)|Φ||━━━━ホ
851デフォルトの名無しさん:2009/10/17(土) 12:39:07
http://www.kcrt.net/program/perl6/14junctive.html
なるほどPerl6にはそんな機能があるのか
じゃあビット演算はどうするのよと思ったらこう書くのか・・・
1 +| 2 # == 3
5 +& 3 # == 1
852デフォルトの名無しさん:2009/10/17(土) 15:08:57
スマートマッチやSwhich文でもいいがあまりお勧めできない
853デフォルトの名無しさん:2009/10/17(土) 17:59:34
>>847区wしく
854デフォルトの名無しさん:2009/10/17(土) 19:20:13
@list = `perl -wc script.pl 2>&1`;
という感じで対象スクリプトの文法エラーを補足し、定形式("ファイル名:ラインNo.:メッセージ")にパースしてくれるスクリプトを手直ししています
(具体的に言うとvim72のpfm_perl.plです)
やりたいことは、@listからエラーなのかワーニングなのかを判別し、定形式にエラーのタイプを追加することです
現在はあらかじめ用意したメッセージのプロトタイプのリストとマッチするかどうかで決定していますが、誤判別も多くその度にリストを手直ししています
しかしどうも先駆者がいる気がしてなりません
文法チェックの結果をタイプ別に分類してくれるモジュールを知っていたら教えていただけませんか
855デフォルトの名無しさん:2009/10/17(土) 19:42:14
ズレた答えになるのを承知の上で

perlの文法チェックならPerl::Criticが定番で、
perltidy と一緒に突っ込むのが吉だ。

perl 本来のエラー、ワーニングならリファレンスに
全て書いてあるからそれを突っ込みゃいいだけだし、
そのスクリプト独自のエラーなら、スクリプトを grep
すれば良いだけの様な気がする。

って書いたが、やっぱズレてる気がするなあ。
856デフォルトの名無しさん:2009/10/17(土) 21:32:18
>>855
ありがとうございます
Perl::Criticについては、コーディングルールに反しているがperlでエラーとならないものに関してのチェッカーとしては利用できそうです
しかしPerl::Criticが生成するリファレンスをダンプしてみても普通のオブジェクトで、どこにもエラーやワーニングが入ってなさそうでした
本来のエラーやワーニングはどういったメソッドで取ってこれるのでしょうか

もしできないのでしたら、やはりperldoc perldiagから移植するしかないのでしょうか…
857デフォルトの名無しさん:2009/10/17(土) 21:38:34
>854
エラーか警告かが判別できればいいんだったら、

BEGIN {
  $SIG{__WARN__} = sub { warn "WARN: $_[0]"; };
  $SIG{__DIE__} = sub { die "DIE: $_[0]"; };
}

1;

を Classify.pm とでもして、perl -MClassify -wc script.pl で先頭が DIE: か WARN: かで
判別できるんじゃない?
858デフォルトの名無しさん:2009/10/17(土) 21:44:52
>やはりperldoc perldiagから移植するしかない
その意図で
>perl 本来のエラー、ワーニングならリファレンスに
>全て書いてあるからそれを突っ込みゃいいだけだし、
って書いたつもりだったんだが…。

釈迦に説法かもしれんが、perldoc -l perldiag
でpodの場所が分るからそれコピーして来て捨てスクリプト
一発でデータベースは出来るだろ。
859デフォルトの名無しさん:2009/10/17(土) 21:50:08
perldoc -T でテキスト出力の方が良いかも。
860デフォルトの名無しさん:2009/10/17(土) 21:58:33
>>857
すばらしい!まさにやりたかったことはこれです
ありがとうございます

>>858
すみません、リファレンスを変数のリファレンスと勘違いしてました…
今気づきました…
861デフォルトの名無しさん:2009/10/17(土) 22:00:55
やっぱズレてたかw
解決おめでとう。
862デフォルトの名無しさん:2009/10/18(日) 02:18:58
さっきから試していたんだが、
もしかして、Class::Accessor::Fast::XSって継承効かないのか?
863デフォルトの名無しさん:2009/10/18(日) 18:57:25
この結果
@arytest = (1, 2, 3);

print @arytest; # 1
print "\n";
print "@arytest\n"; # 2

#2 のように""で括ると結果が空白区切りになるのですが、
これはそういうものなのでしょうか?
なぜこのような現象が起こるのでしょうか?
どこか規格で決められている等あるのでしょうか?
864デフォルトの名無しさん:2009/10/18(日) 19:12:12
perldoc perlvar の、$" 参照の事。

perl -le '$,="\t";$"="\n"; my @arr = (1,2,3); print @arr; print "@arr";'
865デフォルトの名無しさん:2009/10/18(日) 19:14:02
お世話になります。以下質問です。
ネットショップ立ち上げのために先日oscommerceをインストールしてみたのですが
しょっぱなからちゃんと動作しないなどの不具合が。
oscommerceはデータベースサーバなどと連携している分、不具合やエラーが出やすいかなと
思い、perl言語のみのルミーズカートcgiに興味を持ちました。
以前、perl言語のクイズ作成cgiを設置して何のトラブルもなくずっと使えていたのでcgi単独だと
安定して使えるのかなというイメージがあります。
ずばりルミーズカートならoscommerceよりも安定して管理できるでしょうか?
多少機能が劣っていてもシンプルな構成でトラブルが少なく扱いやすい物が一番と考えております。
個々の環境にもよるとは思いますが一般論でお答えいただければ幸いです。
866デフォルトの名無しさん:2009/10/18(日) 19:15:16
ありがとうございます!
$,="\t";
$"="\n";
特殊変数が関係したのですね
勉強になりました
867デフォルトの名無しさん:2009/10/18(日) 19:18:07
>>865
板違い、スレ違いです。Web Prog板の方へどうぞ。
perlのスレに直接行かず、くだしつなどに最初に行った方が良いですよ。
868デフォルトの名無しさん:2009/10/18(日) 19:20:34
>>867
すいません。
誘導ありがとうございます。
そちらで再度聞いてみます。
869デフォルトの名無しさん:2009/10/18(日) 19:35:10
$array[100] = 500;
print "$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つ分だけ動的に作成される、という事でしょうか?
870デフォルトの名無しさん:2009/10/18(日) 19:48:25
>>869
> arrayは一行目 array[100] = 500; の部分で行き成り100要素分
> 動的に作成されるという事でしょうか?

No

> 下の $hash{'100'} = 500; の部分ではハッシュなので要素数の
> 2つ分だけ動的に作成される、という事でしょうか?

No
871デフォルトの名無しさん:2009/10/18(日) 19:51:48
perlの配列が動的に、どのタイミングでいつ作成されたかどうかを調べるためにはどうすればいいでしょうか?
何かいいソフトとかありますか?
872デフォルトの名無しさん:2009/10/18(日) 20:55:10
perlの記号で検索してもなかなかひっかからない(^^;

$test = [10, 20, 30];
print "$test->[0]";

-> のような矢印演算子は無名ハッシュとか無名配列へアクセスするために
 用いられるという認識を持っていますが、その他つかわれる事がありますか?
 つかわれるようで、もし気が向きました方使用例のサンプルをぜひ見せてください。
873デフォルトの名無しさん:2009/10/18(日) 21:09:40
$test = [10, 20, 30];
print "$$test[0]\n";
print ${$test}[1];

print文にで二つ出力しています。意味的には等価らしいですが、
 {}で括る場合はどういうときですか?シンボリックリファレンスである
 ことを明示したいときでしょうか?
874デフォルトの名無しさん:2009/10/18(日) 21:24:09
x + y * z
x + (y * z)

意味的には等価らしいですが、()で括る場合はどういうときですか?
875デフォルトの名無しさん:2009/10/18(日) 21:26:29
気分
876デフォルトの名無しさん:2009/10/18(日) 21:51:27
>>872
$sub = sub (){ return 1};
print "ok\n" if $sub->();

>>873
ホントに?実験した?



入門書とか読んだ?
877デフォルトの名無しさん:2009/10/18(日) 22:02:32
>>876
ありがとうございます。
#入門書読んでません。知りたいところをちらちらネットで調べて繋ぎ合わせてます。
お金がないのでラクダ本が買えません。
878デフォルトの名無しさん:2009/10/18(日) 22:03:36
$sub = sub (){ return 1};
print "ok\n" if $sub->(); は関数ポインタみたいなもんですね、勉強になります
879デフォルトの名無しさん:2009/10/18(日) 22:05:05
html template使いたいんだけど
どっかにわかりやすいサイトない?

入れたはいいがどうやったら既存のデータベースから情報がとれるのかがわからん。。
880デフォルトの名無しさん:2009/10/18(日) 22:05:15
>>873は一応此方を参照にして等価とあったのでそのように認識しました
ttp://www.nozawashinichi.sakura.ne.jp/usingmt/2008/08/perl.html
881デフォルトの名無しさん:2009/10/18(日) 22:48:08
>>879
データベースから情報を取るのはDBIなりO/Rマッパーなりを使うんじゃないの?
HTML::Template他テンプレートエンジンは、必要な情報を全てまとめた後で使うものだと思うけど
882デフォルトの名無しさん:2009/10/18(日) 22:52:10
>>881

レス有難う御座います。
ちょっと表現の仕方がおかしかったです、すみません。
一応別の単体で動作するデータベース関連のプログラムがあるのですが、
それをどう組み込むかがよく分からないということです。。

ぐぐってみたのですが、どうもわからずに。。
883デフォルトの名無しさん:2009/10/18(日) 23:33:26
ちょっと質問なのですが、

my (@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 で全出力出来ないのでしょうか?
884デフォルトの名無しさん:2009/10/18(日) 23:40:47
いいかげんに RTFM
perldoc perldsc
perldoc perlref
perldoc perlop

ここらへんをコマンドプロンプトなりなんなりに打ち込んで勉強しろ

885デフォルトの名無しさん:2009/10/18(日) 23:42:25
コマンドプロンプトじゃねえよ、コマンドラインだよ
google でも良い
886デフォルトの名無しさん:2009/10/18(日) 23:55:18
>>884
わかりました。perldoc perlref に @{[mysub(1,2,3)]} みたいなんがあって
print @{["7", "8", "9"]}; が行けるかなぁ思って
print @{$rfary[0]}; やったら左で出来ました。
上記のサイトでもうちょっと勉強します。
887デフォルトの名無しさん:2009/10/19(月) 00:04:35
だから何で perl 初心者の備忘録で勉強すんの?w
my %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 の中にある。
888デフォルトの名無しさん:2009/10/19(月) 00:48:34
>>887
ありがとうございます。英語じゃない日本語のサイトもあったのですね(PCに本マニュアルもあると。
my %hash = { ... } ; 実行したら正しく出力されなかった…危ない所でした。
ご紹介頂いた参考にしながらラクダ買わなくてもある程度頑張れそうです。
これから勉強して少しずつ理解を深めてゆきます。
889デフォルトの名無しさん:2009/10/19(月) 10:22:28
>>884
横やりなのだけど、perldocの後にperlXXXXの何が来るかを調べたい時はどうにかする方法ないですか?
perldoc perlrefを知った時に便利だなぁと思ったのだけど、
他にどういうのがあるのか一覧を見たい
http://perldoc.jp/docs/perl/5.10.0/
ここ見たら一覧わかるんだけど、コマンドラインでperldoc使って出す方法があるんじゃないかなと思って。
890デフォルトの名無しさん:2009/10/19(月) 10:30:30
>>889
perldoc perl かもう少し詳しく知りたいときは perldoc perltoc
891デフォルトの名無しさん:2009/10/19(月) 11:10:45
>>890
おぉぉ。ありがとう。ここ半年悩んでことが解けました
892デフォルトの名無しさん:2009/10/19(月) 11:12:06
>>883
> ちょっと質問なのですが、

> my (@rfary) = ["7", "8", "9"];


これ間違いじゃね?
槍鯛のはこれだろ?

my @rfary = ("7", "8", "9");


あえてリファレンスを使いたいならかまわんが…

もしくはこれ。

my $rfary = ["7", "8", "9"];
893デフォルトの名無しさん:2009/10/19(月) 12:54:03
rfaryだからリファレンスの意図だろうよ
894デフォルトの名無しさん:2009/10/19(月) 13:56:13
どっかのサンプルを丸写しの可能性大
895デフォルトの名無しさん:2009/10/19(月) 18:16:02
JSON::XSについてなのですが、以下のようにすると index($js,'あ') が-1で返ってきます。
その下の正規表現についてはhitするのですが、これは何故なのでしょうか?

-----------------------
#!/usr/bin/perl -w
use JSON::XS;

my $js = JSON::XS->new->encode([ 'あ' ]);
print index($js,'あ'), "\n";
print $js =~ /あ/;
896デフォルトの名無しさん:2009/10/19(月) 18:24:15
->encodeがクサいな
プンプンにおいぜ
897デフォルトの名無しさん:2009/10/19(月) 18:46:29
質問です。
getoptsを使用して実行時にオプションを指定出来るようにしたのですが、
-f1や-f2といった2文字以上のオプションを使おうとしても認識してくれません。
2つのファイルを読み込ませるというスクリプトの仕様上、-fや-Fより-f1,-f2で指定する方がわかりやすいのですが
2文字以上のオプションを使うためにはどうすればよいのでしょうか。
898デフォルトの名無しさん:2009/10/19(月) 19:09:01
899デフォルトの名無しさん:2009/10/19(月) 20:07:31
>>897
Getopt::Std以外でデフォルトで入っているのはGetopt::Long だけのようですね…
ググったところ、日本語のドキュメントが見つかったので今から勉強します。
ありがとうございました。
900デフォルトの名無しさん:2009/10/19(月) 20:10:37
×>>897 ○>>898
失礼致しました。
901デフォルトの名無しさん:2009/10/19(月) 22:20:04
既存のPerlプログラムに特定のリファラからのアクセスのみ表示させて、その他は別のページに飛ぶようにしたいと思っています。
携帯での利用も考えているため、実際にリファラをとるわけにはいかないので
hiddenを利用しようと思っていますが、実際に出来るものなのでしょうか。
902デフォルトの名無しさん:2009/10/19(月) 22:42:08
ここじゃなくてWebプログラミング板で聞いてきなさい
http://pc11.2ch.net/php/
903デフォルトの名無しさん:2009/10/19(月) 23:38:24
>>902
誘導有難う御座います。
スレ汚しすみませんでした。
904デフォルトの名無しさん:2009/10/23(金) 19:26:59
環境はWinXP SP3です。
Devel::NYTProfなんですが、nytprof.outは出力してるんですが、
nytprofhtmlをしてもntyprof/index.htmlが作られないのはWin機だからでしょうか?
それとも環境PATH通す必要とかありますか?

実家に帰らないと戌が手元にない状態です。
905デフォルトの名無しさん:2009/10/23(金) 22:21:58
戌が?
906デフォルトの名無しさん:2009/10/23(金) 22:30:45
ペンギンのことだろ
907デフォルトの名無しさん:2009/10/24(土) 00:11:44
悪魔を飼ってみないか。
908デフォルトの名無しさん:2009/10/24(土) 00:14:51
まぁ確かに、国際条約からもレッドリストからも外れているキングペンギンなら
個人で飼うことも可能かもしれんが・・・
909デフォルトの名無しさん:2009/10/24(土) 01:35:55
ペンギンは戌じゃなくて酉だろ
910デフォルトの名無しさん:2009/10/24(土) 07:07:34
ペンギンは人鳥だな
911デフォルトの名無しさん:2009/10/24(土) 11:29:09
perlで構造体の配列を作る時、

%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 まで宣言しなければならないのでしょうか?
何かうまいやり方があったら教えてください
912デフォルトの名無しさん:2009/10/24(土) 11:29:59
perlで構造体の配列を作る時、

%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 まで宣言しなければならないのでしょうか?
何かうまいやり方があったら教えてください
913デフォルトの名無しさん:2009/10/24(土) 11:37:14
無名配列を知ってるなら、無名ハッシュも知ってるのでは?
$DataArray = [];
$DataHash = {};
914デフォルトの名無しさん:2009/10/24(土) 11:37:45
おーい、エスパー。
呼んでるよー。
915デフォルトの名無しさん:2009/10/24(土) 13:18:31
perl初心者板はどこでしょうか?
もしここでよかったら、次のプログラムの修正方法を教えてください!

&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";
}
}
916デフォルトの名無しさん:2009/10/24(土) 13:35:19
失礼しました。
[ %hash ]; を { %hash } にすればいいのかな…
自己解決です。>>913様の書き込みがヒントになったようです。
917デフォルトの名無しさん:2009/10/24(土) 13:41:01
[] を使った無名配列はシンボリックリファレンスにあたりますか?
ハードリファレンスにあたりますか?
918デフォルトの名無しさん:2009/10/24(土) 13:46:09
>>911-912
角カッコ [ ] は配列(無名配列という)を作ります。
波カッコ { } はハッシュ(無名ハッシュという)を作ります。

これらを組み合わせれば、幾重もの深い階層のデータ構造を作ることができます。

$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";
919デフォルトの名無しさん:2009/10/24(土) 14:14:08
ハードリファレンスにあたります。
920デフォルトの名無しさん:2009/10/24(土) 14:39:57
unix のハードリンクとシンボリックリンク
perl のハードリファレンスとシンボリックリファレンスは似たようなものですか?
要点からいえば何がハードリファレンスで何がシンボリックリファレンスか
一覧のようにまとめたサイトはありませんか?
名前でアクセスするのがシンボリックで、$$でアクセスするのがハードリファレンス??
さっぱり頭がこんがらがっています、気が向いた方助けてください
921デフォルトの名無しさん:2009/10/24(土) 15:00:41
シンボリックリファレンスが参照できるのはパッケージ変数だけだそうですが、
レキシカル変数(my)が参照できない理由はなにですか?
perlがそういう作りだから仕方ないのですか?

my $lemon = "yellow and sour!";
$fruit = "lemon"; # 変数名を変えてみる
print "$fruit is $$fruit\n"; #"yellow and sour!"; と表示されない

そんなの使っていて不便ではないですか?
922デフォルトの名無しさん:2009/10/24(土) 15:07:06
>>921
そんなニーズ誰もあると思わないだろ。
923デフォルトの名無しさん:2009/10/24(土) 15:07:48
まったく使わないから不便を感じない。
924デフォルトの名無しさん:2009/10/24(土) 15:08:04
はい
print "$fruit is ${$fruit}\n";
925デフォルトの名無しさん:2009/10/24(土) 15:09:59
${$fruit}は名前で参照しているからシンボリックリファレンスなんですか?
ハードリファレンスにあたるんですか?
926デフォルトの名無しさん:2009/10/24(土) 15:31:59
あぁ…調べててわかったんですが、多分ハードリファレンスなんでしょうね…
シンボリックリファレンス自体あまり使う事がないのか…
927デフォルトの名無しさん:2009/10/24(土) 15:36:25
お騒がせしました
928デフォルトの名無しさん:2009/10/24(土) 15:48:27
シンボリックリファレンスは、use strict下では認められてないです。
白魔術(黒魔術?)的に使うのであれば、局所的にno strict 'refs'として使えばいいと思います。
929デフォルトの名無しさん:2009/10/24(土) 15:54:25
ありがとうございます
930デフォルトの名無しさん:2009/10/24(土) 20:04:14
>>904
ActivePerl 5.10.1で試してみたけど出来たよ。
パスはC:\Perl\site\bin;C:\Perl\bin;だけど、この辺は標準だと思う。
931デフォルトの名無しさん:2009/10/24(土) 23:29:44
#my()はコンパイル時に処理される宣言文であるという
よりは実行時に処理される文である

という記述を見かけ以下を試してみました

#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はこういうもんなんですかね?
なんかしっくりこないです・・・
932デフォルトの名無しさん:2009/10/24(土) 23:43:41
cで同等のことを書いてもそうなるだろうよ。
933デフォルトの名無しさん:2009/10/25(日) 00:26:27
//01
int 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 は代入されて初めて実体をもったりするのかな…なんて
934デフォルトの名無しさん:2009/10/25(日) 01:25:49
アドレスがどうのという前に、プログラム言語の基本的な仕組みを
理解したほうが良いよ。
それじゃあ、伸びない。
935デフォルトの名無しさん:2009/10/25(日) 01:46:06
プログラム言語というのはperlの基本的な仕組み、という事ですか?
>>932の方と>>934の方が同じならばCで同等の事書いても同じじゃない気がするんですが…
perlにおいて、という事であれば確かにperl はインタプリタ言語で、
実行時にメモリに領域が確保されるというぐらいの認識しかないんですが
936デフォルトの名無しさん:2009/10/25(日) 01:51:35
>>931
最適化の仕業でしょ。
1)では配列を使い回せるけど、2)では新しく生成し直さないといけない
937デフォルトの名無しさん:2009/10/25(日) 01:55:03
>>935
2番目のどこが同じなんだよ。問題外。
938デフォルトの名無しさん:2009/10/25(日) 05:38:23
>>931
単純にガーベッジコレクションの話。

http://perldoc.jp/docs/perl/5.8.8/perlref.pod
> ハードリファレンスは賢く実際に参照されている数を管理していて、
> その数が 0 になれば自動的に解放を行ないます。

>>931の#1はループ脱出時に誰も参照してないから解放される。
#2は、$LoLが参照してるから解放されない。
939デフォルトの名無しさん:2009/10/25(日) 05:48:25
>>938
× ループ脱出時
○ ループの実行ブロック終端
だった
940デフォルトの名無しさん:2009/10/25(日) 11:17:47
perlのガベージコレクタは賢いんですね
941デフォルトの名無しさん:2009/10/25(日) 11:35:58
おまえよりはな
942デフォルトの名無しさん:2009/10/25(日) 19:14:52
sub f1 {
 my $last = pop @_;
 my $last2 = pop @_;
 my ($arg1, @options) = @_;
 ...
}
というコードがあるんですけど、これをもっときれいに書くとしたらどうしたらいいでしょか。
いやそんなキモい引数の渡し方をするなというのはその通りなんですけど、互換性をとるためにこんなことをしています。
そんで、なんかもっといい書き方がないかなーと思って質問しました。
my ($arg1, @options, $last2, $last) = @_;
でいけるかと思いましたが、これは
my ($arg1, @options) = @_;
my ($last2, $last);
と同じみたいでした。
943デフォルトの名無しさん:2009/10/25(日) 19:18:22
(?#text)
ってどんな時使うの?
944デフォルトの名無しさん:2009/10/25(日) 19:18:46
別の書き方はいろいろありそうだが、それより綺麗なのは思いつかんな
945デフォルトの名無しさん:2009/10/25(日) 19:19:08
>>943
正規表現に注釈を書きたいとき
946デフォルトの名無しさん:2009/10/25(日) 19:38:57
f1 は自由に編集して良いんだよね?
第二引数が、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 ) ;
947デフォルトの名無しさん:2009/10/25(日) 20:12:49
>>942
my @options = splice @_, 1, -2;
my($arg1, $last2, $last) = @_;
948デフォルトの名無しさん:2009/10/25(日) 23:49:36
my ( $arg1, $last2, $last, @options ) = ( @_[0,$#_ -1, $#_], @_[ 1 .. $#_ - 2 ] ) ;
…なんぼでもやり様はある罠。
949デフォルトの名無しさん:2009/10/26(月) 00:31:03
>>948
感動した。
引数が足りなかったときとか
課題は残るものの。
950デフォルトの名無しさん:2009/10/26(月) 00:33:29
>>948
スライスするなら何故分ける?
my($arg1, $last2, $last, @options) = @_[0, -2, -1, 1 .. $#_ - 2];
951デフォルトの名無しさん:2009/10/26(月) 02:33:56
>>942
配列を受け取るとそれ以後全部取ってしまうから
配列を渡す必要があるなら最後に取るかリファレンスで渡すかグローバル使うか
952デフォルトの名無しさん:2009/10/26(月) 03:26:40
>>951
そんなことわかってるだろ……
953デフォルトの名無しさん:2009/10/26(月) 04:49:05
>>946が好き。
互換性をとるというのがよく分からんので
この方法は利用できないのかもしれないけど
954デフォルトの名無しさん:2009/10/26(月) 09:41:35
>>950
Perlって何でもありだなあ。
長所であり短所でもある。
955デフォルトの名無しさん:2009/10/26(月) 09:52:15
仕事だとソースレビューされる時に好みで変更を強いられることがあるな
956デフォルトの名無しさん:2009/10/26(月) 13:17:26
質問お願いします。
catalystの質問なので場違いであればすみません。

sub a : Local{
my ( $self, $c ) = @_;
$c->forward('b');
}

sub b : Private{
my ( $self, $c ) = @_;
my $a = 'hogehoge';
}

sub bの$aの値をsub aで受け取りたいのですがどうすればいいでしょうか?
957デフォルトの名無しさん:2009/10/26(月) 14:53:26
同じクラスにする
958デフォルトの名無しさん:2009/10/26(月) 15:07:31
受け取るための変数をa側で用意してリファレンスをbにパラメタで渡すとか、
$c->{stash}使うとかその辺だろうか。
959デフォルトの名無しさん:2009/10/26(月) 17:17:44
> my $a = 'hogehoge';

ま、 $aは使うの止めれ
960デフォルトの名無しさん:2009/10/26(月) 17:26:07
$a,$bって何かあったよね?
961デフォルトの名無しさん:2009/10/26(月) 17:47:43
LWP で、Get したときに、存在しない url を入れていると 500 を返す
のですが、なぜ 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 ... (以下略)

と表示します。そういう仕様なんでしょうか
962デフォルトの名無しさん:2009/10/26(月) 17:50:28
そういう仕様。
963デフォルトの名無しさん:2009/10/26(月) 18:01:13
>>962
thnx そういう仕様ということで納得することにします

ブラウザは LWP 使っていないから 404 を返すってことでいいんですね?
404 返したい時に使えるモジュールなどあるのでしょうか??
964デフォルトの名無しさん:2009/10/26(月) 18:32:56
>>963
サーバーに繋がらないのとサーバー上にリソースが無いのとでは意味が違う
965デフォルトの名無しさん:2009/10/26(月) 18:52:20
>>964
なるほどそういうことか…なんとなく得心いきました、ありがとう
966デフォルトの名無しさん:2009/10/26(月) 19:15:47
http://www.hoge.ne.jp/って存在するから>>961のコードを実行するときちんとしたレスポンス
があるね。
967デフォルトの名無しさん:2009/10/26(月) 19:19:39
そういうときはexample.comつかえと
968デフォルトの名無しさん:2009/10/26(月) 19:20:07
きちんとしたレスポンスってのは言葉が悪い。
誤解を招く。
969デフォルトの名無しさん:2009/10/26(月) 19:23:20
example.comもホスト自体は存在するから200 OKが返ってくるがな
970デフォルトの名無しさん:2009/10/26(月) 19:28:36
example.comって、世界中のドメインの管理をしてるところがわざわざ持ってるんだなw
971デフォルトの名無しさん:2009/10/26(月) 19:28:51
>>969
hoge.example.com
972デフォルトの名無しさん:2009/10/26(月) 19:29:23
>>969
does-not-exist.example.com とか
973デフォルトの名無しさん:2009/10/26(月) 19:34:11
>>972
"nonexistent" という単語があってだな…
974デフォルトの名無しさん:2009/10/27(火) 13:50:36
use utf8 しながら
ttp://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フラグを取る設定方法がわかりません。
どなたか知りませんか?
975974: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
976デフォルトの名無しさん:2009/10/28(水) 13:22:38
このマッチした部分をevalして置換という処理をもっと
簡潔に書く方法はないでしょうか?

while ($a =~ /<%=(.*?)%>/) {
$result = eval($1);
$a =~ s/<%=(.*?)%>/$result/;
}
977デフォルトの名無しさん:2009/10/28(水) 13:42:05
>>976
s/<%=(.*?)%>/$1/gee;
でいけるでしょ。
978976:2009/10/28(水) 14:39:30
>>977
ありがとうございます。
979デフォルトの名無しさん:2009/10/28(水) 16:25:20
【画像あり】「同級生の女の子に頼んでみた」中学生ハメ撮りAVが流出 ★14
http://yutori7.2ch.net/test/read.cgi/news4vip/1256707678/



316406249999999
980デフォルトの名無しさん:2009/10/28(水) 18:20:07
変数を使って置き換えしたいんですが、$1にカッコ内が格納されません。
どうすればいいんでしょうか。
981デフォルトの名無しさん:2009/10/28(水) 18:24:09
エスケープをします
982デフォルトの名無しさん:2009/10/28(水) 18:37:13
>>981
取り消します。

変数を使って置き換えしたいんですが、変数の中の$1が展開されません。
どうすればいいんでしょうか。
983デフォルトの名無しさん:2009/10/28(水) 18:37:55
間違えました。
>>980でした……。
>>981さんごめんなさい。
984デフォルトの名無しさん:2009/10/28(水) 18:43:29
>>980 >>982-983>>976 ?
<%=***%>の***の中に$1という文字列が含まれているということ?
変換処理のコード
変換対象の文字列
どのような変換を期待していたか
実際にどう変換されたか
をまずは晒してください。
985デフォルトの名無しさん:2009/10/28(水) 18:51:30
>>976さんでは無いです。
s/$a/$b/g;
マッチ文字列と置き換え文字列をファイルから読み込んで、変数に格納して、マッチさせようと思ったんですが
置き換え文字列の$1が$1と出力され、展開されません。
986デフォルトの名無しさん:2009/10/28(水) 19:13:35
>>985
コードを全部晒しなさい
987デフォルトの名無しさん:2009/10/28(水) 19:33:09
open(LIST,"<list.txt");
@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;

こんな感じです。
988デフォルトの名無しさん:2009/10/28(水) 21:51:32
$1はどこに出てきてるの?
989デフォルトの名無しさん:2009/10/28(水) 22:10:15
print $cで出力したんですが、$c =~ s/$a/$b/g;で$bの中の$1が展開されず
$1のまま出力されました。
990デフォルトの名無しさん:2009/10/28(水) 22:27:20
>>989
こうしたらどうなりますか?

$c =~ s/$a/q{"}.$b.q{"}/gee;
991デフォルトの名無しさん:2009/10/28(水) 22:30:36
>>990
解決しました。
ありがとうございます。
992デフォルトの名無しさん:2009/10/28(水) 23:54:53
質問お願いします。

abc.def.ghi.というテキストがあったとして、
配列にabc. def. .ghiをそれぞれ格納したいのですが、やり方がわかりません。
何か良い方法があれば教えて下さい。
よろしくお願いします。
993デフォルトの名無しさん:2009/10/28(水) 23:59:41
splitを使えば良いんじゃないだろうか
994デフォルトの名無しさん
>>993
出来ました!
こんな簡単にできるとは思ってもいませんでした。
ありがとうございました。