Perlについての質問箱 39箱目at TECH
Perlについての質問箱 39箱目 - 暇つぶし2ch367:デフォルトの名無しさん
09/03/21 22:11:34
>>362
1) SSIで最終更新日時を書くのが楽
2) Perlでやるなら、File::Slurpで読んでDateTimeで計算するのが楽

かね。
そもそも、

A) sample.htmlにベタ書きしてある最終更新日時の翌日を書けばいいのか、
B) sample.htmlの最終更新日時をただ表示すればよいのか(上記1.でよい)、

そのあたりの要件がはっきりしません。
更新日時についても、営業日でなくて暦日で良いのか、とか。

ちょっとまってね、これから書くから。

368:デフォルトの名無しさん
09/03/21 22:15:53
明らかにSSIが楽。

369:デフォルトの名無しさん
09/03/21 22:19:42
# YYYY-MM-DDをその翌日に置き換える場合
# ただし13月32日とかも引っ掛かって甘いので注意
# しかも、最終更新日以外でも、くだんの正規表現に引っ掛かった値が変換されるので注意

use strict;
use warnings;
use File::Slurp;
use DateTime;

my $file_name = q{sample.html}; # $ARGV[0]とかの引数で渡すとか好きにして
my $file = read_file($file_name, array_ref => 1);

LINE:
foreach my $line (@$file) {
$line =~ s{
(\d{4}) - (\d{2}) - (\d{2})
}{
DateTime->new(year => $1, month => $2, day => $3)
->add(days => 1)
->ymd();
}xmse;
}

write_file($file_name, $file);

370:362
09/03/21 22:19:54
すみません...

そもそも、から行きますと、

A) sample.htmlにベタ書きしてある最終更新日時の翌日を書けばいい

です。

営業日ではなく暦日でOKです。
土日祝日もインフラが停止しなければ365日毎朝更新したいです。

というのは、会社のデータベースからあるまとまった形のデータを
Excel形式で落としてきて、それにパスワードをかけて、所定のフォルダに
アップロードし、それを地方拠点にイントラウェブで提供します。

最終更新日を更新したいというのは、そのアップロードの案内ページなんです。

データを落としてきて、パスワードをかけて、所定のフォルダにアップロード
するところまでは、マクロとMS-DOSのバッチファイルとタスクスケジューラと、
恥ずかしいうにょうにょなやり方でどうにか実現しました。

が、そうしたところ、案内のhtmlファイルも自動で日付を変えられるだろうと、
偉い人から言われまして...

371:369
09/03/21 22:22:40
Template-Toolkit(Template)とかHTML::Templateを使う手もあるね。

ただ、>>370の書き方を見ると、
土日でもアップロードされたデータが更新されているなら、
touch sample.html
してアップロード案内ページだけ最終更新日時を変えれば、
A)はB)と同じになるよね。

そうすればSSIでもやれるんじゃないかな?

372:362
09/03/21 22:22:46
>>369さんありがとうございます。

さっそく明日試してみます。

SSIについては鯖管さんに相談してみます。
そういうとこ、小回りのきかない、相談窓口も親身になってくれない
会社です。。。

373:369
09/03/21 22:26:43
うい、367=369=371れす。

鯖管は別なのか……。
まあ、SSIを検討してみてよ。日曜なのに大変だね。

もしPerlでどうしてもやりたいなら、>>369を使う場合、
DateTimeとかFile::Slurpは標準では入っていないから、
CPANから導入出来るかも聞いておいて。

374:デフォルトの名無しさん
09/03/21 22:29:14
あー、LINE:も要らないし(逐行処理の名残)、そもそもよく考えたら
my $file = read_file($file_name, scalar_ref => 1);
して
$file =~ s{略}{略}xmseg;
すりゃよかったか。

しつこくてごめん。

375:デフォルトの名無しさん
09/03/21 22:33:23
さらにしつこいが、scalar_refするなら$$fileを置換に突っ込むんだった罠。
チラ裏。

>>322が気になった今日この頃。比較表とかないかな?

376:362
09/03/21 22:40:12
重ね重ね、ありがとうございます。

日付を表記するのに、yyyy-mm-ddは、そのhtmlファイルでその更新日の
部分だけにしてあります。よくわからないなりに、ここだけは見つかるように、
ここだけの形にしておかなければいけないだろうと思いました。

CPANからの導入についても明日確認してみます。
正規表現の本もperlの本も、いつか勉強しなければと積ん読になっています。
(恥ずかしながら)

ところで私、普段はぜんぜん違う板の住人です。切羽詰まってここに来ました。
こんなに速くレスをいただけるとは思っていませんでした。
本当にありがとうございます。

perl、勉強しますね。今はお金とか在庫とかの勘定ばかりやっていますが、
小学生の頃はベーマガとかで勉強したクチです。

おやすみなさい。

377:デフォルトの名無しさん
09/03/21 22:41:04
PBPとtokuhiromの受け売りだが、
13月32日に引っかけないためにはRegexp::Commonを使おう

378:デフォルトの名無しさん
09/03/22 00:28:52
>>369
これはちょっとマズいんじゃないの?
コメントでは YYYY-MM-DD と書いてるけど、実際の処理が
\d{4}-\d{2}-\d{2] では、全然年月日じゃない文字列にもマッチしかねない。

もちろん年月日かどうか完璧な判定はできないけど、
>>362 にあるようにマッチさせる文字列が昨日の日時でいいなら
そういう風に限定すべき

379:デフォルトの名無しさん
09/03/22 01:19:26
某所で再びFizzBuzz問題がはやっているようなのでPerlで書いてみました!添削してください!

perl -e 'for ($n=1;$n<16;$n++) {my$res;!(($n%3||($res="Fizz"))&&($n%5||($res=$res."Buzz")))||($res&&print "$res\n")||(print "$n\n");}'

380:戦犯369
09/03/22 02:48:29
>>378
thxです。
ついでに、sample.htmlのエンコードを考慮してみた。

# UTF-8(BOMなし)で保存してね
use strict;
use warnings;
use utf8;

use DateTime;
use Encode::Guess;
use File::Slurp;

# ファイルの中身を変数に突っ込む
my $file_name = q{sample.html}; # $ARGV[0]とかの引数で渡すとか好きにして
my $file      = read_file($file_name, scalar_ref => 1);

# ファイルのエンコードを類推して、UTF-8に変換する
# 決め打ちならこんなことをせず、use Encodeしてdecode, encodeする
my $encoding  = guess_encoding($$file, qw(cp932 euc-jp utf8));
die "Can't guess"
    unless ref $encoding;
if ($encoding->name() ne 'ascii' || $encoding->name() ne 'utf8') {
    $$file = $encoding->decode($$file);
}

# 昨日のYYYY-MM-DDを得る
my $yesterday = DateTime->now(time_zone => 'local')
                        ->add(days => -1)
                        ->ymd();
# つづく

381:戦犯369
09/03/22 02:49:50
# つづき
# >>362式なら
# my (undef, undef, undef, $day, $month, $year) = localtime();
# my $yesterday = sprintf("%04d-%02d-%02d", $year + 1900, $month + 1, $day - 1);


# ファイルの中身で昨日のYYYY-MM-DDに合致すれば変換する
$$file =~ s{
    ($yesterday)
}{
    # ファイルに書いてある最終更新年月日(昨日)を、
    my ($year, $month, $day) = split q{-}, $1;
    # 翌日(つまり今日)に変換する
    DateTime->new(year => $year, month => $month, day => $day)
            ->add(days => 1)
            ->ymd();
    # >>362式なら
    # sprintf("%04d-%02d-%02d", $year, $month, $day + 1);
}xmseg;

# ファイルのエンコードを元に戻す
if ($encoding->name() ne 'ascii' || $encoding->name() ne 'utf8') {
    $$file = $encoding->encode($$file);
}

write_file($file_name, $file);

__END__

まあ、
SSI > テンプレート使用 > ベタ置換
の順が楽なんだろうけど。

382:デフォルトの名無しさん
09/03/22 02:57:58
なにを持って善しと成すのかわからんけど、俺も作ってみた

perl -e 'for(1..15){my$r;$_%3or$r="Fizz";$_%5or$r.="Buzz";$r or$r=$_;print"$r\n"}'

添削してくだちぃ

383:デフォルトの名無しさん
09/03/22 03:12:33
個人的には、勉強するためならいきなりCPANに頼るのはどうかと思った。

いきなりDateTimeを使わずにsprintfでやった方がいいし、
いきなりFile::Slurpを使わずにopen関数を使った方がいいと思うけど、
面倒くさすぎて放り投げられるとPerlスキーとしては寂しいので、
CPANに依存してみた。今は反省している。

FizzBuzzについては、
1. 要件を実現出来ているんなら、
2. ワンライナーなら、
3. FizzBuzzでゴルフしたり難読化選手権を開くんじゃなければ、
多少腕白でもいいと思うけどね、俺は。

敢えてPBP的に見ても、
a. C的なforでなくforeachを使おうとか、
b. $_でなくてちゃんとforeach my $num (1 .. 15)にしようとか、
c. ""で括らなくていいときは''で括ろうとか、
そんなつまらない指摘しか出来ないけど。

あとはあれか、>>379なら、C的なforをどうしても使うときは、
$n <= 15の方が直感的とかか。

384:デフォルトの名無しさん
09/03/22 03:20:37
あ、うそ、ごめん。
>>381の二つめの>>362式は、3月32日になるw
ゆえに素直にDateTime使おう。

385:379
09/03/22 03:36:54
>>382-383
ありがとうございます!>>382さんのコードの方がPerlっぽくていいですね。
ぼくのはJavaとかでも使えるテクしか使ってないや。
最近Perlはワンライナーしか書かなくなってさっぱり鈍ってしまった。

386: ◆TWARamEjuA
09/03/22 10:10:15 BE:6861097-BRZ(10001)
1日前ってそんなに難しいのかしら?
time - 86400
でよさそうな。。。

387:デフォルトの名無しさん
09/03/22 10:34:11
うるう秒をちゃんと扱わないシステムならな

388:デフォルトの名無しさん
09/03/22 11:15:10
>>387
UNIX時はどれも閏秒は算定してないと思うが。
システムによって現在のUNIX時が食い違ったら困るだろ。

389:デフォルトの名無しさん
09/03/22 13:00:39
超頭悪い会話が繰り広げられている

390:デフォルトの名無しさん
09/03/22 13:15:46
>>389
>>389

391:362
09/03/23 05:38:24
おはようございます。
ご報告が遅くなりました。

>>381さんに教えていただいたスクリプトを昨日、会社で使って
(ファイル名など一部変えました)、まだ1日(1回)だけですがテストとしては
うまく動いたようです。

今朝出社してうまく書き換わっているかどうか。これから出勤です。
うまくいったら引き続き使います。

ではみなさま、また縁がありましたらどうぞよろしくお願いします。

392:デフォルトの名無しさん
09/03/23 07:49:00
>>389
仕様上はどちらでもいいことになっているが、先発製品との互換上、
どのシステムもうるう秒は算定していない。

うるう秒はいつ発生するか算定できないからどっかから情報取得する必要があるし、
tarファイルを移転する時とか、NTP使う時とか困るだろ。

よほど金融系のシステムとかでなければ、NTPクライアントを随時走らせておけば大きな支障はない。

393:デフォルトの名無しさん
09/03/23 09:22:29
いちおうtzfile(5)とか見ればわかるけどうるう秒扱えるようにはなって
いるんだよね。

実用上はうるう秒のたびに時計を進めたり戻したりして1日の秒数は
一定としてしまうのが楽な場合がほとんどだから設定した例は自分の
周りでは見たことない。

天文とかは過去のある時刻との間の時間みたいのをきっちり出せない
と困りそうだけど。

394:デフォルトの名無しさん
09/03/23 09:23:10
うるう秒を勘案するシステムは存在しないってこと?

395:デフォルトの名無しさん
09/03/23 13:06:04
>>394
一般的なUNIXtimeの扱いの話であって、
そういったシステムが存在しないとは誰も言ってない。
極端な話、協定世界時を管理してるシステムなんかは当然勘案しなきゃ困るでしょ。

396:526
09/03/24 19:51:11
ここで聞くのが適切かどうか心配ですが、違ったら誘導願います。

debian etch の上で、perl-tk をいれて触っています。
どうにも日本語が表示されませんので、どなたか詳しい人、アドバイスをお願いします。
perlは、 v5.8.8
perl-tkは、804.027-7
です。
よろしくお願いします。


397:デフォルトの名無しさん
09/03/25 04:25:03
エスパーじゃないんだからさ、それじゃ答えようがないよ。

とりあえず>>4
あとやったこと書け

398:デフォルトの名無しさん
09/03/25 14:49:23
ここで聞くのが適切かどうか心配ですが、違ったら誘導願います。

昨日から体の具合が悪いんですが、何かの病気でしょうか?
どなたか詳しい人、アドバイスをお願いします。

どんな薬を飲めばいいですか?医者に診せたほうがいいですすかね・・・
何科の医者に行けばいいですか?
よろしくお願いします。

399:デフォルトの名無しさん
09/03/25 14:53:25
エスパーじゃないんだからさ、それじゃ答えようがないよ。

400:デフォルトの名無しさん
09/03/25 17:06:54
@test
赤、A、あ、   #$test{0}
黄、A、い、   #1
青、A、あ、   #2
赤、B、あ、   #3
赤、C、い、   #4
青、A、あ、   #5
例えばこういう配列があったとして
各項目ごとに一番多い文字列(赤 A あ)をそれぞれ取り出したいんですがどのようにすればいいんでしょうか?

401:デフォルトの名無しさん
09/03/25 17:28:24
「こういう配列」

402:デフォルトの名無しさん
09/03/25 17:36:06
>>400
my @dat = ( 'red,A,a', 'yellow,A,b', 'blue,A,a', 'blue,B,a' ) ;
my @cache ;
for ( @dat ){ my $cnt = 0 ; $cache[$cnt++]->{$_} ++ for split /,/ ; }
printf "%s\n", sort { $_->{$b} <=> $_->{$a} } keys %{$_} for @cache ;

日本語? => 自分で考えて
同じ個数の物があったら? => 知らん。


403:デフォルトの名無しさん
09/03/25 23:32:24
○○.cgiのプログラムで、
「exec △△.pl $param1」とexecを使用して呼び出しても、
呼び出し先の△△.plが実行されないです。

環境が原因と思うのですが、
初心者で何が原因かわからないです。


404:デフォルトの名無しさん
09/03/26 12:16:36
>>400
二次元配列のようでもあるし、コメント見るとハッシュにしてるし…
せめてPerlの書式で書いてくれ

405:400
09/03/26 18:21:17
>>402
レスありがとうございます。

ただちょっと仕様を変更したので、普通の配列の中から一番多い要素を取り出すものに変えようと思ったのですが、
初心者なため>>402のコードでわからない部分があり、改良することができません。

どなたか配列の中で一番多い要素を取り出すサブルーチンを書いていただけないでしょうか。


406:デフォルトの名無しさん
09/03/26 18:50:35
>>405
いくら出すかも書いておくと話が早いよ

407:デフォルトの名無しさん
09/03/26 18:52:32
URLリンク(www.seshop.com)
『10日でおぼえる Perl /CGI入門教室 第2版 』2005/9/5発売。
を購入しようと思っています。

この書籍が出た時点のバージョンのPerlをWindowz Vistaで
動かすことは可能でしょうか?バクがでたりエラーなどは大丈夫でしょうか?
これからPerlを勉強するので詳しいことはわかりません。

なお、PHP関連の書籍に付録で付いていたXAMPP1.6.5はインストール済みで
少なくともVistaで動作確認済みとPHPの書籍にありました。


どなたか回答よろしくお願いいたします。

408:デフォルトの名無しさん
09/03/26 19:32:34
perl タダなんだから、自分でダウンロードして確かめてみればいいじゃん。

409:405
09/03/26 20:37:12
しくしく。。。

どう書けばいいのかわからないんです、アドバイスください
@array = ('マグロ','鯛','イワシ','鯛','マグロ','鯛');

&extract(@array);

#一番多い要素を書き出す
sub extract {
foreach (@_) {
$hash{$_} ++;
}

while (($key, $value) = each(%hash)) {
push(@test, $value);
}
@sort = sort{$b <=> $a} @test;
$shift = shift(@sort);
$aa = $hash{$shift};
print "$aa";
}

410:デフォルトの名無しさん
09/03/26 20:44:10
っ「List::Utilのmax」

411:デフォルトの名無しさん
09/03/26 22:47:29
>>409
初心者をあまりいじめるのも可哀想なのでとりあえず書くけど、正直なところもっとちゃんと自分で調べてほしい。
>>402 のヒントがあれば本を読むなりウェブでリファレンスを引くなりして調べようがあるとおもう。
人のコードを盲目的にコピペするのではなくて、ちゃんと一行一行やってることを理解するようにしないと上達しないよ。
シンタックスシュガーはあえて封じた。

use strict;
use List::Util qw(max first);
my @data=('foo','bar','poo','foo');
my %cache;
foreach my $entity(@data) {
 $cache{$entity}=$cache{$entity}+1;
}
my $maxval=max(values(%cache));
my $res=first(sub{$cache{$_}==$maxval},keys(%cache));
print $res."\n";


412:デフォルトの名無しさん
09/03/28 17:23:43
>>409

#一番多い要素を書き出す
sub extract {
foreach (@_) {
$hash{$_} ++;
if($max < $hash{$_}){ $max = $hash{$_}; } #追加
}

while (($key, $value) = each(%hash)) {
if($value == $max){ print $key,"\n"; } #追加
}
}

413:デフォルトの名無しさん
09/03/28 20:50:08
sub extract{
 my %hash;
 my $res = $_[0] ;
 for ( @_ ){ next if ++ $hash{$_} < $hash{$res} ; $res = $_ ; }
 return $res ;
}

414:デフォルトの名無しさん
09/03/30 04:58:54
リストの略記法って (1..10) しかないんでしょうか
(1がずっと続くよ) みたいな書き方が知りたいです

415:デフォルトの名無しさん
09/03/30 07:28:29
(1) x 10

416:デフォルトの名無しさん
09/03/30 09:31:19
DB_Fileってundefは保存できないんですか
""とundefどうやって区別したらいいんでしょうか

417:デフォルトの名無しさん
09/03/30 10:15:31
>>415
どもです

418:デフォルトの名無しさん
09/03/31 13:31:20
分類と項目が並んでいるリストがあったとして
各項目はいくつかの分類のどれかに属していて、
分類ごとにまとめて処理をしたいので、
項目のリストを分類別に作りたい

for (keys %class) {
 for (@items{$_}) {

みたいに配列の連想配列が使えるといいのだけれど
何かスマートな解決法はありますか

419:デフォルトの名無しさん
09/03/31 13:37:48
PerlでWebからのレスポンスを標準出力すると文字化けが発生してしまいます
色々とエンコードも試したのですが解決しませんでした
文字コード判別もなぜか失敗しました

↓がDumpした結果ですが、文字コードは何なのか教えてくれませんか

SV = PV(0x1cffd24) at 0x1bbe7e4
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x1832f24 "G\"\22w\221U\207L\241\300\361l\16\326ao\352d\351\30\265m\303Ox
\203\24\213\2262\273\271\274\5\273S\307\323\367b\372\277\340\17\254#\257\206D\24
3\243\243\265\342{4_\254j@\213\266gV\3417\236\237\265\331U\370\266\300\2477\227\
357\324D!\362&\32\204\233h\325\36l\301S\370\210n\0366\242\373\205lX\203\317\225\
375\fm\324\322\213\347\324\223\270\360\203'e\253UB\221\"\360l\340\305\211\357Q|u
\377\1\24yz\316\302\3\0\0"\0
CUR = 143
LEN = 676

420:デフォルトの名無しさん
09/03/31 15:16:24
>>416
defined
>>418
ハッシュのキーに分類の名前
ハッシュの要素に項目の配列リファレンスとか入れたらどうだろう
$item{分類} = [qw/項目 項目 項目/];
みたいに

421:デフォルトの名無しさん
09/03/31 15:44:36
      $str =~ s/<hoge>//;
      という正規表現を使って複数回文字を削除しようとしています
      while($str =~ /<hoge>/){ $str =~ s/<hoge>//; }
      とすると無駄な処理が入るので、ループの判別のところだけで処理したいんですが、
      そういう書き方は可能でしょうか
      while($str =~ s/<hoge>//);
      と書くとエラーを吐かれました
      do{''} while($str =~ s/<hoge>//);
      や
      while($str =~ s/<hoge>//){}
      だとうまくいきますが、なんか気持ち悪いです

422:デフォルトの名無しさん
09/03/31 15:51:12
1 while $str =~ s/<hoge>//g; かなぁ

423:デフォルトの名無しさん
09/03/31 15:51:37
>>421
1 while $str =~ s/<hoge>//; とか
$str =~ s/<hoge>//g; とか

424:デフォルトの名無しさん
09/03/31 16:16:08
>>420
$class と $itemのセットを記憶するのに、
push(@{$items{$class}}, $item);
でいけました

@$items{$class} ではないという部分で引っかかりました
念のため[]で初期化したけど、外しても問題なく動くあたりが流石

425:デフォルトの名無しさん
09/03/31 16:39:15
>>423
上では無駄な1が気持ち悪いです
下では $str = '<h<hoge>oge>' のときに削除できません…

426:デフォルトの名無しさん
09/03/31 16:48:20
>>425
リャマ本に似たようなコード載ってるから、じゃ気持ち悪くならない理由にならない?
上の方は定数式(1)は最適化で取り除かれるんだとさ

427:デフォルトの名無しさん
09/03/31 16:57:42
>>426
見た目が気持ち悪いのと処理的に気持ち悪いのは違うんですよ
「全部取り除く」って処理に全く関係ない1なんかがあるのは生理的に気持ち悪いです
{}で終わるのも一文なのに;がないから処理が終わってない感じがいやらしいです
リャマ本に上が載ってるなら、他にやり方はないんですかね…
もしかしたら正規表現で再帰的に検索してくれるオプションがあるかもと思ってたんですが…

428:デフォルトの名無しさん
09/03/31 17:21:08
>>427
再帰的にやるなら

my $hoge;
$hoge = qr/<(??{$hoge})?h(??{$hoge})?o(??{$hoge})?g(??{$hoge})?e(??{$hoge})?>/;
$str =~ s/$hoge//g;

とか? もっと綺麗に書けそうだが。
5.10以降ならキャプチャバッファ(see perl5100delta)使って一行でしかも効率良く書けるはず。

429:デフォルトの名無しさん
09/03/31 19:56:14
>>428
トン
キャプチャバッファについてググってみます

430:デフォルトの名無しさん
09/03/31 19:59:32
>>427
my $str = '<h<hoge>oge>' ;
L:{ $str =~ s/<hoge>//g and redo L; }

1 while COND の方が断然気持ち良いけどさ。

431:デフォルトの名無しさん
09/04/01 13:55:08

 「 気 持 ち 悪 い 」

・・・か。それじゃC言語の

if (a == 1) {
 hoge();
}

なんか、気持ち悪さ1000%だな。
なぜ「等しい」の判定に () が必要なのか。
なぜ hoge を呼び出すのに { } が必要なのか。
なぜ hoge のうしろにも () がくっついてるのか。

アメリカ人は苗字と名前を逆に言う。
住所も番地から逆に言う。
日付も逆に言う。
実に「気持ち悪い」。

だが、そういうもんだ。いちいち疑問にしてたらキリが無い。
順応しろよ、順応。

432:デフォルトの名無しさん
09/04/01 13:56:13
自分で拡張すればいい

433:デフォルトの名無しさん
09/04/01 14:01:47
アッー

434:デフォルトの名無しさん
09/04/01 15:41:46
>>431が気持ち悪い

435:デフォルトの名無しさん
09/04/01 17:37:19
activeperl 5.8.8を使っています
-d でフォルダかどうか判断する時に、
5Cで終わっているフォルダ名を正しく扱えません

どうやったら回避できますか

436:デフォルトの名無しさん
09/04/01 18:30:23
5Cでエスケープしてみては?

437:デフォルトの名無しさん
09/04/01 18:58:01
ちょっと意味が判らないのですが、

-d "$file\\"

という書き方でも結果は同様です

438:デフォルトの名無しさん
09/04/01 19:04:39

必ず失敗するかというとそうでもないようで、
opendir(dir, '.');
for $file (readdir(dir)) {
if (-d "$file") {print "$file is directory.\n"}
else {print "$file is file.\n"}
}
これを
aaa
aaa2―
aaa―
こんな状況で実行すると
. is directory.
.. is directory.
aaa is directory.
aaa― is directory.
aaa2― is file.
test.pl is file.
_ is file.
こうなります

439:デフォルトの名無しさん
09/04/01 19:22:59
で、何が問題なの?

440:デフォルトの名無しさん
09/04/01 19:51:36
aaa2―はフォルダなのに
aaa2― is file.
となってしまうことが問題

441:デフォルトの名無しさん
09/04/01 20:05:27
-dの返り血をちゃんと調べたのか?


442:デフォルトの名無しさん
09/04/01 20:23:03
-dの戻り値なんて1か0しか無いのでは

443:デフォルトの名無しさん
09/04/01 20:47:53
>>431
至極真っ当
理に叶ってる
()の中はbooleanが必要とされてる
{}の中は場合によって処理されるか否かなんだからブロックで囲まれてて当然

だけどwhile(~){}は関数的に使われてるのにセミコロンがない
これが問題
気持ち悪い原因

つまりwhile(~);と書ければ万事解決なんだよ!!!!

444:デフォルトの名無しさん
09/04/01 21:49:19
順応と思考停止と信者脳って紙一重だなぁ、って>>431見ると思うね。

445:デフォルトの名無しさん
09/04/01 21:57:59
>>443
while(~){}は
while(~){
 ();
}
の省略記法だよ?B::Deparseで確認してみ?
勝手に省略して、省略してしまった部分について気持悪がられても…
「();が気持悪い!」って言われたら、
「そりゃごもっとも、俺もそう思う。」と言わざるを得ないけどさ。

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

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

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

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

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

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

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

450:デフォルトの名無しさん
09/04/01 23:34:09
なんで""つけるんだよ

451:デフォルトの名無しさん
09/04/02 00:20:37
>>4 に答えが書いてあるじゃん。なぜそうしない?

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

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

453:デフォルトの名無しさん
09/04/02 00:54:42
cygwinと同じ問題じゃないの?
ActivePerlがMultiByte系のW32API使ってないんじゃ

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

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

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

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

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

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

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

459:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/02 10:53:36
その65行をライブラリとして使えば変わらん

461:デフォルトの名無しさん
09/04/02 11:20:31
そのText/Password.phpの中身は何行だよ

462:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/02 12:29:06
>>449
> >>4を入れても改善しないようです

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


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

465:デフォルトの名無しさん
09/04/02 15:49:06
>>464
> Windowsのディレクトリセパレータなのが問題

へ~、そうなんだ。

466:デフォルトの名無しさん
09/04/02 15:54:30
>>462
ワロタwww

467:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/02 18:40:13
環境は以下です。
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
WindowsXP SP3

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

471:デフォルトの名無しさん
09/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
09/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:デフォルトの名無しさん
09/04/02 19:10:27
>>468
所詮線型合同法だろ? 偏りあるしそんなもんよ。
List::Utils::shuffle(1..50000) じゃダメなのか。

474:デフォルトの名無しさん
09/04/02 19:11:18
>>472
それは偏りが出るまずいアルゴリズム。

っ「Fisher-Yates shuffle」

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

476:デフォルトの名無しさん
09/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
09/04/02 20:08:30
>>471,473,474
乱数の有効ビット数というのが原因のようですね。
手持ちのWindowsだと15でしたがLinuxでは48でした。

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

478:468
09/04/02 20:10:03
>>475さんもありがとうございました。

479:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/02 21:18:47
>>479
詳しく㌧

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

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

482:PHPの神
09/04/02 22:15:14
>>462
お前は何か勘違いしているようだな、、、

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

483:デフォルトの名無しさん
09/04/03 01:52:56
ここって教えてくれる人がたくさんいていいな・・・
VBAスレなんて、、、

484:デフォルトの名無しさん
09/04/03 12:19:33


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

486:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/04 15:59:30
opendirはできなくても、中にあるファイルをopenは出来る
だからうまいことすれば大抵のソフトは回避できると思うけど、
そんな僅かなリスクの為に常時opendir禁止というのは辛すぎる

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

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

system("tree");

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

489:デフォルトの名無しさん
09/04/04 20:53:37
treeコマンドのあるOSだけじゃないし

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

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

492:デフォルトの名無しさん
09/04/05 01:25:46
優越感と陶酔感が生じますよ

493:デフォルトの名無しさん
09/04/05 01:30:46
>>492
ぷw

494:デフォルトの名無しさん
09/04/05 02:26:05
>>432
田植えならしかるべきとこでやっていただきたい

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

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

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

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

498:デフォルトの名無しさん
09/04/05 22:22:18
Perlの世界って閉じて荘

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

500:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/06 20:56:00
中のブロックだけでいいのでは(1行目要らないのでは)

502:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/06 21:22:23
×$name =
○$name eq

確かに>>501の通り

504:un001.ecc.u-tokyo.ac.jp
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/06 22:54:29
変態の例
my $hoge ;
my $foo ;
1 while $str =~ /(hoge|foo)\((.*?)\)(?{ ($1 eq 'hoge' ? $hoge : $foo )= $2 })/g ;


507:デフォルトの名無しさん
09/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
09/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:デフォルトの名無しさん
09/04/07 00:08:26
URLリンク(perldoc.jp)
A bit of magic: executing Perl code in a regular expression
の項だけど、、、
>この機能は実験的であると考えられており、予告なしに 変更されるかもしれないことを
>警告しておきます。
なので勉強する必要は無いと思うよ…

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

511:デフォルトの名無しさん
09/04/07 00:33:22
>>507
>ref $class
これ真になる事無いだろ。

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

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

513:デフォルトの名無しさん
09/04/07 00:55:28
ああ、一工夫もへったくれもなかったねw
スマン。

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

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

516:デフォルトの名無しさん
09/04/07 22:15:26
それとも

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

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

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


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

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

520:デフォルトの名無しさん
09/04/08 18:53:38
>>519
$hoge =~ s,\Q\/:*?"<>|\E, ,sg;

521:デフォルトの名無しさん
09/04/08 19:45:04
>>519-520
URLリンク(perldoc.jp)
$hoge =~ tr{\\/:*?"<>|}{ };

522:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/09 01:52:22

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

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

525:デフォルトの名無しさん
09/04/09 02:40:29
{}

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

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

528:PHPの神
09/04/09 06:53:49
URLリンク(itpro.nikkeibp.co.jp)

Pelってなんだよ

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

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

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

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

530:デフォルトの名無しさん
09/04/09 13:47:31
{}なんて使えるんだ

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

531:デフォルトの名無しさん
09/04/09 14:12:06
>>530
本気なのかネタなのか判断に苦しむなそれw

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

533:デフォルトの名無しさん
09/04/09 17:05:11
>>532
それはNG

$str =~ s}a}b};

こっちはok

534:デフォルトの名無しさん
09/04/09 17:07:18
>>530 >>532
URLリンク(search.cpan.org)
URLリンク(perldoc.jp)

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

535:デフォルトの名無しさん
09/04/09 17:30:33
一般的な正解

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

536:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/09 18:51:32
>>537
演算子を変数に入れておkだと初めて知りました!
ありがとうございました

539:デフォルトの名無しさん
09/04/09 19:06:21
なぜ複数形

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

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

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


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


542:デフォルトの名無しさん
09/04/09 21:28:24
541は540とは違います。
引き続き回答お願いします。

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

544:デフォルトの名無しさん
09/04/09 22:06:00
euc-jp-msでも?

545:デフォルトの名無しさん
09/04/09 22:37:02
そんなencodeは知らんと言われる

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

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


548:デフォルトの名無しさん
09/04/09 23:00:35
それもやったんだけどな
無いってよ

549:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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 URLリンク(www.ActiveState.com)
Built Mar 20 2006 17:54:25

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

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

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

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

> ppm version
PPM 3.4

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


554:デフォルトの名無しさん
09/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 URLリンク(www.ActiveState.com)
Built Jul 31 2007 19:34:48

ここ?

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

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

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

556:デフォルトの名無しさん
09/04/10 00:03:55
D:\>ppm rep add trouchelle URLリンク(trouchelle.com)
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:デフォルトの名無しさん
09/04/10 00:08:39
でもローマ数字は駄目だった

558:デフォルトの名無しさん
09/04/10 00:10:42
と思ったら、shiftjisじゃなくてcp932にしたら上手く行った

559:デフォルトの名無しさん
09/04/10 00:14:55
サンプル

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

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

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

560:デフォルトの名無しさん
09/04/10 02:08:03
>>539
どういうことですか?


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