[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 05/09 22:28 / Filesize : 164 KB / Number-of Response : 561
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 21:17:36 ]
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

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

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

www.perl.org/get.html
● 2009/02/09 現在の最新版: 5.10.0

▼ 前スレ
Perlについての質問箱 38箱目
pc11.2ch.net/test/read.cgi/tech/1221967332/

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

446 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:04:09 ]
-f -d -eについても調べたところ、-eにすら通っていない
aaa: -f, -d1, -e1
aaa―: -f, -d1, -e1
aaa2―: -f, -d, -e

ディレクトリを再帰的に辿って全部のファイルに対して云々、みたいな
処理をさせると、フォルダの末尾が5Cかもしれない問題は必ず発生すると思うんだけど、
どうやって回避してるの?

447 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:04:57 ]
省略記法てーのは正しくないな。
perlではこう解釈されるってのが正しいのか。

448 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:13:47 ]
>>446
あなたの環境が何か解らないからスルーしてたけど、
スクリプトのエンコーディングとディレクトリのは合ってるの?
winなら>>4とかそこらへんの問題じゃないの?

私の環境だと問題が出ないから力にはなれません。

449 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:43:19 ]
>>4を入れても改善しないようです
aaa: -f, -d1, -e1
aaa?\: -f, -d, -e
aaa?Q?\: -f, -d, -e

むしろ悪化しています
環境はwindowsXPです

450 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:34:09 ]
なんで""つけるんだよ

451 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:20:37 ]
>>4 に答えが書いてあるじゃん。なぜそうしない?

452 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:35:54 ]
>>4は、表示で化けるとか、検索とか正規表現がうまく行かないとかの、
日本語の文字列としての取り扱いを完璧にする方法だけど、
ファイルシステム絡みは何も改善しないように見える

唯一、ファイル名をcp932でencodeするように注意はあるけど、
それは必要な処理であって、今回のケースを解決しない

453 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:54:42 ]
cygwinと同じ問題じゃないの?
ActivePerlがMultiByte系のW32API使ってないんじゃ

454 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:59:15 ]
activeperlではどうやっても無理、というはっきりした結論があれば、
他の言語も含めた別の解決法を探すんだけど、
ぐぐってもそのへんを断言した文章は見つからない

逆に、このスレでは口を揃えて出来る出来ると言っている
サンプルは1バイトも出てこないけど



455 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 01:53:05 ]
Perlでは出来ないし、ここにいるやつらは知ったかぶりの初心者ばかりだから、
PerlはあきらめてPythonでやるといいよ!!

456 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 04:29:43 ]
うちの環境で"activeperl エンコーディング readdir"でググって一番上に出てくる
homepage2.nifty.com/ttoyoshima/Perl/lesson5.htm
には
> 「Active Perl V5.8.8」では日本語の「ファイル名」のファイルは開けない。
って書いてあるけど。

457 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 08:13:35 ]
>日本語の「ファイル名」のファイルは開けない
というのはそのサイトの人がUTF-8のままで処理しようとしているからでは?
別のサイト
ttp://www.aritia.org/hizumi/perl/perlwin.html
では内部コードはUTF-8でもファイル操作時はShift_JISに
戻せみたいなことが書いてあるが
open(IN,encode('cp932',"<表.txt")) or die "open(表.txt):$!\n";

少なくともまったくできないってことはないだろ

458 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 08:45:49 ]
単に説明が面倒だから、全部できないことにしとけ、という手抜きだろ

459 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 10:27:31 ]
PHPにはPEAR::Text_Passwordっていう便利なモジュールがあって、

<?php
require_once "Text/Password.php";
$a=new Text_Password;
$b=$a->create(8, 'unpronounceable', 'alphanumeric');
echo $b ;
?>

このコードを書くだけで、ランダムなパスワードを
自動で生成してくれる。

同じことをperlでやったら65行は書かないといけない。

460 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 10:53:36 ]
その65行をライブラリとして使えば変わらん

461 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 11:20:31 ]
そのText/Password.phpの中身は何行だよ

462 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 11:46:17 ]
PerlにはString::Randomっていう便利なモジュールがあって、

use String::Random;
print $a=String::Random->new->randregex('[A-Za-z0-9]{8}');

このコードを書くだけで、ランダムなパスワードを
自動で生成してくれる。

同じことをphpでやったら6行は書かないといけない。

463 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 12:29:06 ]
>>449
> >>4を入れても改善しないようです

>>4には
> # ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、
> # この例のように cp932 でエンコードする必要があります。
と書いてあるが、なぜそんなことが必要なのか、よく考えてごらんよ。
すると、OS からもらった文字列は逆にcp932 からutf8 にデコード
しなきゃならない、という事にも気づけるだろう。


464 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 14:07:20 ]
>>463
問題を勘違いしてる
0x5Cがエスケープ文字だからトラブってるのではなくて
Windowsのディレクトリセパレータなのが問題



465 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 15:49:06 ]
>>464
> Windowsのディレクトリセパレータなのが問題

へ〜、そうなんだ。

466 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 15:54:30 ]
>>462
ワロタwww

467 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 17:30:30 ]
>>4 に書いてあるとおり、教科書的な書き方をすれば、こうなる。

use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
use Encode;

opendir dir, encode('cp932','.');
@files = readdir dir;
for (@files) { $_ = decode('cp932', $_) }

for $file (@files) {
  if (-d encode('cp932',$file)) {print "$file is directory.\n"}
  else {print "$file is file.\n"}
}

ポイント
・OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、utf8 → cp932 に変換すること。
・逆に OS からもらう文字列(readdirなど)は cp932 → utf8 に変換すること。

468 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 18:38:39 ]
下記のように1〜5万の数をランダムに表示していき、かつ一度表示した数は表示しないというコードをゴリゴリ書きました。
しかしこれは何故か3万回を超えた辺りから重複による何十回ものスキップ処理が入ってしまいます。
3万回数字を表示した時点でスキップが起こる確率は3/5=60%なので何十回ものスキップが頻発するというのはおかしいです。
(例えば10回のスキップ処理が連続で起こる確率は0.6^10でたった0.6%であるにも関わらず、こういう規模の事象が頻発する。3桁レベルのスキップも起こったりする。)
Perlのランダム関数がおかしいとは考えにくいのですが、何故こういう事が起こってしまうんでしょうか?教えてください。

$starttime = (times())[0];
$sessionstarttime = (times())[0];
$count=1;
$skipcount=0;
@triedNumbers=();
print " count skip num total this\n";
while(1){
    $number = int(rand(50000))+1;
    $new = 1;
    foreach(@triedNumbers) {
        if($number == $_) {
            $skipcount++;
            $new = 0;
            last;
        }
    }
    if($new==0){next;}
    push(@triedNumbers,$number);
    $endtime = (times())[0];
    $totaltime = $endtime-$starttime;
    $sessiontime=$endtime-$sessionstarttime;
    printf "%6d %4d %6d %3ds %3ds\n", $count, $skipcount,$number,$totaltime,$sessiontime;
    $sessionstarttime = (times())[0];
    $skipcount=0;
    $count++;
}

469 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 18:40:13 ]
環境は以下です。
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
WindowsXP SP3

470 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 18:54:55 ]
Win32::APIガリガリ叩いてやればできたはずなんだけど、英語の記事だったから読んでないしどこでみたかも覚えてない

471 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:03:36 ]
>>468
This is perl, v5.8.9 built for i386-freebsd-64int
だと以下のようになるが。

32264 3 48037 119s 0s
32265 4 43101 119s 0s
32266 2 38633 119s 0s
32267 2 31075 119s 0s
32268 0 8513 119s 0s
32269 1 49402 119s 0s
32270 1 27972 119s 0s
32271 0 32400 119s 0s
32272 3 28045 119s 0s
32273 0 35972 119s 0s
32274 0 22672 119s 0s
32275 1 44140 119s 0s
32276 2 32443 119s 0s
32277 2 41433 119s 0s
32278 2 33357 119s 0s
32279 0 6772 119s 0s
32280 2 26341 119s 0s


472 名前:468 mailto:sage [2009/04/02(木) 19:03:40 ]
当初の目的は下のコードでさくっとできるようになりました。
>>468のスキップ多発については原因が分かりません。

@numbers=();

for my $i (1..50000){
    push(@numbers,$i);
}

for my $i (0..$#numbers){
    $rand = int(rand(@numbers));
    $tmp = $numbers[$i];
    $numbers[$i] = $numbers[$rand];
    $numbers[$rand]=$tmp;
}

for my $i (0..$#numbers){
    print "$i:$numbers[$i]\n";
}

473 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:10:27 ]
>>468
所詮線型合同法だろ? 偏りあるしそんなもんよ。
List::Utils::shuffle(1..50000) じゃダメなのか。

474 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:11:18 ]
>>472
それは偏りが出るまずいアルゴリズム。

っ「Fisher-Yates shuffle」



475 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:21:05 ]
>>468-469
その環境での乱数の有効ビット数が15だから。
rand(1)が返す数の種類が32768通りしか存在しないので、3万時点のskip確率は90%以上。
乱数のビット数は use Config して $Config{randbits} で確認できる。

476 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:55:54 ]
>>467でも結果は同じ
aaa is directory.
aaa― is directory.
aaa―2 is directory.
aaa2― is file.

テスト結果で書くと
aaa: -f, -d1, -e1
aaa―: -f, -d1, -e1
aaa―2: -f, -d1, -e1
aaa2―: -f, -d, -e
こんなん

aaa―2みたいに途中に5cを含む場合はエスケープとか無しに普通に扱える
aaa―が何で通るのかが謎だけど、
aaa2―みたいなのは、aaa2―/hoge みたいにフォルダ内のファイルを
直接指定してもエラーになる

結論としては、そんなフォルダ名を使うな、ということになる
ファイル名もNGなんだけど、大抵は拡張子があるので、問題になることがない

477 名前:468 mailto:sage [2009/04/02(木) 20:08:30 ]
>>471,473,474
乱数の有効ビット数というのが原因のようですね。
手持ちのWindowsだと15でしたがLinuxでは48でした。

Fisher-Yates法では偏りが出る様なので>>473の方法でやってみようとおもいます。
レスありがとうございました。

478 名前:468 mailto:sage [2009/04/02(木) 20:10:03 ]
>>475さんもありがとうございました。

479 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 20:13:48 ]
>>476
aaa― が通るのは aaa があるから。
aaa2―/hogeの失敗は、何らかの単純ミスの可能性が高い。

>>446
>どうやって回避してるの?
@dirs=split /[\r\n]+/,`dir /s/b/aD`; とか?
再帰? 再帰って何だ?


ファイルテスト演算子内から呼ばれるwin32_stat()内で終端の\を加工してるのが直接の原因。
なんでも FindFirstFile() and stat() are buggy with a trailing backslash, なので、
so change it to a forward slash (〜5.8.7.815)とか、
remove additional trailing slashes (5.8.8.816〜)という対策をしてるとの事。

-dを使う限りstatを避けることは出来ないが、There's More Than One Way To Do Itという
決まり文句を持ち出すまでもなく回避するには数多くの方法がある。

1.くどいけど @dirs=split /[\r\n]+/,`dir /b/aD`;
2.Win32::FileにGetAttributesがあるのでソレを使う
3.Win32API::FileやWin32::APIで好き勝手にやりたい放題?
4.面倒だから -e "${fn}/." で代用 (chdir/opendirにも使える/-fはopenで代用)

X. グロブ(<*>)を使うと、statに通らないファイル名は入ってこない

正しい対応.バグレポートを出し、余裕があればパッチも投稿する。
例えば、WideChar化してから終端加工して再度MultiByteに戻すとか。

楽な対応.そんなフォルダ名は使わない、見つけたら即リネーム

480 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 20:47:30 ]
>>467
> if (-d encode('cp932',$file)) {print "$file is directory.\n"}
がおかしいんじゃないの?
エンコードするから、sjis の2バイト目の0x5Cが復活する。

if (-d $file) {print "$file is directory.\n"}
でうまくいくと思うが。

481 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 21:18:47 ]
>>479
詳しくd

-d 以外にテストの方法があったとしても、
次にそこに対してopendirすると失敗するので、結局目的は果たせない
例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム

5.10.0 とか 5.8.9.825 では直っているかしら

482 名前:PHPの神 mailto:sage [2009/04/02(木) 22:15:14 ]
>>462
お前は何か勘違いしているようだな、、、

PHPでは
「発音できないパスワードを生成する」
とか、そういうことができるんだぞ

483 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:52:56 ]
ここって教えてくれる人がたくさんいていいな・・・
VBAスレなんて、、、

484 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:19:33 ]




485 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:45:06 ]
VBAを使う人というのは、VBAを使っても
嘔吐感、嫌悪感が生じない人なんだろ?
なら、数が限られてくるわな。

486 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 15:09:01 ]
>>481
最初に479に間違いがあったので訂正。
誤 4.面倒だから -e "${fn}/." で代用 (chdir/opendirにも使える/-fはopenで代用)
正 4.面倒だから -e "${fn}/./" で代用 (chdir/opendirにも使える. -fはopenで代用)

末尾への/.追加だけだと5.8.8以降ではchdirには使えなかった。
chdirの確認を常用してる5.8.7.813でしかやってなかったという単純ミス


>次にそこに対してopendirすると失敗するので、結局目的は果たせない
>例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム
そんなに難しいことをやっているの? ツリー表示程度なら
sub tree {
# my(@dir,$ent) = map { chomp;$_ } `dir "$_[0]" /b/aD`; # ,`dir "$_[0]" /b/aDH`;
#↓は↑の手抜き変形でほぼ同内容
my(@dir,$ent) = eval { opendir my $h,"$_[0]/.";grep {-d "$_[0]/$_/." and !/^\.+$/} readdir $h };
while(defined($ent = shift @dir)) {
print "$_[1]+${ent}\n";
&tree("$_[0]/${ent}",@dir ? $_[1].'| ' : $_[1].' ');
}
}
&tree('.');
みたいにopendir無しでも書ける気がするし、opendirも成功しそうな気がするんだが。
opendirに関しては最悪DLL違いでの挙動差もありえなくは無いけどね。

487 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 15:59:30 ]
opendirはできなくても、中にあるファイルをopenは出来る
だからうまいことすれば大抵のソフトは回避できると思うけど、
そんな僅かなリスクの為に常時opendir禁止というのは辛すぎる

488 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 16:59:22 ]
>>486
>例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム

長いよ。長すぎるよ。そんなん書いたら保守性が悪いだろ。
いいかい?

system("tree");

ほら、たった一行でできただろ。

489 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 20:53:37 ]
treeコマンドのあるOSだけじゃないし

490 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:48:39 ]
5C が問題になるOSには、たいてい tree コマンドはあるよ。

491 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 00:27:34 ]
Perlを使う人というのは、Perlを使っても
嘔吐感、嫌悪感が生じない人なんだろ?
なら、数が限られてくるわな。

492 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:25:46 ]
優越感と陶酔感が生じますよ

493 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:30:46 ]
>>492
ぷw

494 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 02:26:05 ]
>>432
田植えならしかるべきとこでやっていただきたい

あーゲシュタルト崩壊してきた



495 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 11:24:11 ]
Perl使ってるひとはいつもこんな主張
"他の言語は使えないから、Perlが一番いい"
Perlの良いことを一言も言えない

496 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 11:51:14 ]
ポテンシャルを語るのに飽きたひと
いわゆるYAGNI
みたいな?

497 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:57:42 ]
良い点なんて他との比較でしか論じれないからな
とりあえずperlが使えれば、好奇心以外に他の言語に乗り換える動機が発生しにくいので、
perlしか使わない人がおおい

498 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 22:22:18 ]
Perlの世界って閉じて荘

499 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:35:28 ]
そもそもどんな人なら「Perl使ってるひと」を名乗ってもいいのだろうか。
もしかすると>495に答えを授けた自称「Perl使ってるひと」も
>497の「perlしか使わない人」も「Perl使ってるひと」ではないかもしれない。

500 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 19:11:10 ]
if(($str =~ /hoge\((.*?)\)/) && ($str =~ /foo\((.*?)\)/)){
    $str =~ /hoge\((.*?)\)/;
    $hoge=$1;
    $str =~ /foo\((.*?)\)/;
    $foo=$1;
}

これをもっと綺麗に書くことってできませんか?できたら教えてください。
hogeとfooの位置が前後する事があるのでこういう書き方にしました。

・やりたいこと
文中のhoge(あいうえお)とfoo(かきくけこ)から
$hoge="あいうえお"; $foo="かきくけこ";という変数を生成したい。

501 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 20:56:00 ]
中のブロックだけでいいのでは(1行目要らないのでは)

502 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 21:18:19 ]
>>500
例えばこんな感じ?

@pair = $str =~ /((?:hoge\([^)]*)|(?:huga\([^)]*))/g;
foreach my $pair(@pairs){
 my($name, $value) = $split '\(', $pair;
 $name = 'hoge' ? $hoge = $value
 : $name = 'huga' ? $huga = $value
 : 1
 ;
}

503 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 21:22:23 ]
×$name =
○$name eq

確かに>>501の通り

504 名前:un001.ecc.u-tokyo.ac.jp mailto:sage [2009/04/06(月) 21:48:05 ]
ハッシュを使うのが手っ取り早いと思う。$foo, $hoge を残したいなら
my $foo, $hoge;
my %refhash = ( foo => \$foo, hoge => \$hoge );

...行ごとのループとか

if (/(hoge|foo)\((.*?)\).*(hoge|foo)\((.*?)\)/) {
$r1 = $refhash{$1};
$$r1 = $2;
$r2 = $refhash{$3};
$$r2 = $4;

... $foo, $hogeを使った処理

}




505 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:39:27 ]
ハッシュの例
my %hash = $str =~ /(hoge|foo)\((.*?)\)/g ;
my $hoge = $hash{hoge} ;
my $foo = $hash{foo} ;
>1行目要らないのでは
の例
my ($hoge) = $str =~ /hoge\((.*?)\)/ ;
my ($foo )= $str =~ /foo\((.*?)\)/ ;

506 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:54:29 ]
変態の例
my $hoge ;
my $foo ;
1 while $str =~ /(hoge|foo)\((.*?)\)(?{ ($1 eq 'hoge' ? $hoge : $foo )= $2 })/g ;


507 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:40:54 ]
Singletonパターンってこれでいい?

package Foo;

my $singleton;

sub new {
my $class = shift;
return $singleton if $singleton;
return $singleton = bless {}, ref $class || $class;
}

1;


508 名前:500 mailto:sage [2009/04/06(月) 23:52:45 ]
# 最初はこうだったんですが
if(($str =~ /hoge\((.*?)\).*foo\((.*?)\)/)){
    $hoge=$1;
    $foo=$2;
}

# 位置関係が前後した場合に対応できない事が分かったので書き直して以下に
if(($str =~ /hoge\((.*?)\)/) && ($str =~ /foo\((.*?)\)/)){
    $str =~ /hoge\((.*?)\)/;
    $hoge=$1;
    $str =~ /foo\((.*?)\)/;
    $foo=$1;
}

これを前者と比べるとゴテゴテしてしまったなというところでした。

>1行目のif文
万が一hogeが含まれfooが含まれていないという場合
if文が無いとhogeの値がfooの値にも入ってしまい、それはマズいので入れてます。

ワンライナーな方のコードも読んでみました。$hoge = ($1 eq 'hoge' ? true : false)みたいな用法は知っていましたが、
この方法を右辺にも使えるんですね。自分には新しいです。(?{})というのは知りませんでした。
見た感じ正規表現の中で処理を実行する際に使うんでしょうが調べてみてもうまくヒットさせられませんでした。
もうちょっと知りたいのでキーワードとかあれば教えてください。

$hoge = ($str =~ 正規表現)での代入方法。これ知りませんでした。
あと右辺がリストで左辺もリストだと配列、右辺がリストで左辺がハッシュだと
キー、値、キー、値というハッシュになるというのも便利ですね。
この用法自体は知っていましたが、実際こういう使い方ができるんだなあと。

>>505さんのコードがわかりやすかったのでこれ使っていこうと思います。
>>501,502,503,504,505,506さんレスどうもありがとうございました。色々勉強になりました。

509 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:08:26 ]
ttp://perldoc.jp/docs/perl/5.10.0/perlretut.pod
A bit of magic: executing Perl code in a regular expression
の項だけど、、、
>この機能は実験的であると考えられており、予告なしに 変更されるかもしれないことを
>警告しておきます。
なので勉強する必要は無いと思うよ…

510 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:24:03 ]
実験的とはいいつつ5.6.0のころからずっとある機能だから勉強しといてもいいだろ
とはいえそう使うことのあるものとも思えんが

511 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:33:22 ]
>>507
>ref $class
これ真になる事無いだろ。

インスタンスメソッドとしても機能させたいんだったら
もう一工夫必要じゃね?

512 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:38:31 ]
あー、そっか。インスタンスからnew呼んだら return $singleton if $singleton; で抜けるんだな
クラスからでもインスタンスからでも同じもの返して欲しいからそこだけ削除して
sub new {
my $class = shift;
return $singleton if $singleton;
return $singleton = bless {}, $class;
}
こうするだけでいいのか?

513 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:55:28 ]
ああ、一工夫もへったくれもなかったねw
スマン。

514 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 20:49:43 ]
>>506
ど変態の例
sub hoge { $hoge = shift }
sub foo { $foo = shift }
$str =~ s/((?:hoge|foo)\(.*?\))/$1/eeg;



515 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 21:03:43 ]
Perlのコードを配布する際ってCPANからインストールして
使用したモジュールってどのように付属すれば良いのでしょうか?
それともReadmeなどにCPANからこのモジュールをインストールしてくださいと
書いておくのでしょうか

516 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:15:26 ]
それとも

517 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:18:40 ]
>>515
CPAN モジュールやその他のよく知られたライブラリ類は、特に事情がなければユーザに揃えてもらった方がよいでしょう。

ユーザ環境のモジュール配布元へのアクセスが制限されていたり、配布スクリプトがモジュールの特定のバージョンに依存するなどの事情がある場合は、その旨明記した上で各モジュールのライセンスが許せば同梱することもできます。

インストールスクリプト中で依存モジュールを CPAN からインストールさせることもできますが、大抵の単体配布では単に依存関係(必要なモジュールのリスト)を(できれば POD に)明記しておくだけで充分です。


518 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:12:09 ]
なるほど、やはりユーザーにもある程度の技術力は求められるのですね。
ありがとう御座いました

519 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 17:38:42 ]
$hogeの中の「\/:*?"<>|」を全て半角スペースに置き換えるのはどうすればいい?

520 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:53:38 ]
>>519
$hoge =~ s,\Q\/:*?"<>|\E, ,sg;

521 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:45:04 ]
>>519-520
perldoc.jp/docs/perl/5.10.0/perlop.pod#item_tr_SEARCHLIST_REPLACEMENTLIST_cds_tr_y_transliterate__c__d__s
$hoge =~ tr{\\/:*?"<>|}{ };

522 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 01:08:47 ]
質問です。
Class::Accessor::Fastを使用して
ハッシュのアクセサって作れるのでしょうか?
いろいろ試してみたのですがうまく行きませんでした…

↓イメージ的にはこんな感じ

package My::Class;
use base qw(Class::Accessor::Fast);
__PACKAGE__->mk_accessors( qw(hoge) );


package main;
my %hash = (
"a" => 'aaaaa',
"b" => 'bbbbb',
);
my $obj = My::Class->new();
#$obj->hoge(\$hash);



523 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 01:52:22 ]

d.hatena.ne.jp/goryugo/20090222/1235237948
↑の問題ってまだ残っているのでしょうか?
久しぶりにMechanizeを使ったプログラムを動かしたら
同じエラーが出るようになったのですがCommon.pmの中身が変わってしまっているようで
何処を修正すれば良いのかわからないのですが.....

524 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 02:05:45 ]
s/ で / が使えない時の第一選択って何にしてる?



525 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 02:40:29 ]
{}

526 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 02:47:34 ]
>>524
PATTERN か REPLACEMENT がある程度長ければ、/ の有無に関わらず {} 。
短ければ PATTERN にも REPLACEMENT にも現れない棒状の文字… | か ! か # 。

527 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 03:23:38 ]
>>522
$obj->hoge(\%hash);

528 名前:PHPの神 mailto:sage [2009/04/09(木) 06:53:49 ]
itpro.nikkeibp.co.jp/article/NEWS/20090408/328083/

Pelってなんだよ

529 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 07:50:22 ]
> 「Pelは大規模Webサービスを支え,今も進化している。しかしそのことが広く知られていない」

確かに「Pel」は知られていないなw 

冗談はともかく、日曜プログラマの自分からするとめちゃめちゃ知られてるような気がするんだ
けど。「Perl技術者の雇用を増やしたい」とは言ってるけど、それでも何がしたいのかよくわから
ない。まだ安定した地位を得ていないRubyとかならまだわかる。

まったくの妄想だけど、Ruby on Railsに仕事を奪われがちになってるとか? でもそれなら
そっちも覚えればいいだけだしなあ。

530 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 13:47:31 ]
{}なんて使えるんだ

うちだと、
$str =~ s{}a{}A{};
みたいにしてもエラーになる

531 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 14:12:06 ]
>>530
本気なのかネタなのか判断に苦しむなそれw

532 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 14:27:26 ]
$str =~ s{a{b{;
普通に考えたらこんな感じ?
変な感じ…
家帰ったら試してみよう

533 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:05:11 ]
>>532
それはNG

$str =~ s}a}b};

こっちはok

534 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:07:18 ]
>>530 >>532
search.cpan.org/dist/perl-5.10.0/pod/perlop.pod#Quote_and_Quote-like_Operators____________________
perldoc.jp/docs/perl/5.10.0/perlop.pod

関係無いけど perldoc.jp の和訳は目次もname属性も削ってる上に
見出しが腐ってて不便極まりないな。



535 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:30:33 ]
一般的な正解

$str =~ s{a}{A};

536 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 18:05:55 ]
1と9を4つとを四則演算で計算結果が10になるものを出力したいのですが、

@a1 = (1,9);
@a2 = (1,9);
@a3 = (1,9);
@a4 = (1,9);

foreach $a1 (@a1){
foreach $a2 (@a2){
foreach $a3 (@a3){
foreach $a4 (@a4){
if ($a1 + $a2 + $a3 + $a4 == 10){
print $a1.'+'.$a2.'+'.$a3.'+'.$a4."\n";
}
if ($a1 + $a2 + $a3 - $a4 == 10){
print $a1.'+'.$a2.'+'.$a3.'-'.$a4."\n";

(中略)

if ($a1 / $a2 / $a3 * $a4 == 10){
print $a1.'/'.$a2.'/'.$a3.'*'.$a4."\n";
}
if ($a1 / $a2 / $a3 / $a4 == 10){
print $a1.'/'.$a2.'/'.$a3.'/'.$a4."\n";
}}}}}

こんな感じで記述する手間がとても大変です
こういう場合に少ない記述で全組み合わせを試すいい方法はありますか?

537 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 18:41:26 ]
@a1 = (1,9);
@a2 = (1,9);
@a3 = (1,9);
@a4 = (1,9);
@op = ('+', '-', '*', '/');

foreach $a1 (@a1){
foreach $op1 (@op){
foreach $a2 (@a2){
foreach $op2 (@op){
# 中略

$fomulae = $a1.$op1.$a2.$op2.$a3.$op3.$a4;
print "$fomulae \n" if (eval $fomulae == 10);

}}}}

こんな感じかな。


538 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 18:51:32 ]
>>537
演算子を変数に入れておkだと初めて知りました!
ありがとうございました

539 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 19:06:21 ]
なぜ複数形

540 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:10:04 ]
誰か助けて下しア
環境がPERL5.8.* Jcode 2.6.5
PERL5.6.1 Jcode2.0から移したら
今までCGIで文字化けしなかったものが化けました。

$str = '莞ゲマン';
$hoge = Jcode->new($str, euc)->h2z->euc;
print "$hoge";

今までは 潟zゲマン
と表示されていたのに、 ?ホゲマン
となります。

原因を調べていたら、5.8移行は機種依存文字は無視しないで?に変換してしまうとのことで。。。
これを 潟zゲマン となるように
解決したいのですが、どなたかご教授ください。


541 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:16:20 ]
すみません
他で聴くためこちらの回答は不要です
失礼しました


542 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:28:24 ]
541は540とは違います。
引き続き回答お願いします。

543 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:50:52 ]
コードをeucで書いて、sjisで読んでeucに変換して処理して、
ということをよくやるけど、ローマ数字が元に戻せなくなるんだよな

544 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:06:00 ]
euc-jp-msでも?



545 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:37:02 ]
そんなencodeは知らんと言われる

546 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:48:06 ]
ppm install Encode::EUCJPMS
みたいなことをしても、見つからない

547 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:58:35 ]
5.8.xならactivestateのリポジトリにあるみたいだけど。
ppm install Encode-EUCJPMS


548 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:00:35 ]
それもやったんだけどな
無いってよ

549 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:21:10 ]
普通に入ったぞ。見りゃわかるだろうが手元はwindowsな

I:\> ppm i Encode-EUCJPMS
====================
Install 'Encode-EUCJPMS' version 0.07 in ActivePerl 5.8.8.817.
====================
Files found in blib\arch: installing files in blib\lib into architecture depende
nt library tree
Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.dll
Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.exp
Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.lib
Installing C:\Perl\site\lib\Encode\EUCJPMS.pm
Successfully installed Encode-EUCJPMS version 0.07 in ActivePerl 5.8.8.817.


550 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:25:56 ]
D:\>ppm i Encode-EUCJPMS
ppm i failed: Can't find any package that provide Encode-EUCJPMS

なーにが違うんだろう

D:\>perl -v

This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 18 registered patches, see perl -V for more detail)

551 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:30:44 ]
I:\> perl -v

This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 25 registered patches, see perl -V for more detail)

Copyright 1987-2006, Larry Wall

Binary build 817 [257965] provided by ActiveState www.ActiveState.com
Built Mar 20 2006 17:54:25

ppm repは?もしかしてactivestateのリポジトリ無効にしてるとか無いよな?

552 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:40:11 ]
D:\>ppm rep
レトトトトツトトトトトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトソ
ウ id ウ pkgs ウ name ウ
テトトトトナトトトトトトナトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトエ
ウ 1 ウ 9817 ウ ActiveState Package Repository ウ
タトトトトチトトトトトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトル
(1 enabled repository)

大丈夫なのか、この画面は

553 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:43:13 ]
んー、ppmのバージョン違うのか?その表示は覚えが無いぞ…

> ppm version
PPM 3.4

> ppm rep
Repositories:
[1] tcool
[2] ActiveState Package Repository


554 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:46:25 ]
D:\>ppm version
ppm 4.01
Copyright (C) 2007 ActiveState Software Inc. All rights reserved.

ここがはっきり違う

Binary build 822 [280952] provided by ActiveState www.ActiveState.com
Built Jul 31 2007 19:34:48

ここ?



555 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:56:53 ]
あー、わかった。activeperl5.8.xは確かbuild818か819ぐらいで別リポジトリになってるんだわ
てことはそっちの新しいリポジトリに入ってないんだな
今ちょっと調べてきたらtrouchelle(ttp://trouchelle.com/perl/ppmrepview.pl)のリポジトリに入ってるみたいなんで、
リポジトリ追加したらいいと思う

build822だからこれでリポジトリ追加して
ppm rep add trouchelle trouchelle.com/ppm/
ppm i Encode-EUCJPMS
で入ると思う

ま、ローマ数字扱えるかどうかは確信がもてないがw

556 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:03:55 ]
D:\>ppm rep add trouchelle trouchelle.com/ppm/
Downloading trouchelle packlist...done
Updating trouchelle database...done
Repo 2 added.

D:\>ppm i Encode-EUCJPMS
Downloading Encode-EUCJPMS-0.07...done
Unpacking Encode-EUCJPMS-0.07...done
Generating HTML for Encode-EUCJPMS-0.07...done
Updating files in site area...done
7 files installed

流石は名探偵

557 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:08:39 ]
でもローマ数字は駄目だった

558 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:10:42 ]
と思ったら、shiftjisじゃなくてcp932にしたら上手く行った

559 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:14:55 ]
サンプル

#written in EUC
use Encode;
use Encode::EUCJPMS;

$str = "つI";
print e2s($str);

sub e2s() {
my $str = shift;
return encode('cp932', decode('euc-jp-ms', $str));
}

560 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 02:08:03 ]
>>539
どういうことですか?






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<164KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef