Perlについての質問箱 41箱目at TECH
Perlについての質問箱 41箱目 - 暇つぶし2ch1:デフォルトの名無しさん
09/08/07 03:03:00
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: URLリンク(pc11.2ch.net))

CGI の質問は答えが Perl と全然関係ない話に帰着する場合が
多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

URLリンク(www.perl.org)
● 2009/08/07 現在の最新版: 5.10.0

▼ 前スレ
Perlについての質問箱 40箱目
スレリンク(tech板)

リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-6 あたり

2:デフォルトの名無しさん
09/08/07 03:03:43
[プログラミング自体の経験が無い奴はまずココを読め]
Perl プログラミング講座: URLリンク(www.site-cooler.com)

[本]
リャマ: URLリンク(www.oreilly.co.jp)
駱駝: URLリンク(www.oreilly.co.jp)
Effective Perl: URLリンク(www.ascii.co.jp) (修正)
クックブック: URLリンク(www.oreilly.co.jp)
Perl ベストプラクティス: URLリンク(www.oreilly.co.jp)
Perl Hacks: URLリンク(www.oreilly.co.jp)

[オンラインマニュアル]
最新のドキュメント: URLリンク(search.cpan.org)
perl5.8.x のドキュメント(一部): URLリンク(www.kt.rim.or.jp)
perl5.005_03 のドキュメント: URLリンク(www.kt.rim.or.jp)
日本語ドキュメント検索: URLリンク(www.cpan.jp) (停止中)
perldoc.jp: URLリンク(www.perldoc.jp)
perldoc.com: URLリンク(www.perldoc.com)

3:デフォルトの名無しさん
09/08/07 03:04:24
[モジュール]
CPAN.com: URLリンク(search.cpan.org)
河馬屋二千年堂: URLリンク(homepage3.nifty.com)

[テクニック]
Perl メモ: URLリンク(www.din.or.jp)
Perl のページ: URLリンク(homepage1.nifty.com)
Perl の小技: URLリンク(homepage3.nifty.com)

[Perl 5.8 Unicodeメモ]
URLリンク(www.rwds.net) (修正)
URLリンク(www.namazu.org)
URLリンク(www.lr.pi.titech.ac.jp)

4:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/07 03:05:45
[過去スレ1]
1 URLリンク(pc.2ch.net)
2 URLリンク(pc3.2ch.net)
3 URLリンク(pc2.2ch.net)
4 URLリンク(pc2.2ch.net)
5 URLリンク(pc5.2ch.net)
6 URLリンク(pc5.2ch.net)
7 スレリンク(tech板) (事故により消滅)
8 スレリンク(tech板) (事故により消滅)
9 スレリンク(tech板)
10 スレリンク(tech板)
11 スレリンク(tech板)
12 スレリンク(tech板)
13 スレリンク(tech板)
14 スレリンク(tech板)
15 スレリンク(tech板)
16 スレリンク(tech板)
17 スレリンク(tech板)
18 スレリンク(tech板)
19 スレリンク(tech板)
20 スレリンク(tech板)

6:デフォルトの名無しさん
09/08/07 03:06:26
[過去スレ2]
21 スレリンク(tech板)
22 スレリンク(tech板)
23 スレリンク(tech板)
24 スレリンク(tech板)
25 スレリンク(tech板)
26 スレリンク(tech板)
27 スレリンク(tech板)
28 スレリンク(tech板)
29 スレリンク(tech板)
30 スレリンク(tech板)
31 スレリンク(tech板)
32 スレリンク(tech板)
33 スレリンク(tech板)
34 スレリンク(tech板)
35 スレリンク(tech板)
36 スレリンク(tech板)
37 スレリンク(tech板)
38 スレリンク(tech板)
39 スレリンク(tech板)
40 スレリンク(tech板)

7:デフォルトの名無しさん
09/08/07 07:25:46
前スレの>>232を実行しましたが、hogehogeとしか出力しません。
どこかおかしくはないでしょうか?

