Perlについての質問箱 29箱目at TECH
Perlについての質問箱 29箱目 - 暇つぶし2ch705:デフォルトの名無しさん
07/02/19 04:59:09
>>704
$ perl -h
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed

-p は while (<>) { ... print; } で囲まれる。

706:デフォルトの名無しさん
07/02/19 05:26:43
挙動的に同じって意味だと思ってたら、
本当にプリプロセッサのように囲まれるのね

707:デフォルトの名無しさん
07/02/19 18:41:27
if ($a) { print $a; }
この書き方と

print $a if $a;
この書き方では何か違いはあるのでしょうか

708:デフォルトの名無しさん
07/02/19 18:44:48
見た目

709:デフォルトの名無しさん
07/02/19 20:24:07
すいません、質問です。
大体5万行くらいの大きさのテキストファイルから、
重複している行
(連続して重複してるわけでは無く、内容が同じ行が
とびとびに存在してる)を一つのこして、残りは省く
というスクリプトを書く場合、
1)1行目はそのまま書き出す
2)2行目は1行目と比較して、同じだったら書き出さない、違ったら書き出す
3)3行目は1行目と比較して、同じだったら書き出さない、違ったら2行目と比較して、、、
4)以下繰り替えし

このようなスクリプトしか無いのでしょうか?
処理に非常に時間がかかるので、何か良い方法があったら、御教示下さい。


710:デフォルトの名無しさん
07/02/19 20:31:36
>>709
「perl 重複」でぐぐればいろいろテクニックが見つかる

711:デフォルトの名無しさん
07/02/19 20:36:03
>>709
5万行くらいなら全部ハッシュテーブルに詰め込んでも大丈夫そうだが

順序崩していいならソートしてから重複を除くのがいいだろう

712: ◆TWARamEjuA
07/02/19 20:38:10 BE:2613683-2BP(6811)
1. 1行目の内容をハシュのキーに詰め込む。
while (<$fh>) {
 $hash{$_} = 1;

2. 読み込みが終わったら、keyを書き出す。
 print for keys %hash;


1-1. 読み込んだ順に書き出したい時。
my $line;
while (<$fh>) {
 $hash{$_} = [$_, ++$line];

1-2. 先に読み込んだ方を有効にしたい時。
 $hash{$_} = [$_, ++$line] unless $hash{$_} ;

2-1. 読み込みが終わったら、sortしながらkeyを書き出す。
 print for sort $hash{$a}->[1] <=> $hash{$b}->[1], keys %hash;

脳内妄想なので、補完よろしこ(照)

713: ◆TWARamEjuA
07/02/19 20:39:43 BE:1742382-2BP(6811)
ん、、、リファレンスにしなくても良かったか(呆)

714:709
07/02/19 20:42:52
>>710-712
ありがとうございます。ハッシュテーブルを使う方法は、
全く考えてませんでした(というか今迄使ったことが無かったので)

とりあえず、ハッシュテーブルの使い方を勉強してきます。

715:デフォルトの名無しさん
07/02/19 20:57:05
perl -ne 'print if not $seen{$_}++;'
でいいだろ。

メモリ足りないようならtie()使ってDBMファイルをワークに使えばよし。

716:デフォルトの名無しさん
07/02/19 20:58:32
Perl やっててハッシュを使ったことが無いとな

717:デフォルトの名無しさん
07/02/19 22:07:13
今までperlやってなかったんだろ

718:デフォルトの名無しさん
07/02/19 22:16:49
無名(?)のBLOCKで、
{} ←中身が空だとエラーになるんだけど、素のBLOCKは使ってもいいのか、
使えるが推奨されてないのか、perl的でないのか、どんな感じなんでしょう?

719:デフォルトの名無しさん
07/02/19 22:28:43
WindowsでNMAKEが必要なモジュールのインストールについて質問。
Windows2000では問題がなかったのに、vistaになってDBIとかがインストールに失敗する。
どうすれば回避できる?

720:デフォルトの名無しさん
07/02/19 22:41:06
>>719
そのエラーメッセージで言われてるところを直せばインストールできるんじゃないか

721:デフォルトの名無しさん
07/02/19 22:46:44
>>718
$hoge = {};
何か見えてこないかい?

それからperlrefのMaking Referencesの3番辺りに目を通すといいと良いかと。
…スクリプティング言語資料室さんの訳、そこの所間違ってるかな
> 一方、ハッシュではなくBLOCKへのリファレンスを返すのであれば、

722:718
07/02/19 23:08:43
>>721
おー、ありがとう。丁度良い書き方が見つかりました。

{}だけ書いて中身は後で書きたいときに、エラーになるのが気持ち悪かったのですが、
{;}という方法があったか!

723:デフォルトの名無しさん
07/02/20 16:33:08
最近対策済みのスパムに漏れて書き込みが散見されるので
if ($comment !~ /(\x82[\x9F-\xF2])|(\x83[\x40-\x96])/) {&er_("cannot write!","1");}

ここを変えたいと思います。
ここをひらがなの「あ」~「ん」が含まれていなければ、という意味にしたいのですが、

「あ」は 82A0
「ん」は 82F1 です。

(\x82[\x9F-\xF2])|(\x83[\x40-\x96])
これをどう治せばいいのでしょうか?

↑正規表現とマッチングを理解していないので、
これのはっきりとした意味がわかっていません。
たぶんカタカナまで含まれていると思うのですが・・。

724:デフォルトの名無しさん
07/02/20 16:51:19
>>723
sjisか。
| の左側がひらがなで、右側がカタカナでしょ。
ひらがなだけよけたいなら、

$comment !~ /\x82[\x9F-\xF1]/

でいいんじゃね?

725:723
07/02/20 17:04:41
>>724
ありがとうございます。
ひらがなのみのフィルタで無事動きました。

726:中の人
07/02/21 00:01:39
>>721
すまん確認した。
どこをどうすればこういう勘違いをするんだかわれながら不思議だ。

つーことで今週末までをめどに修正しておきます。


727:デフォルトの名無しさん
07/02/21 21:57:48
なるほどねぇ

728:688
07/02/21 22:09:52
>>690
自己解決しました。

my $CopyMemory=new Win32::API("kernel32", "RtlMoveMemory", "NPI", "V");
defined $CopyMemory or die "Cant find CopyMemory";

$CopyMemory->Call($lParam+48, $clrText, 8);


729:デフォルトの名無しさん
07/02/21 22:18:46
>>728
訂正688→686

730:デフォルトの名無しさん
07/02/21 23:31:13
>>728
substr( $lParam, 48, 8, $clrText);

$object->TextColor( (unpack('II',$clrText))[1] );
$object->TextBkColor( (unpack('II',$clrText))[0] );
にする方が楽だと思うけど、自己解決おめでと。

731:686
07/02/22 00:45:28
>>730
それじゃ、Selectすると全部色変わっちまうぜよ。

732:690
07/02/22 01:35:07
>>728
自己解決おめでとう。
>>689
substr( $lParam, 48, 8, $clrText);
の意味について考え直したのだが、以前のバージョンのActivePerl では
「裏仕様」として、「$lParam がポインタと考えられる場合は、間接指定
されたアドレスの文字列(バイト列)を操作し、そうでなければ$lParam
そのものを操作する」というのがあったのではないだろうか。
>>689 のソースを読む限り、そうとしか思えない。
 ところが、この「裏仕様」は危険であるし、安全確実な間接アドレス指定方法
が手当てされたから、いつかのバージョンで廃止されたんだろうね。


733:デフォルトの名無しさん
07/02/22 16:07:47
if( $ENV{REMOTE_ADDR} eq ’’ )
ってありえるのでしょうか?

734:デフォルトの名無しさん
07/02/22 16:26:33
>>733
CGIとかで動かしてるなら鯖の仕様次第だし
普通にコマンドラインから実行すれば空になる

735:デフォルトの名無しさん
07/02/22 19:59:42
$comment に http の文字が5つ以上あるとエラーを出したいのですが、
正規表現でのチェックはどうすればいいのでしょうか?

if( $comment /~ (.*http.*http.*http,*http,*http) ) { error(); }

こんな感じでしょうか?orz

736:デフォルトの名無しさん
07/02/22 20:46:31
if ($comment =~ /(.*http){5}/s) { error(); }

737: ◆TWARamEjuA
07/02/22 21:22:57 BE:5227968-2BP(6811)
print "error" if $comment =~ /http/g > 4;
 だめだった。。。

print "error" if scalar @{[$comment =~ /http/g]} > 4;
 桶だった。。。

詳しい人の解説キボンヌ(照)

738:脱帽
07/02/22 21:26:24
スカラーだと真か偽しか返さないから

739:脱帽
07/02/22 21:27:58
スカラーの場合は真か偽しか返さないからじゃ

740:デフォルトの名無しさん
07/02/22 21:44:26
スカラーコンテキストでマッチした数が返ってくるのは置換の s///g の場合。
なので、もしそういう風に書きたいのなら

print "error" if $comment =~ s/http/http/g > 4;

とか書くといいかも。

741:デフォルトの名無しさん
07/02/22 22:04:23
なるほどねぇ

742:735
07/02/22 22:24:08
if($comment =~ s/http/http/g > 4){ &er_('cannot write!');}
これでいけました。

s/hogehoge/fugafuga/gの s と g の意味がわからなかったのですが、
調べて理解できました、ありがとうございます。

743:デフォルトの名無しさん
07/02/23 13:36:53
WindowsXP + ActivePerl 5.8.8 build 820 です
こちらは初めてです、29箱目ということで既出質問だったらすみません

上記環境で モジュール Encode が threads と同時に上手く働きません
perl素人の自分なりに調べた結果、Encode モジュールはスレッドセーフでは
ないのではないかと思い始めたのですが、それで間違いないでしょうか?
それとも私が何か大事なお約束や呪文を忘れているのでしょうか

また、スレッドセーフで無かった場合、各スレッド内で文字コード変換を
行いたい場合、皆さんはどのようにしているでしょうか

744:デフォルトの名無しさん
07/02/23 14:04:52
>>743
適当にぐぐったらこういうのがあった。

URLリンク(www.nntp.perl.org)

確かに試すとたまにおかしな結果になる。ちなみに手元のバージョンは
v5.8.8 built for i486-linux-gnu-thread-multiだった。

マニュアル見てもthread-safeであるとは書いてないし、原則は明記されて
なければunsafeと思えだから間違ってはいないのだろう。

で、俺はスレッドでEncode使った経験はないからなんともいえないのだが、
普通に考えたら適当なshared variableでlockかけてから使うぐらいしか
ないのではないだろうか。


745:743
07/02/23 14:22:08
>>744 返信ありがとうございます

確実に再現性のある最小コードを続いて投稿…と思ったのですが上手くいかずorz
自分の考え違いだったかもと思っていたところでした

URL 先のコードを試した結果、私の環境でもおかしな結果を不規則に起こしました

再入しないようにとりあえず自衛していく方向でいってみます
ありがとうございました

746:743
07/02/23 16:42:34
他のモジュール内でもEncode使っているのが多くありそうですね

PerlIO layer での :encoding(~) とか
HTTP::Message の decoded_content とか便利だなーとガシガシ使っていたので
どんどん泥沼のソースになっていきましたorz

747:デフォルトの名無しさん
07/02/23 16:45:17
よく使われる奴はthread safeにして欲しいね


748:デフォルトの名無しさん
07/02/23 22:14:02
小飼氏(メーリングリスト)に投げてみたらいいんじゃないかな。
つーか投げてほしい。

749:デフォルトの名無しさん
07/02/23 22:54:10
blogの感じからするとすごく暇そうなので「直せやおら」とか言うといいんじゃね?>Encode
メーリングリストはJcodeメーリングリストでok

750:デフォルトの名無しさん
07/02/24 02:14:26
あのヒゲモジャのことだからギブミーpatchでかえされるに200ペソ

751:デフォルトの名無しさん
07/02/24 11:03:22
それはひどい>ギブミーpatch


752:デフォルトの名無しさん
07/02/24 13:51:21
なんの解決にもならないw>ギブミーpatch

753:デフォルトの名無しさん
07/02/24 14:57:03
>>751-752
なにが「ひどく」て「解決にならない」なの?
ライセンスがArtisticとGNU GPLのデュアルライセンスで、
どっちもソースが公開されているものなんだから不具合あったらソースを追って自分で改変するくらい当たり前じゃん。
おまえらはフリーライダーなの?それともそれをやるだけの能力がない低脳なの?


754:デフォルトの名無しさん
07/02/24 15:28:14
これは酷い混じれ酢だ

755:デフォルトの名無しさん
07/02/24 17:43:38
少なくとも小飼氏よりは低能間違い無しです><

756:デフォルトの名無しさん
07/02/24 20:38:11
patchが作れるなら人に頼らないしメールも送らないってば。

757:デフォルトの名無しさん
07/02/24 20:55:47
「ギブミーpatch」といわれたら、「無理!」って返事すればいいだけ。

キラクニヤレヤ~♪

758:デフォルトの名無しさん
07/02/24 22:05:02
(´・ω・)

759:デフォルトの名無しさん
07/02/24 23:26:36
質問です。
浮動小数点計算をループでしていてその結果を出力したら、
あるタイミングから#INDというのが出力されました。
これは一体なんでしょうか、、、

760:デフォルトの名無しさん
07/02/24 23:35:56
不定値(正負の無限大 or NaN)
0除算してるんじゃね?

761:デフォルトの名無しさん
07/02/24 23:48:49
>>760
レスありがとうございます。
数値扱いされてないのでしょうか?
具体的なコードはこんなかんじなんですが、、


my $a = -0.1382 ** 0.000212494687632809;
my $temp = -0.1382;
my $b = $temp ** 0.000212494687632809;

これだと$aはちゃんと出力されるんですが、$bは-1.#INDと出力されます。。

762:デフォルトの名無しさん
07/02/25 00:11:04
>>759
indefinite

763:デフォルトの名無しさん
07/02/25 00:27:05
>>761
"**"は"-"より強いので
-0.1382 ** 0.000212494687632809

-(0.1382 ** 0.000212494687632809)に等しい。

764:デフォルトの名無しさん
07/02/25 01:53:36
>>761
Math::BigFloat

765:デフォルトの名無しさん
07/02/25 02:10:48
>>762
>>763
>>764
レスありがとうございます。明日にでも試してみたいと思います。

766:デフォルトの名無しさん
07/02/25 12:00:00
(´・ω・)12時

767:デフォルトの名無しさん
07/02/25 19:23:35
(´・ω・)時報スクリプトを作ってみました..

#!/usr/bin/perl
use WWW::Mechanize;
$mech = WWW::Mechanize->new(agent => 'Mozilla/4.0 (MSIE 6.0;)');
while(1){
my(@t) = localtime(time);
unless( $t[1] == 59 && $t[0] > 20){sleep(30);next;}
$mech->get($ARGV[0]);
$mech->field("MESSAGE" => "時報");
$mech->click();
(@t) = localtime(time);
sleep(60-$t[0]);
$mech->click();
}

768:デフォルトの名無しさん
07/02/27 20:41:51
日本語PDF作るモジュールのお薦めってありますか?
PDFJ?


769:デフォルトの名無しさん
07/02/27 22:40:04
PDFJ


770:デフォルトの名無しさん
07/02/28 00:10:35
$input=<STDIN>;
$input=~s/\n//;

print "$input";

コマンドラインから「\n\n」と入力した場合に
「\n\n」と出力されるのではなく、改行2個が出力されるようにしたいんですが
どうすればいいですか?

771:デフォルトの名無しさん
07/02/28 00:17:23
自力でs/\\n/\n/g;とするかevalするか

772:デフォルトの名無しさん
07/02/28 00:24:39
>>771
わかりました。ありがとうございます。

773:デフォルトの名無しさん
07/02/28 00:52:29
>>771,772
evalは安易に使うとコマンド実行も出来ちゃうので正規表現にしとけ。
どうしてもeval使う場合は入力チェックしないと危険よ

774:770
07/02/28 01:14:01
>>773
アドバイスありがとうございます。
自分でちょっとしたテキスト処理をやりたいだけなので大丈夫です。
\< や \/ や \. などの入力が入った場合、その都度
s/\\\</\</;
s/\\\./\./;
を書かなければいけないのでevalにします。ありがとうございました。

775:768
07/02/28 13:05:37
>769 サンクス。
自由度がありすぎて面倒な部分もあるんだけど、
やっぱPDFJでいってみます。



776:デフォルトの名無しさん
07/02/28 16:35:41
質問です 頓珍漢だった笑ってください

perlはCの #include に相当する機能はあるのでしょうか?

今、Perlで統計解析の処理をしています。解析手法ごとに異なったスクリプト
を作っています。

入出力部分が複雑なんでここの部分と全体で使える共通サブルーチンだけ切り出して
別ソースにして、実行時に組み込んで使いたいのですが、どうも旨くゆきません。

ぐぐったりしてみましたが、Use、Requireの話しか検索できません。何か単純に
Includeする方法は無いのでしょうか?




777:デフォルトの名無しさん
07/02/28 16:48:38
>>776
そう難しくないからモジュールにしてuse使うべきだな。


778:デフォルトの名無しさん
07/02/28 16:48:43
  ァ  ∧_∧ ァ,、
 ,、'` ( ´∀`) ,、'`
  '`  ( ⊃ ⊂)  '`


779:デフォルトの名無しさん
07/02/28 16:49:14
 ははは      
   ∧_∧                もうダメ      
   ( ´∀`)                 ∧_∧          モウ カンベン
.  ( つ ⊂ )     ヒヒヒヒ         (´∀` ,,)、 あははは    シテクダサイ
   .)  ) )  ○   ∧_∧ ,     , へ,, へ⊂),    ∧_∧ ○,
  (__)_)⊂ ´⌒つ´∀` )つ   (_(__)_丿  ⊂(´∀`⊂ ⌒ヽつ


780:デフォルトの名無しさん
07/02/28 16:52:53
requireで問題なくできそうだけど駄目なんかな

781:デフォルトの名無しさん
07/02/28 17:02:56
目線を高くしてオブジェクト指向にしたらどうだ?

782:デフォルトの名無しさん
07/02/28 17:07:13
776はrequireやuseの説明を読んでないのではないのでは?
includeとスペルが違うからって脊髄反射したのか?
そうでないのなら、ますはrequireでは駄目だった点を質問文につけないと回答者は答えようがないぞ

783:デフォルトの名無しさん
07/02/28 17:08:32
すまん
×776はrequireやuseの説明を読んでないのではないのでは?
○776はrequireやuseの説明を読んでないのでは?


784:デフォルトの名無しさん
07/02/28 17:11:40
名前空間の問題とかあるし、普通にモジュール作るのがいいと
思うけどな。よほどこったことやるんじゃなけりゃ、Exporter
使えば一発だし。


785:デフォルトの名無しさん
07/02/28 17:14:16
>>776は最後に1;を入れ忘れてると見た

786:笑われた 776
07/02/28 17:22:05
すみません確かにRequireに関して真面目に読んでいないです

Cの#includeのつもりだったので、

------------ 今まで ------------

初期の宣言など・・・

open(FP, $filename) or die($filename);

while(<FP>) {
$hash{$key} = hoge;
}


------------ 変更 ------------


初期の宣言など・・・

require 'other.pl';

&sub($filename, \%hash);


と変更しただけなんですが・・・・実行時に



787:デフォルトの名無しさん
07/02/28 17:25:10
ワッフルワッフル!!

788:デフォルトの名無しさん
07/02/28 23:16:02
単純に定数の扱いがやっかいかな。perlは。

789:デフォルトの名無しさん
07/03/01 01:53:41
use constant FOO => 'bar';

use Readonly;
Readonly my $HOGE => 'fuga';

こういうのでいいじゃん。

790:デフォルトの名無しさん
07/03/01 08:05:44
PerlでCPANによるモジュールのインストールが失敗します。
install LWP::Simple
....
BEGIN failed--compilation aborted at /System/Library/Perl/Extras/5.8.6/darwin-thread-multi-2level/HTML/TokeParser.pm line 12.
Compilation failed in require at ../blib/lib/HTML/Form.pm line 116.
html/form-param.......dubious
Test returned status 2 (wstat 512, 0x200)
DIED. FAILED tests 1-24
Failed 24/24 tests, 0.00% okay
....

どなたかお助けを。
環境:MacOS X 10.4 Tiger, perl 5.8.6


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