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


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

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



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

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

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

www.perl.org/get.html
● 2006/12/21現在の最新版: 5.8.8
● 2006/12/21現在の開発版: 5.9.3

前スレ
Perlについての質問箱 28箱目
pc8.2ch.net/test/read.cgi/tech/1162273941/

リンク集は>>2-3
過去スレは>>4

520 名前:デフォルトの名無しさん mailto:sage [2007/01/26(金) 21:50:28 ]
あと「ズスギ」さんと「ズズギ」さんが入れば
濁点のあるなしの組み合わせがそろうのにな

521 名前:デフォルトの名無しさん mailto:sage [2007/01/26(金) 22:00:02 ]
読みが存在しない漢字が存在する

522 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 00:46:22 ]
たとえば、「東」と書いて「あずま」「ひがし」「とう」と、読み方がいろいろある。
漢字だけからは読み方は判別できない。
そのため、正しい読み方は、本人にしかわからない。

523 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 00:52:27 ]
同じクラスに五島(ごとう)と五島(ごしま)が居たことあるよ。

524 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 01:09:35 ]
>>523
おまえ、ひょっとして1年2組の時の近藤(こんどう)か?
おれ隣のクラスの権藤(ごんどう)だよ。おぼえてるか?

525 名前: ◆TWARamEjuA mailto:sage [2007/01/27(土) 01:37:47 BE:4356285-BRZ(6761)]
住基ネットワークに問い合わせれば総て解決♪

526 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 15:01:28 ]
>>515
キミの質問は、2つに切り分けないといけない。
1.クロッサム2のDLLのインターフェースが公開されているかどうか。
2.ActivePerl から DLLを呼び出せるかどうか。

両方とも「YES」だからできるのだが、質問の切り分けができず、
「1」の当否を回答者に調べさせるキミには無理だ。

527 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 15:20:23 ]
>>525
スーパーハッカーキタ━━━━━━(゚∀゚)━━━━━━ !!

528 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 16:01:58 ]
あふぉか
姓しかわからないデータと住基ネットのデータをどうリンクするんだよ。
>>525=>>527か?
くだらないネタにみんなスルーしてるわけだが、
自作自演するほど反応してほしかったのか?




529 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 16:22:13 ]
ネタだと思っているなら何故あふぉとか言ってマジ突っ込みするんだろう。分裂気味?
まぁ大方、真相がネタでもマジでも恥かかないよう工夫したら前後で矛盾が出たってとこか。

530 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 17:17:34 ]
まぁ未承諾さんだし。

531 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 18:02:01 ]
>>526
もちろんDLLとかWindowsの約束とかよく分かっておりません。
そのあと、mrccom.dllを見つけてWin32::APIでimportを試すところまで来ましたが、
unknown errorでimport出来ず\(^o^)/。どなたか気が向いたら教えてください。

532 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 20:09:12 ]
>>528
サブイ

533 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 22:26:03 ]
>>527,>>529,>>532
ここはvipでも口論・議論ではなくperlの質問箱スレだ。
前日の終わったネタをいつまでも引きずったり、
指摘されて逆切れして粘着するぐらいならほかのスレ行けよ


534 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 22:45:22 ]
>>528=533 別に君以外誰も文句も言ってないし、しきりも頼んでないけど。
頓珍漢レスを>>529に指摘されて逆ギレしてる張本人乙にしかみえないよ?w

535 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 22:52:37 ]
粘着だが逆ギレだか知らんが、
PerlのスレでPerlの話をしないやつはすべて平等に価値がない

536 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 23:29:55 ]
ここは批判されると30分以内に逆切れコメントする527を観察スレですか?

537 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 00:35:56 ]
>>531
>どなたか気が向いたら教えてください。
まず、C++を勉強しろ。C++でDLLを扱えるようになること。
PerlでDLLを扱う話はそれからだ。

538 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 01:35:42 ]
>>533
ここはvipでも口論・議論ではなくperlの質問箱スレだ。
前日の終わったネタをいつまでも引きずったり、
指摘されて逆切れして粘着するぐらいならほかのスレ行けよ



539 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 02:58:29 ]
    __
    |   |
    |   |   ___                  ___
    |   | .  /     |  __    _____   / _  \
    |   |  /  /|  |  /  /   / ____/  / /  >  l
    |   |. /  / .|  |. /  /   / /..   _    /   ̄  /
    |   |/  /  |  |/  /   /   ̄ ̄_/   /      \
    |       /.   |     /   / / ̄ ̄ __   /  / ̄ ̄>  |
    |    /   |___/  ./   ̄ ̄ ̄ /  /    ̄ ̄  /
     ̄ ̄ ̄             ̄ ̄ ̄ ̄ ̄     ̄ ̄ ̄ ̄ ̄     _____      ___ ___    ___
    ______                             /__  __/ [][] _| |_| |__ _| |_
     |  ___  \                               / /     |    _  | |_  レ'~ ̄|
     |  |    \  l                              |  |_      ̄|  | / / /   /| |
     |  |____/  /                             \__|      |  |  ̄ /_  /.  | |_
     |  ____/ ___  __    __/ヽ                    |_|.     |__|.   \/
     |  |     /`、_/_/ / _ ヽ  / _  /
     |  |     ヽ  /   | l   l l  | l   l l
     |  |       | l     ヽ  ̄ /  ,ヽ  ̄ /
      ̄          ̄      ̄ ̄  / __ ヽ
                        | l     l l
                        ヽ  ̄ ̄ /
                         ~ ̄ ̄~

540 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 03:41:10 ]
それ、もう少し小さくならんか。

541 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 04:14:20 ]
  Web
      でやれ
  Prog

542 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 04:16:24 ]
vv3bpr0gマ”ゃれ

543 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 21:16:33 ]
Image::Magickで32bit(RGBA)のpngを読み込んで、24bit(RGB)のpngに書き出したいんだけど、
どうやればいいか教えてください。

544 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 21:39:34 ]
mechanics.civil.tohoku.ac.jp/soft/node43.html
convertで24bit Raw RGBで出力して
それを再度pngで出力すればいいんでね?

545 名前:543 mailto:sage [2007/01/29(月) 00:12:46 ]
もう少し調べてみたら、
$im->Set(matte => 0);
で解決できました。スレ汚しごめんなさい。

546 名前:デフォルトの名無しさん mailto:sage [2007/01/30(火) 20:26:33 ]
threads::shared なんですが、
例) $var : shared;
と言うのは、文法的にどういう意味なのでしょうか?
threadsだけに許された特殊な文法なのでしょうか?

547 名前:デフォルトの名無しさん mailto:sage [2007/01/30(火) 21:18:54 ]
attributes

548 名前:デフォルトの名無しさん mailto:sage [2007/01/30(火) 22:02:55 ]
>>547
ありがとうございます
CPANで見ても英語がさっぱりで…
分かり易く解説されているページ等はないでしょうか
はてなのは見ましたがさっぱりです



549 名前:デフォルトの名無しさん mailto:sage [2007/01/31(水) 17:01:01 ]
質問です
UNIX系OSやWindowsで
.soや.dllを利用したいのですが、
どうするのが一般的でしょうか?
出来れば日本語の解説ページをお願いします

550 名前:デフォルトの名無しさん mailto:sage [2007/01/31(水) 23:53:20 ]
質問です
コマンドラインでカウントダウンってできますか?

C:\>perl hoge.pl
次の処理まで待ち時間: 5秒...

のところ “5”の部分のみが 4 3 2 1... と更新されていくようにしたいのです
いちおー system "cls (もしくは) clear "でスクリーンごと更新とかは なしで

Activeperlですが cpanで解決するなら cpanでも結構です

よろしく〜

551 名前:デフォルトの名無しさん mailto:sage [2007/02/01(木) 00:00:31 ]
>>550
¥b


552 名前:デフォルトの名無しさん mailto:sage [2007/02/01(木) 00:05:34 ]
>551
うおっ! ありがとうございます!!
さっそくそのキーワードで調べてみます!!

553 名前:デフォルトの名無しさん [2007/02/02(金) 13:47:58 ]
perlでISHテキスト←→バイナリ変換するモジュールってある?
一通りCPANしたりぐぐったりしてみたが見つからなかったんだけど。

554 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 15:02:25 ]
質問です。
項目数(列数)が多いCSVのデータを読み込んで処理するとき、皆さんはどうしてますか?

私は10項目くらいでしたら
my($id, $name, $age, ..) = split /,/;
と、それぞれ変数を用意するのですが、

100項目を超えるような場合、項目名を要素とする配列を用意しておき
@col_name = qw(id name age ..);

連想配列に格納して
my @array = split /,/;
my %hash = ();
for(0..$#col_name) {
  my $key = $col_name[$_];
  my $val = $array[$_];
  $hash{ $key } = $val;
}
$tel = $hash{tel};

今扱ってるCSVはデータの件数(行数)が500件あって、上記の連想配列の格納をその件数分繰り返し行なっています。



555 名前:554 mailto:sage [2007/02/02(金) 15:03:04 ]
「項目名 => 項目番号」の連想配列を用意しておくのがいいのかなとも思うのですが、
%col_no = (
  id => 0,
  name => 1,
  ...,
  );
$tel = $array[ $col_no{tel} ];
↑ちょっと読みづらいかなとも思います。

項目数・項目名が変わる可能性は低いです。
効率よりも読みやすさ重視です。

よろしければ、ご意見お聞かせください。


556 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 15:07:30 ]
$tel = $array->[$i]->{'col_no'}->{'tel'};

557 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 15:09:34 ]
$tel = $array->[$i]->{'tel'};
これでいいのか
入れ方は任せる

558 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 18:22:13 ]
@col_name = qw(id name age); # member

$_ = "1,hiroyuki,30"; # csv
@$record{@col_name} = split /,/;


#
print $$record{id},"\n";
print $$record{name},"\n";
print $$record{age},"\n";



559 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 21:32:19 ]
利便性の為にハッシュを使わざるを得ないのが気になってるんじゃないの?
配列でやりたいなら、こんなことしちゃったり:

my $r = MyRecord->new(split /,/);
print("$r->name\n");

package MyRecord;
BEGIN {
my $i = 0;
my @col_name = qw(id name age); # カラム名を設定。
for my $n (@col_name) {
eval qq{ sub $n :lvalue { \$_[0][$i] }};
$i++; }}

sub new { bless [@_[1..$#_]], $_[0]; }

560 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 21:34:18 ]
ミス。
print("$r->name\n")
修正 → print($r->name, "\n")

561 名前:デフォルトの名無しさん [2007/02/02(金) 22:02:33 ]
>>559
evalで作るのと、*{...} = sub{}で作るのどっちがスマートなんだろ。

562 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 22:22:43 ]
evalはパーサが動く分遅くはなりそうだけど
通常の定義と見た目が一貫してるから読みやすいかも。

シンボルテーブル+クロージャだと、クロージャ作る側のレキシカルな環境?も意識しないとならないし、ちょっと嫌。

563 名前:554 mailto:sage [2007/02/03(土) 10:09:16 ]
>>556-562
ご回答ありがとうございます。

いろいろ方法があるのですね。
まだご回答の内容が理解できていないので、勉強してきます。

564 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 09:24:15 ]
他人が作った、FTPで複数のファイルを受信する為の処理に手を入れなくては
いけないのですが、元のソースにエラー時の処理が全く入っていません。

$ftpcmd = ○○○ #<-ftpコマンドが記述されたテキストファイル
system("ftp -n < $ftpcmd);

対象ファイルは複数あって mget logfile*.* で取って来ています。
ファイルが取って来れなかったり、相手に接続できなかったりといったような
エラーが起きた事を判定するにはどのようにすればいいのでしょうか?
PerlもLynuxも初めてなので、出来るだけ簡単な方法を教えていただけると
ありがたいです。

よろしくお願いします。

565 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 13:04:46 ]
Net::FTP で書き直したらいいんじゃないかな。

566 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 15:35:04 ]
>>564
Net::FTPでスクリプト書く例
search.cpan.org/~gbarr/libnet-1.20/Net/FTP.pm

モジュールが入ってなかったら「perl CPAN」でググってCPANの使い方覚えていれろ

567 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 16:26:22 ]
Lynuxはおらも初めてだ

568 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 17:13:07 ]
>>565-566
そのやり方で書き直してみます。
ありがとうございました。

>>567
Linuxの打ち間違いですね。



569 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 23:30:35 ]
>>565-566

教えていただいた方法で組んでみたのですが、複数のファイルをワイルドカードで
指定して取って来るにはどうしたらよいのでしょう?

対象のファイル名には出力された日付と時刻が含まれていて、個数も名前も不定
なのです(○○○YYYYMMDDHHMM.logのようなファイル名で、日付部分が
当日のものだけ取って来たいのです)。

何度もすみませんがよろしくお願いします。



570 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 01:45:03 ]
sub mget {
   my($ftp,$pattern) = @_;
  foreach my $file ($ftp->ls($pattern)) {
     $ftp->get($file) or warn $ftp->message;
  }
}


571 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 23:22:19 ]
>>570
どうもありがとうございます。
上手く持ってこれました。



572 名前:デフォルトの名無しさん [2007/02/07(水) 11:31:08 ]
希望結果を得たいのですが、実行結果の通りになります
以下のソースで実行結果になることは納得できるのですが、
希望結果を得るためにはどうすれば良いのでしょうか?

●ソース
@$data=(
{'name'=>'test1','pay'=>'1000','cancel_flg'=>'0','create_date'=>'20070131','cancel?date'=>''},
{'name'=>'test2','pay'=>'2000','cancel_flg'=>'1','create_date'=>'20070110','cancel_date'=>'20070120'},
{'name'=>'test3','pay'=>'100','cancel_flg'=>'0','create_date'=>'20070201','cancel_date'=>''},
);
foreach(@$data){
push(@lst,$_);
if($_->{cancel_flg}){
$_->{create_date}=$_->{cancel_date};
$_->{pay}="-".$_->{pay};
push(@lst,$_);
}
}
print "$_->{name}\t$_->{pay}\t$_->{create_date}\n" foreach(@lst);

●実結果
test1 1000 20070131
test2 -2000 20070120
test2 -2000 20070120
test3 100 20070201

●希望結果
test1 1000 20070131
test2 2000 20070110
test2 -2000 20070120
test3 100 20070201

573 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 11:44:59 ]
foreach(@$data){
push(@lst, {%$_});

574 名前:デフォルトの名無しさん [2007/02/07(水) 11:55:08 ]
>>573
ありがとうございます
希望どおりの結果を得られました
ハッシュ内のデータを1つずつ別のハッシュに移し替えることで回避していましたが
これからはソースがスマートになりそうですw
私が無知なだけだと言う話かも知れませんが、勉強になりました

575 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 12:23:24 ]
こういうことだな。
$X = ['A'];
$Y = $X; #リファレンスデータのポインタ(?)だけをコピーして、データそのものはコピーしてない。
$X->[0] = 'B';
print $Y->[0];

結果「B」

576 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 12:36:30 ]
ちょっとCPANで調べるとStorableのdcloneとか、
Clone(::More/Fast/PP/Any...)とかなんかたくさんあるんだけど
どれを使うのがいいんだよ

577 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 12:39:19 ]
俺は年寄りなのでcancelないときもコピーすんのもったいないと思ってしまう


578 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 13:56:18 ]
辞書みたいなものを作っているのですが、見出し語にダブりが多数あります。
こんな感じで。

<midashi>kuki</midashi>
茎とはクキである。・・・・・

<midashi>kuki</midashi>
  茎とはクキである。・・・・・

見出し部分タグ内が同じ場合のみ、一つ残してダブりのぶんは見出しも本文も消す、
という作業を行いたいのですが、perlで出来ますか? 
何を勉強すればよいのか、示唆頂ければありがたいです。



579 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 14:05:52 ]
xmlなら、専用のエディタ使う方がよっぽど早くて安全だと思うのだが。

580 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 16:05:05 ]
ファイルのパースさえ出来れば楽勝だろうけどたぶんそこが一番の問題だと思う
機械読み取りを考慮した仕様になってればいいんだが

581 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 22:15:16 ]
配列を初期化したいのですが、どのようにすればいいのでしょうか?

引き渡したパスにあるファイル名を配列に入れて、そのファイル1つ1つを順繰りに
処理していきたいのですが、1度処理をした後でもう1度処理を行うと、最初に配列
にセットしたファイル名が配列に残ってしまっています。
下のソースだと、「1回目」と「2回目」のところでは同じ内容のファイル名が表示
されます(2回目では何も表示されないで欲しいです)。
どこがおかしいのでしょうか?ご指導を宜しくお願いします。

sub aa{
($path) = @_;
@localfl;
@dir;

opendir(DIR,$path) || return(-1);
@dir = readdir(DIR);
foreach $f (@dir){
if($f =~ /^\.\.?/){ next;}#親&カレントフォルダ(.と..)を除外
$localfl{$f} = $f;
}
foreach $f (sort(keys(%localfl))){
print("1回目 $f\n");
}
undef @localfl;#これでクリア?
@localfl = ();#これでクリア?
foreach $f (sort(keys(%localfl))){
print("2回目 $f\n");
}
}

582 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 22:20:07 ]
@localfl と %localfl は別物ですよ

583 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 22:55:59 ]
なぜに Perl4 …
変数全部グローバルだし

584 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 23:05:43 ]
>>582
@localflには最初から何も入ってなくて、%localflをクリアしてないから
前の中身が残ってるということでしょうか?
%localflの中身をクリアすればOKですか(%localfl=""; とか・・?)

>>583
すみません、まだPerl触り出して1週間のド素人なもので・・。


585 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 23:30:02 ]
%localfl = ();

586 名前:582 mailto:sage [2007/02/07(水) 23:36:52 ]
とりあえず >>585 の %localfl = (); または undef %localfh; で意図する結果が得られます

バグの温床になるのを防ぐために use strict; と use warnings; をお薦めします
変数を宣言するときは my を使ってください
適当に書き直したらこんな感じでしょうか

use strict;
use warnings;
sub aa {
my ($path) = @_;
opendir(my $dh, $path) or return -1;
my @localfl = sort grep { ! /^\.\.?/ } readdir($dh);
foreach my $f (@localfl) {
print("1回目 $f\n");
}
}

587 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 00:19:07 ]
>>585
>>586

丁寧に教えていただきありがとうございました。
参考にさせていただきます。

588 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 20:09:30 ]
Encodeモジュール使い方を勉強中です。
なんとか試行錯誤しながらやってるんですが、
Data::Dumper がやたら文字化けします。
Dumper無しで出力すると化けないので
エンコードの部分は間違ってないと思うのですが。



589 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 20:16:37 ]
use strict;
use utf8;
use Data::Dumper;
binmode STDOUT,":encoding(cp932)";
my $str="あああ";
print Dumper $str;
print $str;
以上をutf8で書いて実行すると
$VAR1 = "\x{3042}\x{3042}\x{3042}";
あああ
となります
どうにかして日本語をDumperする方法はないでしょうか?

590 名前:578 mailto:sage [2007/02/08(木) 20:17:25 ]
ありがとうございました。
XML エディタ で検索してみましたが、どうもよく分かりませんでした。
ちなみに見出しは全部でaからzまで数十万あります。
ダブり語は多分、数千種類が各2〜7個くらいダブっています。
差し支えなければ、使えそうな専用エディタを教えて頂けないでしょうか?

ファイルのパースさえ出来れば楽勝だろうとおっしゃるのは素晴らしいです。
ちなみに楽勝というのはperl で、ですか? 
機械で読むというのがよく分からないのですが(すみません)、多分txt形式で
50MBくらいのファイルになりそうで、そこまでは出来ます。

591 名前:588=589 mailto:sage [2007/02/08(木) 20:19:08 ]
ちなみに環境は WindowsXP sp2 上で、ActivePerl Build 819 使用しています。

592 名前:デフォルトの名無しさん [2007/02/09(金) 02:39:44 ]
なんとなくWebProgからきました。取り留めもない質問なんですがお願いします。

WEBの掲示板などでよく、特定のタグだけ書き込み許可してますよね。それを実現するのに
下記のようなコードを書きました。最近、WEBに限らず、テキスト系の処理は何するにも
こんな感じでsplitして再帰する書き方に固執してしまってます。
字ヅラ的には短くて気に入ってるんですが、処理的には効率悪い気がしてならないのです。
もっとうまい方法があるでしょうか。

sub escape_limited {

my %args = (str => '', @_);

$exception = q!</?(?:a|img|blockquote|pre|code|span)(?:\s[^>]*)?>!;

my @scraps = split(/($exception)/im, $args{'str'}, 2);

if ((scalar @scraps) == 3) {

return &escape(%args, str => $scraps[0]). $scraps[1]. &escape_limited(%args, str => $scraps[2]);
}

else {

return &escape($args{'str'});
}
}

593 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 04:00:04 ]
sub escape_limited {
  my %args = (
    str     => '',
    allowed => qr{a|img|blockquote|pre|code|span},
    @_
  );
  my $text = $args{str};
  $text =~ s{( < (?! /? (?:$args{allowed}) \b ) [^>]* > )}{ escape($1) }iegx;
  return $text;
}

とかでどう?

594 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 09:53:04 ]

$LT = quotemeta escape("<");
$GT = quotemeta escape(">");

($str = escape($str)) =~s/$LT\/?(a|img|b|blockquote|pre|code|span)\b.*?$GT//ig;

とかねー。多分軽いよ。

タグ内に'<' '>' が無いことを前提にしてるみたいだけど、大丈夫?
属性も調べないと、スタイルシートとかスクリプトとか埋め込まれる可能性もあるし。

595 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 10:35:31 ]
うおっ、間違えた。正規表現のリテラルのトコ…。
s/$LT(\/?(?:a|img|b|blockquote|pre|code|span))\b(.*?)$GT/<$1$2>/ig

だわな。スマソ

596 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 13:59:17 ]
試しました。
592(私):スプリット型
593:一発置換型
594:例外事後処理型

マッチングがひとつもない場合
592:速い
593:圧倒的に遅い
594:速い

マッチングがある場合
592:圧倒的に遅い(しかも多重再帰の警告でまくり)
593:少し速い
594:速い

一旦、なりふり構わず置換してから例外を元に戻すってのは、
分かりやすいだけで処理的に気持ち悪いと思ってましたが、
意外と効率いいんですね。


597 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 14:07:03 ]
お礼を忘れました。みなさんありがとうございます。
ひとつ、事後処理型の場合、対象文字列に最初からエスケープ文字が
含まれてるケースを考慮する必要がありますね。これが一番やっかいかなあ。


598 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 14:10:29 ]
いや、一旦、二重エスケープになって元に戻るからいいのか。
混乱してきたので仕事に戻ります。




599 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 15:02:53 ]
>>590
テキスト読み込んで処理はPerlの得意とする分野なので楽勝

タグは<midasi></midasi>だけなのか?その他のタグがあったとして処理する必要はないのか?
複数の同じ見出しに対し残す本文はどれでもいいのか?
本文中にタグや特殊文字があったりした場合は?一意に判別できるエスケープの仕様はある?

あたりの仕様さえ確定できればファイル読み込みのやりかた、正規表現、ハッシュあたり覚えればできるっしょ
ちゃんとしたXML形式になってるなら専用のパーサ使えば楽が出来るが、正規表現でも十分なように思える

600 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 23:36:51 ]
ちゃんとしたXMLになってなくても、XML::Liberal使えばわりといける。

601 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 03:35:34 ]
wxperlを使ってGUIのメモ帳を作っています。ファイルを新規に保存するとき
ファイルと同名のフォルダをつくりたいのですがなぜかうまくいきません。
my $filename = $saveasdialog->GetPath;  
$this->{text_ctrl_1}->SaveFile($filename);
mkdir($filename);

このスクリプトで、一行目でwxperl filedialogオブジェクトにより
ファイル名が取得され$filenameに入ります。2行目でsavefileメソッドで
テキストが$filenameの通りに名前がつけられ保存されます。これは正常にいきます。
しかし、3行目のコードではフォルダが作成されません。

wxperl固有というよりもperlのコードの書き方に問題があるような気がするのですが、
アドバイスがあったらお願いします。

602 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 03:46:04 ]
> ファイルを新規に保存するときファイルと同名のフォルダをつくりたい

なんじゃそりゃ??

603 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 03:54:30 ]
どの OS でテストしてるんだか知らないけど、ファイルシステム側の問題だろう。
例えば Windows では同名のファイルとフォルダは作れない。

604 名前:601 mailto:sage [2007/02/10(土) 04:31:21 ]
>>603
すみませんでした。windows xp, active perl環境です。
>例えば Windows では同名のファイルとフォルダは作れない。
これは知りませんでした。というか大昔に聞いたことがあるような気がしますが
盲点でした。
mkdir($filename."Folder");
のようにしたら("作成したファイル名"Folder)という名前でフォルダが出来ました。
自分の考えている機能としてはこれで十分先に進めそうです。
ありがとうございました。


605 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 13:39:41 ]
て言うか、同名のファイルとフォルダを作れるファイルシステムってあったっけ?

606 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 13:43:46 ]
同名のファイルとフォルダがあるとApacheがまいっちんぐしちゃうよ

607 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 15:15:31 ]
>>605
むかし、「同名のファイルとディレクトリ作れるんじゃねえ!!」と怒った記憶がある。


608 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 17:42:01 ]
これも拡張子を非表示にするゆとり教育の弊害か…



609 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 18:27:55 ]
これもファイル名とディレクトリ名を同じ名前空間に置くという異常なことを
やったUNIXの弊害か……

610 名前:デフォルトの名無しさん [2007/02/10(土) 18:44:58 ]
初学ながらリファ本片手にCGIスクリプトを書いています。
下記のような問題にぶつかるもどうにも解決方法がわかりません。
どうすればよいか教えてください。よろしくお願いします。

【やりたいこと】
 投票CGIの改造で、イエスノーの2択の選択肢の投票に応じて、表示されて
いる数字も増減されるようにしたい。 数字の増減はカウンタスクリプトを流用し
ています。

【現在書いているスクリプト(抜粋)】
open(FILE, "+<./count.dat") or die("エラー:カウントファイルが開けません");
eval { flock(FILE, 2); };
$counta = <FILE>;
seek(FILE, 0, 0);
if($item == 1 ){ print FILE $counta+1 } else { print FILE $counta-1 }
close(FILE);

【問題点】
 例えば現在の$countaの値が100で、値が-1される場合、結果は99となって欲しいのに、990と
なって返ってきます。1000から999の場合なども同じです(どうも桁数が減る場合にうまく動作し
てくれない模様)。

【解決したいこと】
 100が99になって欲しい場合、その動作が990とならず希望どおり表示されるようにしたいです。

【その他】
 同じ桁数が変わる場合でも、99→100など、桁数が増える場合は問題が発生しないです。

611 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 18:45:26 ]
ファイル名とディレクトリ名の名前空間が異なるなんて想像したら
そちらの方が異常だと思うが。

そもそもそいった実装のOSはあるんかえ?

612 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 18:58:46 ]
>>609
最近それで頭に来てる。百万個を越えるファイルを持つ非常に巨大なファイルツリーを
トラバースするのにリソース食いまくり。
やっぱり分けてあるシステムってあるんだ。


613 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 19:19:45 ]
>610

use Fcntl qw/:flock/;

open my $fh, '+<', './count.dat' or die $!;
eval { flock $fh, LOCK_EX };
$count = <$fh>;
seek $fh, 0, 0;
print $fh $item == 1 ? $count + 1 : $count -1;
truncate $fh or die $!;
close $fh;

614 名前:610 mailto:sage [2007/02/10(土) 19:27:24 ]
>>613
正直、書かれている内容がさっぱり分からないので、リファ本で読み進めながら
テストしたいと思います。ありがとうございます。

615 名前:610 mailto:sage [2007/02/10(土) 21:14:23 ]
>>613
早速アドバイスを実装したところ、思った通りに動いてくれました。
どうもtruncateがポイントだったようですね。ありがとうございました。

616 名前:デフォルトの名無しさん [2007/02/11(日) 04:18:34 ]
正規表現でマッチしたものを任意の変数に入れて(もしくは任意のエイリアスに結びつけて)、
後で取り出すことって出来るのでしょうか?
マッチした順に$1や$2ではなく、(.*?>$name)とかした時、
(.*?)のマッチを$nameで受け取れると非常に嬉しいのですが。。
どなたかアドバイスいただけると嬉しいです。。

617 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 05:58:10 ]
>>616
マッチした後に代入しておくんじゃなんで駄目なんだ?
if (/(.*?)/) {
$name = $1;
}


618 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 06:01:14 ]
>>616
マッチしたもののリストが返ってくるのでそれを受け取る
($a, $b) = /^(.)(.)/;




619 名前:616 mailto:sage [2007/02/11(日) 09:49:39 ]
>>617-618
返信ありがとうございます _ _
なぜエイアリアスに結びつけたいかというと
βのウェブサービスのラッパーを作っていて、
正規表現がころころ変わる可能性がある(欲しい文字列が前後する可能性がある)からです。
欲しい文字列が前後してしまうと正規表現だけでなく、
その後の正規表現を受け取るコードも変更しなければならなくなってしまうので。。
# 正規表現を正規表現で自動生成するスクリプトを作っていたら、
# 文字列が前後した場合その部分は自動化できなくなってしまうことに気づき、
# 質問させて頂きました。

620 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 11:04:20 ]
>>588,599
それは文字化けでなく、エスケープされてるだけ。
Data::Dumper の仕様






[ 続きを読む ] / [ 携帯版 ]

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

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