Perlについての質問箱 40箱目
スレリンク(tech板: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:デフォルトの名無しさん
09/08/07 08:01:38
>どこかおかしくはないでしょうか?
前スレで色々指摘されてんじゃん。


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

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


>>1


9:デフォルトの名無しさん
09/08/07 08:14:53
>>8

動きました。

10:デフォルトの名無しさん
09/08/07 10:20:01
Programming Perlの新しい版はいつでるの?

11:デフォルトの名無しさん
09/08/07 10:49:17
あれは多分
package config;
use strict;
sub param {
 return {
  hoge => 'abcdefg',
  fuga => '12345',
 }->{$_[0]};
}
1;
こういう事をしたかったんだろうね。
でもこれ呼び出す度に変数定義コストが掛かる上に例え同じkeyでも
違うアドレスの値を返すという駄目の見本のようなコード

12:デフォルトの名無しさん
09/08/07 10:54:29
>>10
Perl6が出てから半年後ぐらいじゃないの?

13:デフォルトの名無しさん
09/08/07 14:16:58
Configは素直にYAML使え。
コスト?知らんがな。

14:デフォルトの名無しさん
09/08/07 15:13:10
前スレのあいつは酷かったな。頭悪いレスしか書けないのになんで
あんな人を馬鹿にした態度なんだろ。
あのレベルでPerlを生業としてるとはとても思えない。

15:デフォルトの名無しさん
09/08/07 15:36:15
すいません、質問があります。

GetOptions使用時に
GetOptions( "startup|first!" => \$startup ,
のようにパイプラインが使われていることがあるのですが、
どういう意味があるのですか?

16:デフォルトの名無しさん
09/08/07 15:41:31
>>15
URLリンク(search.cpan.org)

17:15
09/08/07 16:14:52
ああ、どっちもいけるってことですか。

ありがとうございます。

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

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

よろしくお願いします。


19:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/07 18:22:49
>>19
オブジェクト指向について勉強しなおすといいと思うよ。

21:デフォルトの名無しさん
09/08/07 18:23:27
>>18
STDOUTを書き換えればできたと思う。
ソース、おぼろげな記憶。

22:デフォルトの名無しさん
09/08/07 18:25:15
当てずっぽうで書いて動かないから質問する

23:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/07 18:49:47
あーselect STDOUTっての要らないから取っといて。

26:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/07 19:04:28
>>26
うおーそれ見ると俺完全にズレてるな。精進しねーと。thx。

28:デフォルトの名無しさん
09/08/07 20:47:08
>>23-27
どうもありがとうございます。さっそく試してみます。



29:デフォルトの名無しさん
09/08/07 20:49:04
>>26
ob_get_clean()のなかでMEMをcloseしてないようですが、close(MEM) をいれたほうがいいですか。
それともなくてもかまわないでしょうか。

30:デフォルトの名無しさん
09/08/07 21:29:32
Data::Dumper よりもっとコンパクトに表示できるライブラリはないでしょうか。
Data::Dumperの表示は
$VAR1 = [
'A',
'B'
  ];
こんなかんじなので、['A', 'B'] みたいにコンパクトに表示してくれるライブラリを探しています。
ちょうどRubyのinspectみたいなのが希望です。

31:デフォルトの名無しさん
09/08/07 22:05:05
>19
URLリンク(search.cpan.org)

>30
$Data::Dumper::Indent = 0;

32:デフォルトの名無しさん
09/08/07 22:24:17
>>31
さんくすです

33:デフォルトの名無しさん
09/08/08 11:16:10
これ↓、入札者が一人しかいなかったので高いのかなーと思ったけど買いでしたかね?

Perlベストプラクティス - Yahoo!オークション
URLリンク(page11.auctions.yahoo.co.jp)

34:デフォルトの名無しさん
09/08/08 11:44:14
こないだブクオフで500円で買ったやつだな。

35:デフォルトの名無しさん
09/08/08 18:17:21
先日のDoS攻撃でTwitter陥落してから、Net::Twitterが動かないのですが
何か仕様変わったんですかね?

36:デフォルトの名無しさん
09/08/12 13:57:10
これって何で0って表示になるんですかね?

%hash = (hash-key1 => 0, hash-key2 => 2);
print keys %hash; #=> 0

37:デフォルトの名無しさん
09/08/12 14:12:15
hash-key1は hash - key1で、数値コンテキストでは数に見えない
文字列は0だから、0 - 0で0。hash-key2も同じ。

38:デフォルトの名無しさん
09/08/12 14:12:59
use strict使えよ

39:デフォルトの名無しさん
09/08/12 14:19:12
>>37


40:デフォルトの名無しさん
09/08/13 20:17:58
>>35
スクリプト対策されたんじゃね?
もしくはHTTPヘッダを精査されてるとか
リファラーがないと無効なページがあるとか?

41:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/14 18:36:05
わたしは自分で確認することは絶対にしません。

43: ◆TWARamEjuA
09/08/14 19:31:50 BE:1089252-BRZ(10072)
ちなみに2ちゃんねるのトリップ回路は改正されたですよ♪

【堅牢】トリップの新方式を考えてみませんか【互換性】 ★2
スレリンク(operate板)l50

44:デフォルトの名無しさん
09/08/14 20:03:13
>>41
そう。だから$saltにはstがはいってる。
なんでH.を連結してるのかよくわからんけど

45:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/15 17:55:49
>>45
decodeしてsplitして必要なら先頭要素を読み飛ばして再度encode

47:デフォルトの名無しさん
09/08/16 11:12:17
下記サイトに従って、半角カタカナをmime_encodeしたのですが、元に戻すと全角カタカナに
なってしまいます。
どうすれば半角カタカナをうまくmime_encodeできるでしょうか?

URLリンク(isoya.at.webry.info)

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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/16 15:57:38
>>45
utf8でブロック使え。あるいはEUC-JPで\x20-\x7F拾え。
>>47
ISO-2022-JPに半角カナなんてないから。
それで半角カナにエンコードできる実装はカス(それが読めるメーラーも含めてな)。

50:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/17 00:29:28
しかし日本語関係のトラブル多いな
がちがちに防御した書き方しなくても、
perlが手抜きしてなければ動くのに

52:デフォルトの名無しさん
09/08/17 01:55:47
てすと

53:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/17 08:41:38
>>53
> "$jp 日本語\n"; # 文字化けする。
> "$jp"; # 大丈夫
> "日本語"; # これも大丈夫

日本語がEUCかSJISになってる

55:デフォルトの名無しさん
09/08/17 08:44:50
>>46
>>49-50
ありがとうございます。
utf8にdecodeしてから処理すればいいんですね。


56:デフォルトの名無しさん
09/08/17 09:05:20
>>53
$jpが本当にUTF-8かあやすぃ
jcode.plとか何でもいいけど
文字コードをちゃんと調べてみるべき

57:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/17 09:59:51
>>54
vimでutf8モードで保存してます。
>>56
確認済みです。ちなみにprintだとutf8と混在で表示できてます。
printだとうまく行くんですが、XML::RSSだと通らないという
不思議な現象に悩まされてます。
そもそもXML::RSSが実体参照を吐いて生UTF-8を吐いてくれません。

59:デフォルトの名無しさん
09/08/17 10:04:49
>>57
なんか不思議なことしてないか?

60:デフォルトの名無しさん
09/08/17 15:56:11
>>57
何がしたいのかさっぱり分からん・・・・。
ISO-2022-JPは半角カナ含まないっつってるのに宣言してるし、
EncodeのMIME-Headerを根本的に勘違いしてる気がするし、
それじゃデコードしても文字化けするだけだと思われ。

61:デフォルトの名無しさん
09/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

62:61
09/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:デフォルトの名無しさん
09/08/17 19:41:48
>>60
試しに、>>57でエンコードしたのをWindows Live MailやGmailで受信してもうまくデコートして
半角カナを表示した。

メール業界的には半角カナを認めてるってことか?

64:デフォルトの名無しさん
09/08/17 20:54:34
認めるとか、認めないとか、そういう問題じゃない。
浮気相手の子供だから認知しない、と言われても
生まれてしまった子は育てないわけにはいかないだろ。

65:デフォルトの名無しさん
09/08/17 21:09:16
ISO_2022_JPは進駐軍が勝手に決めた規格。
日本語を知らないヤツらが日本語の規格を決めたのだから使い勝手が悪いのは仕方ない。
そこでマイクロソフトはSI/SOコードで半角カナに切り替えられるよう拡張した。
このISO_2022_JP_MSは、マイクロソフトという一企業のローカルルールなわけだから
他のOS(UNIXとか・・・)が従う義務は当然無い。
しかし、デスクトップ アプリケーション分野でメシを食ってる企業にとって
Windowsという巨大市場を無視するわけにはいかない。
認めるとか認めないとか、そういう以前に
半角カナは、今そこにあるわけだから。
半角カナを捨てるということは、Windowsを捨てることと同じなんだよ。

66:デフォルトの名無しさん
09/08/17 21:29:09
すごい。スミからスミまで全部デタラメ。

67:デフォルトの名無しさん
09/08/18 02:37:03
倒置構文のifの後にカッコがくる場合には最初のカッコが閉じるまでが反映されるとかそういうルールってありませんでしたっけ?
print "ok\n" if (0) or (1); #=> ok
これが直感的な答えと違う動作をするような気がしてたのですが

68:デフォルトの名無しさん
09/08/18 02:55:18
>>67
if 修飾子は制御構造。or は演算子。基本からやり直せ。
URLリンク(perldoc.jp)
URLリンク(perldoc.jp)

69:デフォルトの名無しさん
09/08/18 03:02:54
UTF8つかえ

70:デフォルトの名無しさん
09/08/18 03:22:40
>>68
違うんです
Perl のパーサの仕様でif文の後に(が来た場合に予期しない動きをすることがあると思い込んでたんです
で、実験をしてみたところ予想に反してうまく動いたので何か他のものと勘違いしてたのではないかという結論に至ったのです
そんでうまく絞り込めるような検索ワードが思いつかなかったのでここで聞いてみたのです
何か心当たりないですか?

71:デフォルトの名無しさん
09/08/18 04:36:42
>if文の後に(が来た場合に予期しない動きをすることがある
あるわけないだろw

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


検索はしても、パーサーの詳細なんてきっと出てきません。
あえて言うならドキュメントのどっかに書いてあるかもしれません


72:デフォルトの名無しさん
09/08/18 04:42:38
0x5C文字に関することです
ファイルから読み込んだ文字列を出力するのですが、その際能やソ等の文字を能\、ソ\という風に置き換えたい、
そういう時はどういう風に記述すればいいですか?

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

検索してみてもヒットする量が膨大すぎて思うような回答を見つけることが出来ませんでした。


73:デフォルトの名無しさん
09/08/18 06:12:43
>>72
my @char_5c =
qw(― ソ Ы Ⅸ 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄 兔
喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 偆 砡 纊 犾 );

my $re_5c;
$re_5c .= "\Q$_\E|" for @char_5c;
chop $re_5c;

my $str = "~~~~";
$str =~ s/($re_5c)/$1\\/g;

74:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/18 07:00:04
>>72-74
URLリンク(homepage1.nifty.com)
何に出力するのにそんな付け足しが必要なのかは分からんが

76:デフォルトの名無しさん
09/08/18 07:14:53
>>65
おま・・・・・。
半角カナは弊害が多すぎて日本人の権威たる村井先生達がわざわざISO-2022-JPから
削っていただいてくれたわけだが。

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

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

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

>>72
んなことする前にEncode覚えろ。

77:デフォルトの名無しさん
09/08/18 07:17:03
あー今はUnicodeになってんのかな内部的には。
Unicodeには半角カナあるからな(文字コードが字幅を制限するってのが
いまいち理解に苦しむが)。

78:デフォルトの名無しさん
09/08/18 08:49:31
>>65ほど全行がいちいちデタラメな文章も珍しいな・・・。

79:デフォルトの名無しさん
09/08/18 09:41:36
なんだ村井ってのは?進駐軍の手先か?
研究室に小森っきりで実社会を知らないヤツのオナニーに付き合わされちゃタマランよ。

80:デフォルトの名無しさん
09/08/18 10:28:20
Perlで、ディレクトリ名とファイル名のjoinはどうやるのでしょうか。
今は "$dirname/$filename" としているのですが、これはWindowsでも期待通りに動きますか。
ちなみに「perl join」でぐぐったら、配列のjoinばかりでてきました(当然か)。
よろしくお願いします。

81:デフォルトの名無しさん
09/08/18 10:45:03
半角カナ以外にも「~」なんかのunicodeへのマッピングが統一されてないとか
日本語の文字コードは滅茶苦茶で先人達はほんと何やってたんだよって感じ。
負の遺産押し付けないで欲しいわ~。こんなのでもなんとか扱えるように
perlがんばったなとは思うけど。

82:デフォルトの名無しさん
09/08/18 11:26:17
>>80
URLリンク(search.cpan.org)
> DOS, OS/2, VMS, VOS, and Windows can work similarly to Unix with / as path
> separator, or in their own idiosyncratic ways

83:デフォルトの名無しさん
09/08/18 11:42:53
>>79
URLリンク(ja.wikipedia.org)
でも読んでろ。業界の常識だぞ。

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

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

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

スレチスマソ。

84:デフォルトの名無しさん
09/08/18 11:57:22
>>82
thank you very much.

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

["foo", "bar", "baz"]
に展開してくれるような関数はありませんか。
「perl flatten」でぐぐったけどそれらしいのは見つからず。

85:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/18 12:10:37
>>84
Perlの調べ物にGoogleなんかを使うから見つからんのだ
URLリンク(search.cpan.org)

87:デフォルトの名無しさん
09/08/18 12:16:12
>>86
URLリンク(search.cpan.org)
俺のコードの劣化版でワロタ。

88:デフォルトの名無しさん
09/08/18 12:26:36
>>87
ソース見たら、これだけだねw
sub flat(@) {
return map { ref eq 'ARRAY' ? @$_ : $_ } @_;
}

これを再帰させて中まで展開すれば>>84の答になるか
sub flat(@) {
return map { ref eq 'ARRAY' ? flat(@$_) : $_ } @_;
}

89:デフォルトの名無しさん
09/08/18 12:27:54
ていうか、それが>>85だな

90:デフォルトの名無しさん
09/08/18 12:46:58
>>85-89
おおーさんくすです。

91:デフォルトの名無しさん
09/08/18 13:01:19
>>85
my @foo; はどんな意味があるんですか?

92:デフォルトの名無しさん
09/08/18 14:21:34
>>91
残骸です。見なかったことにしてください。

93:デフォルトの名無しさん
09/08/18 14:35:44
>>92
了解

94:デフォルトの名無しさん
09/08/18 14:47:06
>>88
>sub flat(@) {
>return map { ref eq 'ARRAY' ? flat(@$_) : $_ } @_;
>}

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

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



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

つまりmapの { } が返すのは、スカラーでも、配列でも、ハッシュでもなんでもok
最終的にぜんぶフラットに連結されて1つのリストになる。

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



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

嘘は良くない

98:デフォルトの名無しさん
09/08/18 16:46:51
すいません、質問します。

my $tmp_os_info = $^O;

この記述の $^O; とはいったい何を表しているんでしょうか?
ビット演算で ^ を使うというのまでは分かったんですが、そのような動きを
していそうにも見えません。


99:デフォルトの名無しさん
09/08/18 16:49:47
<img src="xx">のxxを抽出するにはどうしたらいいですか?

100:デフォルトの名無しさん
09/08/18 17:02:25
1.正規表現を使う
2.正規表現を使わずに文字列を検索する

101:デフォルトの名無しさん
09/08/18 17:09:45
>>98 「perl 特殊変数」でググレ

102:デフォルトの名無しさん
09/08/18 17:29:02
>>101
ありがとうございます!

103:デフォルトの名無しさん
09/08/18 18:07:00
map { } @list
のように、クロージャ(?) をとる関数はどうやって定義すればいいですか。

104:デフォルトの名無しさん
09/08/18 18:30:09
>>79
その実社会を知らないオナニー野郎呼ばわりの村井純がいなければ、
今の日本のインターネットは無いも同然なわけだが…。

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

まあ、アプリケーション層の人間から見れば、また違った感想なのかも
しれないけど。

105:デフォルトの名無しさん
09/08/18 18:34:59
>>103
プロトタイプで&

List::UtilモジュールのList/Util/PP.pmとか参考にするといいんじゃないかな。

106:デフォルトの名無しさん
09/08/18 21:59:56
すいません。PerlでRubyのpにあたるものは何ですか?
配列の配列をデバッグ出力したいんですけど。

107:デフォルトの名無しさん
09/08/18 22:54:04
Data::Dumper

108:デフォルトの名無しさん
09/08/18 23:05:26
>>107
ありがとうございます。

109:デフォルトの名無しさん
09/08/19 01:47:22
>>99
正規表現を使うか
indexとsubstrで抽出するかって感じ

普通に正規表現が簡単

110:デフォルトの名無しさん
09/08/19 01:51:30
>>108
Data::Dumper より YAML のが便利
タイプが少ないしなによりログ取りたいときに出力が簡単

111:デフォルトの名無しさん
09/08/19 09:24:47
>>99
Web::Scraper。

>>104
最近の若いのは村井純(とその大いなる功績)も知らないのな。
ISO-2022-JPから半角カナを省いたのはどう考えても正解だろ。
半角カナなんて弊害ばかりで互換性とAA以外に何か存在意義があるわけ?

112:デフォルトの名無しさん
09/08/19 10:18:56
LWP::UserAgentを使ってHTTPリクエストを送信すると
TE: deflate,gzip;
が勝手に付加されてしまい、レスポンスがgzip圧縮で返ってきてしまいます
gzipの変換で不要なトラブルに遭いたくないのでTE: deflate,gzip;を付加しないようにしたいのですが、どうすればよいでしょうか

113:デフォルトの名無しさん
09/08/19 10:53:41
>>111
結局規格なんか決めても世の中が従わなかったら失敗なんだよな。
混乱がよけいひどくなっただけ、という見方もできる。そしてこれだけの
AAが生み出された今となってはAAを保存できないISO-2022-JPは
イマイチだな。過去の遺物でいんじゃね?

114:デフォルトの名無しさん
09/08/19 10:56:30
>>111
そいつがAA級戦犯か!

115:デフォルトの名無しさん
09/08/19 11:21:30
>>112
use LWP::UserAgent;
push(@LWP::Protocol::http::EXTRA_SOCK_OPTS, SendTE => 0); #最初に実行しとく

ネットで見つけて使ってるけど、これでほんとにいいのか俺もよくわかってないw

116:デフォルトの名無しさん
09/08/19 11:30:50
>>105
サンクスです。プロトタイプなんてPerlにあるんですね。



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

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

>>114
だれうま。

118:112
09/08/19 16:00:59
>>115
無事TE:を消すことができました!
ありがとうございました

119:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/19 17:17:35
携帯のメールって半角カナを送信できないのかな?
携帯を持ってないから確認できないや。

121:デフォルトの名無しさん
09/08/19 17:45:07
>>119
>>1

122:デフォルトの名無しさん
09/08/19 17:54:51
>>120
携帯はキャリア内ならそのまま出せるんじゃないかな?
RFCに準拠しないメールアドレスとかもOKなぐらいだし。

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

>>111
ついでにAAも頼む。

123:デフォルトの名無しさん
09/08/19 18:11:59
>>121
おうふ
申し訳ない、いってきます

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

ちなみにPythonだと組み込み関数を上書きしても、もとのを __builtins__.map() のような感じで呼び出せるので、
同じことがPerlでもできるのではないかと思い、質問しました。

125:デフォルトの名無しさん
09/08/19 19:49:53
>>124
URLリンク(search.cpan.org)
> 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:デフォルトの名無しさん
09/08/19 21:08:33
>>124
read()
という関数を呼び出すとき、
&read()にすると自作関数
read()にすると組み込み関数が呼び出される

127:デフォルトの名無しさん
09/08/19 21:53:38
>>124
CORE::hoge でもいけるよ

128:デフォルトの名無しさん
09/08/19 23:41:28
>>124
&mapとmap()は別に認識されるのでは?

129:デフォルトの名無しさん
09/08/20 04:40:38
&での呼び出しはプロトタイプ無視と引数自動設定の二大うんk仕様があるんじゃなかったっけ?
あと、宣言位置がおかしくてもむりくり呼び出される仕様。

間違ってたらすまん。

130:デフォルトの名無しさん
09/08/20 08:37:17
>>129
再現させてみてないけど、ちょっと前C書いてた手癖で
sub xxx(){ ... } って書いちゃったけど普通に引数受け取ってたってことがあったな。
これって仕様か?

131:デフォルトの名無しさん
09/08/20 11:36:26
>>125-129
ありがとうございました。CORE::map() で呼び出せました。

132:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/20 13:30:36
>>133
了解しました。ありがとうございます。

135:デフォルトの名無しさん
09/08/20 13:55:12
Perlのglob()は '**/*.pm' のような、zshライクな書き方はサポートしてないのでしょうか。
もしそうなら、'**/*.pm' のような書き方をサポートした関数やライブラリがあればおしえてください。

136:デフォルトの名無しさん
09/08/20 14:02:44
>>135
URLリンク(search.cpan.org)

137:デフォルトの名無しさん
09/08/20 15:24:28
>>136
ありがとうございます。

138:デフォルトの名無しさん
09/08/20 21:25:52
>>130

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

でパッケージ内でしか呼び出さんかったら普通に動いて
パッケージ外で呼び出すと@hugaには第三引数しか入らんというわけわからん仕様につい最近悩まされた記憶がある

139:デフォルトの名無しさん
09/08/20 23:34:50
すこしおじゃまします。
ここで聞いてよいかいまいちわかりませんが・・・

現在、Perl+XercesでXMLを処理しています。
XMLデータが変数(ex. $xml)に文字列として格納されている場合、
それをDOMParserに渡して、パースする方法を
教えていただけないでしょうか。

$parse = XML::Xerces::DOMParser->new();
$parse->parser($xml);
こう書いてしまうと、上手くパースしてくれず、
InputSorce系のクラスを使えばパースできるような記述までは
JAVAやCのソースから推測できるのですが、
Perlについての記述が少なすぎて、
どう使ってよいのか(書式やクラスの指定など)
分からず悩んでいます。

140:129
09/08/21 12:18:18
>>130
俺も試してないけど、呼び出すときに &sub としたなら、しっかりプロトタイプが無視されてる

141:デフォルトの名無しさん
09/08/21 13:33:29
ソースコードを見ながらブレイクやステップでデバッグをするのって無料だとEclipseしかないですかね?

142:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/21 18:28:32
連投、申し訳ないです。

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

上記2つの違いは何なのでしょうか?

144:デフォルトの名無しさん
09/08/21 18:39:15
>>143
"を省略しただけ

145:デフォルトの名無しさん
09/08/21 19:24:14
>>142
変数名にはハイフンを使えないが、ハッシュのキーにはそのような制限は無い。

146:デフォルトの名無しさん
09/08/21 19:53:25
>>144さん、>>145さん
ありがとうございました!

147:139
09/08/21 23:56:56
質問しといて、事故解決したのでとりあえず報告
$mem = XML::Xerces::MemBufInputSource->new("$xml",length($xml));
を追加して
$memをパーサに食べさせれば無事パースできました。

148:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/22 01:26:38
@passed_s = (3, 4, 5, 6); @passed_t = (6, 5, 4, 3); # この例での結果
でした。

150:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/22 13:32:03
>>151
配列スライスでできそうに思っていたけど、思いつかなかったんだ。
ありがとう。

頭が錆びてきているのかな。。。

153:デフォルトの名無しさん
09/08/23 19:12:47
てす

154:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/26 12:24:55
Perlにはサブルーチンの数に制限がありますか?

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

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

個々のサブルーチンについては、特にエラーは出ないのですが…

156:デフォルトの名無しさん
09/08/26 12:48:03

補足です。requireはメインルーチン文頭に条件分岐なしで記述してあります。

157:デフォルトの名無しさん
09/08/26 13:05:39
>>155
>Perlにはサブルーチンの数に制限がありますか?

Perlよくしらないけど、ないんじゃないかなあ。
問題は別のことが原因だとおもう。たとえばサブスクリプトで同じ名前の関数を
定義しているために、読み込む順番によって上書きされたりしなかったりとか。

158:デフォルトの名無しさん
09/08/26 13:16:20
>>154
URLリンク(fireball.loafer.jp)

159:デフォルトの名無しさん
09/08/26 13:34:53
手さぐりしてないで、有効なサブルーチンをリストしてみれ。

160:デフォルトの名無しさん
09/08/26 13:51:20
>>158
アロー演算子の後のスカラー変数は動的なメソッド呼び出しをするという機能なんだ。
賢くなった。


161:デフォルトの名無しさん
09/08/26 15:53:12
>>157
まさにその通りでした…(恥)orz

162:デフォルトの名無しさん
09/08/26 15:54:32
申し遅れました、>>157さん・>>159さん、ありがとうございましたm(_ _)m

163:デフォルトの名無しさん
09/08/27 12:05:48
なぜハッシュリファレンスへのアクセスで、従来と似たような$href{one}としないで、
$href<one>と山括弧にしたのですか?

404 Blog Not Found:perl - $@%&*のよしあし
URLリンク(blog.livedoor.jp)

164:デフォルトの名無しさん
09/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

全文
URLリンク(textup.no.land.to)


165:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/29 00:51:28
>>4 を読め

167:デフォルトの名無しさん
09/08/29 08:57:56
>>164
1. t/以下を読んで原因を探って解決。
2. バギーでも少々動けばいいやと思うなら cpan -if Test::Simple。

168:デフォルトの名無しさん
09/08/29 13:02:19
>>166
>>4は読んでますけど関係無いですよね?
Dos窓はきちんとutf8で動かしてるし、単純にutf8なソースの中で正規表現を使う方法だけ知りたいんです。

169:デフォルトの名無しさん
09/08/29 13:45:53
読みかたが足らん。100回読め。>>4を100回読め!
自分のコードと、どこがどう違うか
1行1行しっかり吟味しろ

170:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/29 17:57:40
>>171
配列に37文字組み込んでってことですね
大変参考になりました
即レス頂きありがとうございました!

173:デフォルトの名無しさん
09/08/29 20:27:12
どうでもいいけど、プロは a = a++ なんてコードは書かない

174:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:名無しさん@そうだ選挙に行こう
09/08/30 04:22:41
どうでもいいけど、プロは$aと$bにmyは付けないw

178:名無しさん@そうだ選挙に行こう
09/08/30 05:30:03
お前の発言の方がどーでもいいわw
ざっと探してみたけどperlじゃ36進数のサンプルないぞ
さすがにCとVBはあったけど
で、37進数やろ
お前が37進数やってみればいいやろプロさんwww

179:名無しさん@そうだ選挙に行こう
09/08/30 06:42:37
$aが特殊変数である事実が、どうでも良い取り扱いな訳ないだろ。


180:名無しさん@そうだ選挙に行こう
09/08/30 12:09:26
$a <=> $b と書いて、しまったソートが逆だった、という時に、
最小の労力で逆転させるにはどうすれば

181:名無しさん@そうだ選挙に行こう
09/08/30 12:37:25
下記サイトにある、

\*import = cgi_fixup();

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

URLリンク(blog.livedoor.jp)

182: ◆TWARamEjuA
09/08/30 13:59:59 BE:3812257-BRZ(10101)
>>180
reverse

183:名無しさん@そうだ選挙に行こう
09/08/30 14:15:03
reverseってコンパイラ的には読む方向を変えてるだけなんだろうか

184:名無しさん@そうだ選挙に行こう
09/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:名無しさん@そうだ選挙に行こう
09/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:名無しさん@そうだ選挙に行こう
09/08/30 19:22:46
Unrecognized character \x81ってエラーが出ていたら笑ってやる

187:デフォルトの名無しさん
09/08/30 23:11:59
>>186
ごめん、その通りなんだ
初めていじるので全く意味がわからない・・・


188:デフォルトの名無しさん
09/08/30 23:30:43
出たことあるなあ
漢字についての取り扱いでよそからコピペした時だったので、
しばらく悩んだ

189:187
09/08/31 00:00:57
自己解決しました

190:デフォルトの名無しさん
09/08/31 22:24:36
perl初めたばかりだけど
基礎らしい二分検索のプログラム書こうとチャレンジしてるんだが方法が思いつかない。

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

一応検索で該当箇所見つけ出してそこに1行突っ込む、って部分は出来たんだけど……


191:デフォルトの名無しさん
09/08/31 22:26:48
二分検索のアルゴリズムが理解できてないのか?
perlの文法がわからなくてプログラムコード化できないのか?

192:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/31 22:44:24
>>191 二分探索は
 ソートされているデータを、まず要素の真ん中で検索し、比較対象が上か下か調べる
 それを更に上と下で区切ったほうのさらに真ん中で同様の処理 
 繰り返し最後の値が見つけ出すまでやる・・・・で良かったかな

 配列取り込んで、配列の数出して、
 それを1/2してまではなんとかなるけど、
 そこから先、どのように書いたらいいかが見当付かないんです・・・・

194:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/01 01:10:58
>>193
そこまで分かってるなら、あとはコーディングするだけじゃん。
perlの文法がわからないの?
だったら入門書や解説サイトを読めばいいやん。

196:デフォルトの名無しさん
09/09/01 01:47:37
>>195
if関数で ひたすら大か小かで判定するかしか思い浮かばなくて……

 whichでその大か小かの判定だけさせた無限ループにして
 一致した時点でlastで抜ける みたいな感じでいいのでしょうか……

197:デフォルトの名無しさん
09/09/01 01:52:53
思い浮かんだなら形にしてみ

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

Perl Internalsについて - Unknown::Programming
URLリンク(d.hatena.ne.jp)

Internals::HvREHASH
Internals::SvREADONLY・・・これはわかった
Internals::SvREFCNT・・・これもわかった
Internals::hash_seed
Internals::hv_clear_placeholders
Internals::rehash_seed


200:デフォルトの名無しさん
09/09/02 09:52:55
>>199
hash_seedはハッシュDBの構造が理解できれば何のことかすぐわかるはず。

201:デフォルトの名無しさん
09/09/02 22:07:37
ハッシュの配列について質問があります

例えば、
my %hogehoge;

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

されたものがある場合、どうやって$hogehoge{pos}を表示すればいいのでしょうか?

202:デフォルトの名無しさん
09/09/02 22:37:25
こうするか
foreach (@{$hogehoge{pos}}){
print $_;
}
あるいは
$hogehoge{pos}->[0]; # 連番で


203:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/04 09:53:49
>>202
print "@$_" for @{$hogehoge{pos}};

206:デフォルトの名無しさん
09/09/04 10:00:28
my %hogehoge = map [ $_, $_+1 ], 0..10;
}


207:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/04 16:00:18
Param::Validateモジュールの使い方を日本語で解り易く解説しているWebサイトを教えてください。
CPANに上がってる英文マニュアル見たがさっぱり、自動翻訳してもっとわけわかめになった。

209:デフォルトの名無しさん
09/09/04 21:06:08
           YES → 【ヒットした?】 ─ YES → なら聞くなよ。氏ね。
         /                \  
【検索した?】                     NO → なら、ねぇよ。氏ね。
         \                   
            NO → 氏ね。

210:デフォルトの名無しさん
09/09/05 20:42:45
Perl素人のオレに教えてくれ。いや、ください

初心者サイトとかを回りながら、ファイルを読み込んで表示するだけのcgiを作ろうとしたんだけど
ファイルを二個読み込もうとするとインターナルサーバエラーとか言われる
IO::FILE使わなければ問題なく動くんだけどなぜなの? IO::FILEは二回呼び出せないの?


211:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/06 01:09:29
> my $io = IO::File->new($$logfile, 'r');
$$って

213:デフォルトの名無しさん
09/09/06 02:37:24
>>212
できた! ありがとん

でもなぜ$$logfileじゃだめなんだぜ?
my $logfile = shift; にファイル名へのリファレンス格納→$$logfileでデリファレンスっていう流れだと思ったのに……
何か根本的に間違ってんのかな

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

URLリンク(oshiete1.goo.ne.jp)
こんなやり方あるんだねー

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

ちなみに数値にしたけりゃ +0すりゃいいし、文字列にしたけりゃ .''すりゃいい。

217:デフォルトの名無しさん
09/09/06 08:09:31
>>213
> でもなぜ$$logfileじゃだめなんだぜ?

デリファレンス

218:デフォルトの名無しさん
09/09/06 08:16:46
>>215
ちょっと違うような。。。

>>216
Devel::PeekはXSで書かれているんで自分にはよくわからんです。

219:デフォルトの名無しさん
09/09/06 08:18:20
>>214
おすすめはblessしたクラス内で扱うこと。
トリッキーな使い方は可読性、可搬性を下げるのみ。
自己満足はできるかもしれないが。

220:デフォルトの名無しさん
09/09/06 10:48:10
文字と数値を区別しないで済む。あれこれ悩む必要が無くなる。
それがperlの特徴なのに。(スクリプト系言語はたいていそうなてる)
これじゃまるで、パンツの見えないミニスカートを買ったのに
パンツの見せ方を教えてください、って言ってるようなもん。

221:デフォルトの名無しさん
09/09/06 12:51:42
文字列中にある単語をマッチさせて複数取り出すにはどうすれば綺麗に書けますか?

今やりたいことは、あるウェブページ中にある画像のURLだけを取ってきたいと思っています。
 $contents = get($url); # LWP::Simple
 $contents =~ /(http:\/\/[^"]+[.]jpg)/; # jpgだけゲット
 $image = $1;
↑こうやりますと最初にマッチしたものは取り出せるのですが、
 2番目以降もまとめて上手く配列などに取り出せないでしょうか。

222:デフォルトの名無しさん
09/09/06 12:59:34
gつけて@に入れる

223:デフォルトの名無しさん
09/09/06 13:20:57
>>222
ありがとうございます。
置換のときは使っていたのですが、こんな風にも使えるのですね

224:デフォルトの名無しさん
09/09/06 15:00:28
while ( $contents =~ m/(http:\/\/[^"]+[.]jpg)/g ) {
print "$1はうんこ\n";
}

225:デフォルトの名無しさん
09/09/06 16:45:39
>>218
簡単な方法は、$foo ^ $foo の結果を見ること。
0だったら$fooは数値、空文字列だったら$fooは文字列。
数値をお互いにXORするとゼロになるし、
文字列をお互いにXORするとナルストリングになる。

>>221
本当に画像だけ取って来たいなら素直にWWW::Scraper使え。
それだと本文中のURLも拾うぞ。それでもいいなら構わんが。

226:デフォルトの名無しさん
09/09/06 17:13:52
>素直に○○使え

最近、こういう言い回しが増えたよね。
べつにひねくれて星を睨んで「○○」を使わないワケじゃないと思うよ。
ただ「○○」という便利なものが存在するとは知らなかっただけだと思うよ。
なんかさ、「素直に○○使え」って言い回しするヤツって
女子校生が「ちょ~~~やばいしぃ~~」とか言ってるのと同じ臭いがする。
オツムが弱そう。バカっぽいな。

227:デフォルトの名無しさん
09/09/06 18:30:40
>>226
素直に○○する、ってのは、(深く考えず)○○した方が物事がすんなりと運ぶ、という意味なんだが。
辞書があるなら引くといい。

228:デフォルトの名無しさん
09/09/06 18:35:23
(深く考えずに)すんなりと○○した方がよい、か。

229:デフォルトの名無しさん
09/09/06 18:47:04
>>226
素直にやばいしぃ~~

230:デフォルトの名無しさん
09/09/06 19:11:04
>>225
ほー、WWW::Scraperで画像をスクレーピングできるとは知らなかった。
Web::Scraperは知ってたけど。

231:デフォルトの名無しさん
09/09/06 19:20:01
>>227
韓国の辞書も北朝鮮の辞書も持ってません

232:デフォルトの名無しさん
09/09/06 21:30:07
>>320
画像->画像表示を示すURI、WWW::Scraper -> Web::Scraperの間違いだな。
訂正サンクス。

>>231
「単品で迷うなら素直にランチにしなよ」とか普通に使う用途なんだが、
こんな簡単な日本語取り違えるとはゆとりのなせる業か。
>オツムが弱そう。バカっぽいな。

233:デフォルトの名無しさん
09/09/06 21:40:07
>>225
空文字列じゃなく "\x00" x 文字列長 になるんじゃないかな

print length 'foo' ^ 'foo', '/', unpack 'H6', 'foo' ^ 'foo'; # 3/000000

>>214
内部的にどう扱われているかでなく、数値コンテキストに置いた時に
解釈可能な文字列かどうかを判定したいなら Scalar::Util::looks_like_number()

URLリンク(cpansearch.perl.org)

234:デフォルトの名無しさん
09/09/06 21:47:31
>>233
そのようだな。補足サンクス。Cと混同していたようだ。

235:デフォルトの名無しさん
09/09/06 21:53:24
>>232
で?
その”普通に使う用途”が載ってるのは、韓国の辞書?北朝鮮の辞書?

236:デフォルトの名無しさん
09/09/06 22:01:59
>>235
引くに引けないのはわかるけど、負け戦で頑張っても意味無いよ。
黙って日本語を勉強しなおすといい。

237:デフォルトの名無しさん
09/09/06 22:03:40
>>235
日本の辞書の例:
URLリンク(dic.yahoo.co.jp)
>>226は第2義しか頭にないらしい。
日本人なら文脈からして4義が5義と考えるのが普通。

238:デフォルトの名無しさん
09/09/06 22:04:56
つーか大陸のレッテル貼れば何とかなるとか思ってある辺りがもうね。

239:デフォルトの名無しさん
09/09/06 22:07:36
変なタイミングで中韓出してくる子は、大抵日本のお荷物。

240:デフォルトの名無しさん
09/09/06 22:49:12
>>237
やっぱりチョンの会社の辞書を出したか。今は日本に帰化してるが。

241:デフォルトの名無しさん
09/09/06 22:55:57
>>211をコピペして実行してみたけど、正常に実行できる。
問題点は他にあったんじゃ?

242:デフォルトの名無しさん
09/09/06 23:32:31
>>241
レスありがと
211だけど、仰るとおりperlのプロセスがループしてた
正常な状態だったら問題なく動いたわ
かなり時間を費やしてしまった……

基本的に引数は参照渡しでいいんだよね?


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

244:デフォルトの名無しさん
09/09/06 23:36:47
>どこでそんなの習ったんだ?

どこかのサイトに書いてあった記憶がある
片っ端から初心者向けサイト回ってたからどことは言えないけど
オレが勘違いしてるのかな

245:デフォルトの名無しさん
09/09/06 23:59:09
たぶん、値のコピーを作らないように参照渡しにする、って書いてあったんだろうけど
Perlの関数呼び出しは値渡しじゃなくて変数渡しだから、わざわざリファレンスにする必要はないよ。
@_には引数がコピーされて入っているのではなく、引数そのものの別名になっている。

246:デフォルトの名無しさん
09/09/07 00:02:33
配列やハッシュを渡すときは必要だけど。

247:デフォルトの名無しさん
09/09/07 00:17:22
レスありがとん

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

勉強になったわ

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


249:デフォルトの名無しさん
09/09/07 04:52:06
>>233
>空文字列じゃなく "¥x00" x 文字列長 になるんじゃないかな

じゃあ、結局データが文字列か数値かを知りたいときはどうするのがいいんでしょうか。
今まさに1と"1"を別に扱いたい場面に直面しています。

250:デフォルトの名無しさん
09/09/07 05:25:56
>>249
データ構造を作り直して回避する。

251:233
09/09/07 05:56:07
>>249
いや俺に訊かれても。その二つを区別しなきゃいけない状況に陥った事なんて無いし。

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

…とでもしときゃいいんじゃない。すっごくアホ臭いけど。

252:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/07 07:32:29
>>249
だから$foo ^ $fooの結果。0と0x00 x nは違うから。

正直、正規のプログラミングで1と"1"を区別したってろくなことないよ。
コアな部分をいじるようなスクリプトでない限り(Dumperみたいにね)、
Perlでそんな場面に遭遇するってことはあなたの設計がおかしい。

>>251
$foo ^ $foo eq '0' ? '数値' : '文字列'でおk。

>>252
とりあえずお前はこれは読んどけ。10回くらい読め。
URLリンク(perldoc.perl.org)

質問の内容からしてPAUSE使うのは100年早い気がする。
いちAuthorより。

254:デフォルトの名無しさん
09/09/07 07:38:21
つーかここまで言って数値と文字列の見分け方が分からないってことは
ズブの素人だろうから、「基本的にPerlにそんなことはできない」と言い切った方が良かったかな。

1と'1'を区別したい理由かコードか何か晒してみ?多分瑕疵があるから。

255:デフォルトの名無しさん
09/09/07 07:41:49
>>240
小学館ってチョンの会社だったの?

256:デフォルトの名無しさん
09/09/07 07:47:09
俺も長年Perl使ってるが、'1'と1を明確に区別する必要性に駆られた記憶がないな。
参考に、どういうケースなのか教えて欲しい。

257:デフォルトの名無しさん
09/09/07 07:51:52
>>256
>>249ではないが、友人が自作フレームワーク作ってて、引数の型によって
挙動を変えたいっつー場面で数値と文字列の比較の話を出してきた。
当然止めとけと言っておいた。

ドキュメント化されてない部分だからいつ仕様が変わってもおかしくないしな。

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

#自分が使わないからといって、他の人も同じだとは思わないでください。お願いします。


259:デフォルトの名無しさん
09/09/07 09:43:18
>>258
設計が悪い。



260:デフォルトの名無しさん
09/09/07 09:51:43
>>258
URLリンク(search.cpan.org)
読んでみ。数値も文字列で格納することがあることが分かる。

どうしても必要ならJSONを自分でパースしてチェックすればいい。
JSONのレイヤーの問題なんだからPerlのレイヤーに落としてチェック
しようとする発想が間違っている。

261:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/07 11:32:39
このスレが賑わう時はいきなりレベルが上がるから勉強になるわ

263:デフォルトの名無しさん
09/09/07 11:43:21
> #自分が使わないからといって、他の人も同じだとは思わないでください。お願いします。

これには同意するが、スクリプト言語で文字の1と数値の1を見分けたい、ってのは
やっぱ何かが間違ってる

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


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

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


って話。

265:デフォルトの名無しさん
09/09/07 12:47:25
↓ここでD51プレート持った鉄男登場

266:デフォルトの名無しさん
09/09/07 12:53:15
>>263
>スクリプト言語で文字の1と数値の1を見分けたい、ってのは
>やっぱ何かが間違ってる

えーなんで?
*Perlでは*間違っているということなら同意するけど、スクリプト言語一般に広げないでほしい。
つーか、integerとstringの見分けがつかない言語が存在するなんて初めてしったわ。
PHPですらis_string()とかあるのに。

267:デフォルトの名無しさん
09/09/07 14:17:09
Rubyだと逆に厳格だよね

268:デフォルトの名無しさん
09/09/07 15:08:15
>>266
> つーか、integerとstringの見分けがつかない言語が存在するなんて初めてしったわ。

見分けがつかないんじゃなくて、区別されてないんだろ。


269:デフォルトの名無しさん
09/09/07 15:16:31
つ シェルスクリプト
Perlの出自を考えれば文字列と数値を区別しないのも当然といえば当然。

270:デフォルトの名無しさん
09/09/07 15:27:31
JSONも良いですが、symbolとstringをも区別するS式が最強ですね

271:デフォルトの名無しさん
09/09/07 16:04:06
Perl/Tk を使って縦書き形式のテキストビューワーを作ろうとしているのですが、
括弧や句読点、長音記号等を 90度横倒しにして表示する良い方法が無いでしょうか?


272:デフォルトの名無しさん
09/09/07 16:09:10
句読点は横倒しでおkじゃないぞ。


273:デフォルトの名無しさん
09/09/07 16:20:56
>>271
単に縦書き用フォントを使えばいい。

何でも横倒しにすりゃいいってもんじゃないぞ。句読点もそうだが、
波ダッシュ字形問題が、縦書き用フォントを横にするだけでおkと思った
馬鹿外人のせいで起こってしまったことを忘れるな。

274:271
09/09/07 16:28:52
>>272>>273
ご指摘、ご教示ありがとうございます
読み込んだ横書きテキストデータ中の文字を
横書きで問題が出る字形だけ
縦書き字形に変換するという方法で
なんとかやってみようと思います


275:デフォルトの名無しさん
09/09/07 16:41:07
>>274
だから全部縦書き字形にしろって。お前なら絶対見落とすから。影響受けるのは記号だけじゃねーぞ。わかるか?
こういうのは意固地にならずに安直に安全側に転ぶように設計するのが鉄則。

何度も書くが、波ダッシュ問題は問題が出ない字形だと思ってそのまま横倒しにして起きた事故なんだから。

276:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/07 17:10:10
また間違えた
○say +($foo->{foo} ^ $foo->{foo}) eq '0' ? '数値' : '文字列';

278:274
09/09/07 18:04:21
>>275
フォント情報の中に入ってる横書き字形/縦書き字形変換テーブルにバグがあるとしたらもう私にはどうしようもありません。

279:デフォルトの名無しさん
09/09/07 18:21:16
>>278
じゃUTF-8変換とか恐ろしくて使えないな。今後もShift_JISとかEUC-JPで頑張ってください。
多分バグが出る可能性よりも君がミスる可能性の方が高い。

280:デフォルトの名無しさん
09/09/07 19:51:04
>>260
>数値も文字列で格納することがあることが分かる。
なんでこんなことするの?

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

>JSONのレイヤーの問題なんだからPerlのレイヤーに落としてチェック
>しようとする発想が間違っている。
えー、数値と文字列が区別できるような言語なら何の問題もないのに。
Perlではそれができないのを、「発想が間違い」とかいってごまかさないでほしい。


281:デフォルトの名無しさん
09/09/07 20:06:21
>>280
> なんでこんなことするの?

魔法を使うため

282:デフォルトの名無しさん
09/09/07 20:21:59
JSONのバリデータの、どこで内部構造の判定が必要なのかが分からない。
果たしてそれはバリデータなのか、物体Xではないのか。

283:デフォルトの名無しさん
09/09/07 20:40:28
{"PI": 3.14, "unko":[1,1,2,3,5]}
といったデータを、json_validate($json_obj, {"/PI" => "float", "/unko/*" => "int"});
みたいにチェックする場合じゃないの

284:デフォルトの名無しさん
09/09/07 21:18:42
>>283
その処理系は知らないから分からないが、Cライクな型を調べるものとして、
1000桁の数値であってもJSONとしてはvalidなのだから、
やはり文字列で判定すべきではないのか。

285:デフォルトの名無しさん
09/09/07 21:35:51
>>253
>とりあえずお前はこれは読んどけ。10回くらい読め。
>URLリンク(perldoc.perl.org)

どうもです。でもそれには知りたい内容は一切かかれてませんでした。
(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:デフォルトの名無しさん
09/09/07 21:50:23
で、module-starterは試してみたの?

287:デフォルトの名無しさん
09/09/07 22:05:09
>>268
> 見分けがつかないんじゃなくて、区別されてないんだろ。


区別せずに都合よく使えるようにしてあるんだよ。
厳格に区別するほうがよほど簡単なのに。

288:デフォルトの名無しさん
09/09/07 22:07:11
>>273
> 波ダッシュ字形問題

ってなんですか?
涙っしゅ??

289:デフォルトの名無しさん
09/09/07 22:38:38
双方噛み合って無いやりとりもこのスレの華


290:デフォルトの名無しさん
09/09/07 22:45:58
>>287
>区別せずに都合よく使えるようにしてあるんだよ。
区別せずに使えるのは利点だとしても、区別できない(見分けがつかない)のは欠点だよな。


291:デフォルトの名無しさん
09/09/07 22:54:32
>>290
変数アクセス履歴を残しておけばいいわけだな

292:デフォルトの名無しさん
09/09/07 23:14:53
>>286
module-starterをインストールすると、READMEのフォーマットがわかるの?
わかってないのに無理して回答するのやめようぜ。初心者が混乱するだけだから。
もしわかっててその回答なら、あまりにとんちんかんすぎる。

293:デフォルトの名無しさん
09/09/08 00:11:14
>>286
プラグインModule-Starter-PBP入れてね。

294:デフォルトの名無しさん
09/09/08 01:02:28
>>285
(3)の理由はこれだ。
URLリンク(search.cpan.org)

295:デフォルトの名無しさん
09/09/08 01:07:39
どうしても型の区別がしたいなら、静的型付けをエミュレートした変数を作り、そこに格納しておくという手段も用意されています。
今回の議論で望まれている動作とは異なるかもしれませんが、運が良ければ CPAN の Variable::Strongly::Typed が参考になるでしょう。


296:デフォルトの名無しさん
09/09/08 01:58:57
ひとつのサブルーチンで、スカラ、リスト、ハッシュを渡すと
それぞれ別の挙動をとるようには出来ますか?

それとも、単にスカラだけ引数に取るようにして
リストやハッシュは呼出側で参照にしてから
渡してもらうほうが賢明なのでしょうか?

297:デフォルトの名無しさん
09/09/08 02:11:28
URI モジュールのように
スカラー変数をブレスされたリファレンスのように扱えるオブジェクトは
どういう仕組みでできているのでしょうか
ソース読んだけど意味不明。。。

298:デフォルトの名無しさん
09/09/08 03:51:48
>>297
やっぱ use overload でいろんな演算子とかを独自に定義するんでないか

299:デフォルトの名無しさん
09/09/08 08:37:44
>>296
> それとも、単にスカラだけ引数に取るようにして
> リストやハッシュは呼出側で参照にしてから
> 渡してもらうほうが賢明なのでしょうか?


その方が確実かなあ。
もっと確実なのはサブルーチンを分けることなんだけど、なんでひとつにまとめたいのさ?

300:デフォルトの名無しさん
09/09/08 09:12:42
>>298
ありがとうございます
調べてみます

301:デフォルトの名無しさん
09/09/08 09:44:37
>>297
sub X(\$) {...}

302:デフォルトの名無しさん
09/09/08 09:51:43
>>290
必要でないからあえて削除されたんだよ。
型にこだわることで起こる煩わしさのほうが多いから。

それにバリデータなんてどっかで誰かがもう作ってるだろ。
あえてパールで作り直すのは自由だけど、能力不足を棚にあげて言語のせいにされてもね。
ガタガタいうなら適切と思う言語を選べばいい。
言語のせいにするやつは、言語を変えてもできないだろうから。

303:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/09/08 10:19:36
>>288
ググるくらいできんのか。
URLリンク(ja.wikipedia.org)

>>290
それ欠点じゃなくてわざとだから。判定モジュールくらい簡単に作れる。上に判定方法も書いた。
型を区別するとPerlスクリプティングにダメージがあるためそんなモジュールは必要とされていないし使われていないだけ。

>>295
今ならMooseで
isa => 'Str',
isa=> 'Int',
でしょ。

>>296
同名関数の複数定義ができればいいんだが、Perlでは無理なので後者が賢明。

>>299
そりゃ同じ機能ならまとめたいだろうし、最近はそういう風潮にあると思うが。
foo({ a => 1,b => 2 })と、foo([ a => 1, b => 2])で挙動をスイッチするような実装とか最近よく見かけるぞ。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch