Perlは死んだ
さようなら! 過去の言語!
今は日本語処理はEncodeモジュール一択 Jcode関係は過去のやり方です。
# [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 でエンコードする必要があります。
なんかへんなのに割り込まれちった。まあいいや。
1レスで理解できるutf8フラグ utf8フラグとい名前がまずかったね。 文字列フラグなどという名前だったらよかった。 文字列フラグはPerl固有のものだから Perlコード外部から渡されるのは文字列ではない。 文字列でなかったらなにか?それはバイナリ。 バイナリを文字として扱いたければ、文字に変換しないといけない。 それがdecode。 ではソースコードに書いてあるのは、文字かバイナリか。 それはuse utf8を使えば文字で、そうでない場合はバイナリ。 話はこれだけ。
use Encode; while(<>){ chomp; my @row = split(/,/, $_); for my $row (@row){ Encode::from_to($row,'utf8','sjis'); print $row; } }
バイナリと文字列は同じものなので区別なく扱えるのがUNIXやPerlの利点。 Windowsだとそうはいかない。
> バイナリと文字列は同じものなので 文字列には、文字数というものがあるので 文字とバイナリは違います。
OSに関係なく、少なくとも文字列はバイナリデータに含まれます。
そしてバイナリデータを文字列のように扱えるのなら覚えることが 減るので利用者として楽です。
・バイナリ ビット(バイト)が並んだもの。それ以外に情報を持っていない。 ・文字列 バイナリに様々なメタ情報が追加されたもの。 文字コード情報がが固定、もしくは内包されている。 データの終端情報を持っている。 1文字という概念がある。1文字は多バイト、または可変バイトで構成されている。 バイト単位での操作は行わない。
つまんないこと言ってないで、Data::Dumper 答えてやれよ
テキストデータとバイナリデータの違いは何かという普遍的な議論へ
文字列フラグというければ、chr($n) で $n < 255 のときとそうでない ときでフラグがつく、つかないが変わる、ということからすると、latin-1 リテラルで Unicode 文字列をあらわすというのは今でも、それが perl の正しい文字列の扱い方ということになるとおもう。
>>20 だから、そういうへんな挙動がないEncodeモジュールを
使ってくださいと書いてあるんだよ。
http://perldoc.jp/docs/perl/5.8.1/utf8.pod > utf8::encode($string)
>
> 論理キャラクタを、8ビットシーケンス表現に、PerlのUTF-Xエンコーディングに、
> (適切に)変換します。何も返しません。 Encode::encode_utf8()と同じです。
> 次のことに注意してください。レガシーのバイトエンコーディングを、
> Unicode にする変換に使うべきではありません:そのためには、Encode を使って下さい。
>>17 そこに書いた「文字列」を「文字列インスタンス」「文字列オブジェクト」
と書換えるのなら構わないけど、一般的な言葉の「文字列」をその定義に
しちまうのはどうよ?
そうでないと今、見えているものが文字列じゃなくなっちゃうぞ。
> そうでないと今、見えているものが文字列じゃなくなっちゃうぞ。 なんで? データの終端情報は微妙だけど、 ここに書いてある文字を読むためには、ShiftJISという文字コード まで含めてやっと文字列として読めるだろ? そしてその1文字が何バイトであるかなんて考えないだろ?
そもそも紙に手書きしたものも文字列だし、印刷した場合でも文字列。 パピルスに書かれたものも、粘土板に刻まれたものも、木簡に書かれた ものも文字列と言われてきたのだから、これからもそうしたほうがいい と思う。 (それともお前が全部燃やしたいの?) ・(ひとが扱う)文字列 バイナリに様々なメタ情報が追加されたもの。 → コンピュータ導入前から人間は文字列は使っているわけで、"バイナリ" は無関係。コンピュータがデジタルではなった場合も然り。 文字コード情報が固定、もしくは内包されている。 → 同じ理由で文字コード情報は文字列の定義に関係がない。 データの終端情報を持っている。 → バイナリデータだって終端情報を持っていることがある。 1文字という概念がある。 → 確かに。でももしかしたら1文字の概念があやふやだったり、なかったり するようなもの(言語?)もあるかもしれない。 1文字は多バイト、または可変バイトで構成されている。バイト単位での 操作は行わない。 → これまたコンピュータ上/内の話。コンピュータの有無やその構造・方式 と文字列の定義は無関係。
>>25 意味がわからん。
今はコンピュータ上の文字の表現の仕方の話だろ。
手書きしたものとか言い出したら、
文字はバイナリではない(分子かなんかカ?w)ということになるだろ。
なに関係ありそうで関係ないものの話持ちだしてんだかw
こいつは頭が悪いと認定してよさそうだ。
バイナリだけでは、それを文字として認識することは不可能。 文字コード情報が別に必要になる。 ASCIIだって、ASCIIコードという情報がなければ、 アルファベットですら文字として認識できない。 たとえばASCIIコードでABCDと書いてあるように見えても、 これはASCIIではなくUTF32ですといわれれば別の文字になるしね。 文字を文字として認識するためには、文字コード情報が必要不可欠。 C言語とかこの文字コード情報が文字列にくっついていないから (そもそもC言語には文字はあっても文字列はないんだが) 文字として表示するためには人間が文字コードのことを考慮する必要があった。 最近の言語では、文字とバイナリは区別され、文字には文字コード情報が内包されている。 そのため、人間がいちいち文字コードは何か? と考える必要がなくなった。 PerlのUTF8フラグもその一つ。
>>27 中途半端に持ってくるなよ
基本的に、コンピュータは数字だけを扱います。彼らはそれぞれに番号を割り当てることによって、
文字や他の文字を格納する。ユニコードが発明される前に、これらの番号を割り当てるための
さまざまなエンコーディングシステムの何百ものがあった。単一の符号化に十分な文字が含まれていないことができます:
例えば、欧州連合(EU)だけではそのすべての言語をカバーするいくつかの異なるエンコーディングが必要です。
であっても英語のような単一言語の単一の符号化は、共通使用されているすべての文字、句読点、技術記号のための十分でした。
お互いに、これらの符号化システムは、また競合。つまり、二つのエンコーディングは、2つの異なる文字に対して同じ番号を使用して、
または同じ文字に異なる番号を使用することができます。任意のコンピュータ(特にサーバ)さまざまなエンコーディングを
サポートする必要があります。まだいつでもデータが異なるエンコーディングやプラットフォーム間で受け渡され、データは常に破損の危険性を実行される。
>>29 からも解るように、
「2つの異なる文字に対して同じ番号」を割り当てるわけ。
つまり番号からでは、どの文字かどうかはわからない。
そこで使用されるのが、エンコーディング(文字コード)
番号を文字として認識するには、文字コード情報が必要不可欠
ここがPerlスレなのは承知してるけど、文字列はPerlだけのものじゃないだろ? 例えばPerlで処理した後にPythonで処理したり、お前の母ちゃんが処理したり することもあるだろ?
>>31 そういう場合は文字を一旦バイナリに変換する。
そして他の言語でバイナリとして読み取ったものを
その言語用の文字列として変換するんだよ。
どうしてもバイナリと対比させたいんだなw
お前の母ちゃんバイナリ扱えるのか、ちょっと感心した。
もしかして、テキストエディタと バイナリエディタの区別がつかない人? バイナリのまま、文字列を操作するのは大変だろw だからテキストエディタで文字列として解釈させて・・・ でも元がバイナリ(文字コードデータが含まれてない)だから、 たまに自動判定できなくて・・・ こんなことを、いちいち言わないとわからないのかな?
だからコンピュータに自動判定させるなって。
コンピュータは文字(文字列も)扱えないんだからさ。
文字(文字列)を扱っているのはお前で、お前のコンピュータが文字を 扱っているわけではない。もし今会話している相手がコンピュータ だっていうならチューリングテスト合格だと思うぞ。
コンピューター一般においての文字列(テキストデータ)として話してる人と、 プログラミング言語での文字列型に格納されてる文字列について話してる人がいるかかみ合わないのでは?
perlのutf8フラグの話が発端なんだから プログラミング言語での文字列型に格納されてる文字列 以外の話をしている人は、なんなんだろうね。
(△△△クラスの)文字列オブジェクトって言ってくれれば、言っている ことにすべて同意する。
>>42 ここはperlスレ。
perlにおいて文字列オブジェクトとは
変数の値にUTF8フラグがついたもの。
>>41 格納される前は、格納されるものを何て呼べばいいの?
そこを議論しているつもり。
確かに格納される前の話はPerlと無関係かもしれないけれど、説明したり
するときにどうしてもそれを表わさないといけないよね?
つ ソース文字列
A) 文字列にはソース文字列が格納されている B) 文字列オブジェクトには文字列が格納されている
文字列にはリテラルの語感があるので、A) が不自然に感じる。
>>44 これでも読んでください。
http://perldoc.jp/docs/perl/5.10.0/perlunitut.pod ・テキスト文字列(文字の文字列)
テキスト文字列、または 文字の文字列 は文字からなります。
バイト列はここでは無意味で、エンコーディングがあります。 各文字は単に文字です。
テキスト文字列は Unicode 文字列 とも呼ばれます; なぜなら、Perl では テキスト文字列は Unicode 文字列だからです。
・バイナリ文字列(バイト文字列)
バイナリ文字列、または バイト文字列 はバイト列からなります。
ここでは、文字はなく、単にバイトだけがあります。
外側の世界(現在の Perl プロセスの外側のあらゆるもの) との通信はバイナリで 行われます。
・エンコード
エンコード は テキスト から バイナリ への変換です
・デコード
デコード は バイナリ から テキスト への変換です。
質問:二次元配列の、最後の配列要素の最後の要素を参照するにはどうすればいいでしょうか。 例: @array = ( [1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15] ); 希望:上記2次元配列の中味が分からないという状況で、15という一番最後の数字を取得したい。 状況:@{$array[$#array]}で最後の配列要素[11,12,13,14,15]を取り出せることまで分かりました。 その後、いろいろ試したんですが、うまくいきません。[-1]は使えないみたいですし……。 ご教授お願いします。
なんてことはない、 B) ≒ C) 文字列変数に文字列が格納されている ってこと。 Perlの場合は文字と数値を区別しない変数なので文字列変数ってもの がなかったわけで、ついでにバイナリストリングと文字列の区別も なかった。区別がない方が便利なこともあるし、システム的に区別が あった方が便利なこともある。 でも入れるものと入れられるものを区別できないと困るし、単語が 今までの用法と異なるのも混乱の元。
print (@{$array[-1]})[-1];
print $array[-1][-1];
arrayって あ~れぇ~って読むの? それとも、ありぃ~?って読むの?
54 :
デフォルトの名無しさん :2011/10/30(日) 18:36:16.81
アレィ
A') 数値にはソース数値が格納されている B') 数値オブジェクトには数値が格納されている 数値にはリテラルの語感があるので、A') が不自然に感じる。
変数に数値(数値オブジェクト)が格納されている。 変数にバイナリ値が格納されている。 変数に文字列が格納されている。 これでいいじゃん
>>51 >>52 ありがとうございます。
[-1]だと何故かダメなんです。表示されません。
>>57 -1 が使えない状況がおかしい。
使えないというコードそのままさらしてみ?
>>56 格納される前は?
これから格納しようかと思っているものの名称は?
>>59 要するに変数の右辺だろ?
変数に入れたからって、右辺の状態が
変更されるわけ無いだろ。
変数に入れるまでもなく、
数値、バイナリ値、文字列、ついでにオブジェクトだよ。
×要するに変数の右辺だろ? ○要するに変数への代入式の右辺だろ?
右辺といってる時点でもうスクリプトの中の話になってるしw
え? スクリプト外?
なら答えは
>>48 に書いてあるじゃん。
> 外側の世界(現在の Perl プロセスの外側のあらゆるもの) との通信はバイナリで 行われます。
はい、バイナリです。
おれ、この流れすきwww
スクリプトの外には出たものの、まだコンピュータの中だな。 がんばれ!!!
1レスどころか66レスまでひっぱるutf8フラグ
utf8フラグがあるべきところ
{ no utf8;
>>58 環境はHTML出力なので、
あまり周辺を広げるとスレ違いになりそうなんすが、
my @current_month = calendar($mon,$year); #@current_monthに対象月の日にちデータを二次元配列で格納。
print @{$current_month[-1]}[-1]; #対象月の最終日を表示。
試したもの↓
print "$current_month[-1][-1]";
print "@{$current_month[-1]}[-1]";
print "@{$current_month[$#current_month][-1]}";
print "$current_month[$#current_month][-1]";
""を外してみてもダメでした。
calendar が1次元配列で返せば解決
「初めてのPerl 第3版」(ちょと古い)をひと通り読んで、 モジュールの作り方とか載ってないので、次の本を探 しています。 だいたいPerlの書き方はわかったので、リファレンスを 兼ねた本がいいと思い、「プログラミングPerl 第3版」 を検討していますが、内容的には古くないでしょうか? 2002年というのがどうにも気になりまして。 あとできればマルチバイト文字にも配慮した本だと いいのですが望み薄ですか? shiftjisのテキストファイルを扱うときに、日本語処理に 随分手間取ったので。(Encodeモジュールを使いました)
>>72 週ごとに区別する都合で2次元配列なんです。
いろいろ手間をかければ月の最終日が何日なのかは参照できると思いますが、
一発でアクセスできる方法があればなと……。
@{$current_month[-1]} は最終週を返しているか確認した?
use Data::Dumper ; して、 print Dumper \@current_month ; の結果が想定通りかまず調べろ。 実際には一次元が返ってたとか、undef が 返ってたとかあるだろ。
print (grep(/\d/,@{$current_month[-1]}))[-1];
一週間は7日固定で作られていて、最終週の後半は undef で 埋まっているに一票。
>>78 今日はもうコードをチェックしませんが、恐らく真理です……。
calendarモジュールから取得した日にちデータを、
実際のカレンダーのように、日~土までを一行として表組みしてます。
仮に月曜日でその月が終わるとすると、火~土までは空白セルとして表示するようになってます。
……とすると配列の最後尾にアクセスするんじゃなくて、
undefでない最後の有効値にアクセスするように書けばいいってことですよね。
いちいちループ使ってその配列の後ろからundefかそうでないかを調べていったほうが早いでしょうか。
一発で最後の有効値にアクセスする方法ってあります?
>>79 77氏がその質問を予見してて、答えの一案を書いてるだろ。
undef かもしれないものに直接 /\d/ はダメじゃね
use strict; use warnings; もしてないであろう
>>79 なら平気かしらんが
>>73 続・初めてのPerl 改訂版
まるごとPerl! Vol.1
それに腐っても鯛、
プログラミングPerl 第3版
は、読む価値がある
でもその前に
プログラミングPerl 第2版
を薦めておく
オライリーだからいいって言ってるだけで 実際は読んでないんだろうなw
>>79 欲しいのは「二次元配列の最後の(undefではない)要素の値」なのか、
「その年・月の末日の日付」なのか、どっち?
後者ならその配列の値を参照する以外にも取得方法はあると思うが。
use Date::Calc qw(Days_in_Month);
print Days_in_Month($year,$mon);
とか。
まあ
>>77 の方法でもいいだろうけど。
Imager.pmで画像のリサイズをしています。 例えば、480×320pxの画像を、400×400pxの枠内に収めたいとき、 cropするだけだと、400×300pxとなってしまいます。 これを、上下50pxずつ白い背景を付け足して、400×400pxの画像に したいのですが、方法をご存知の方がいたら是非教えてください。
>>79 俺だとこうするかなぁ。行頭の空白全角にしてるけど:
my $last_day = (
grep { defined $_ }
map { @{$_} }
@current_month
)[-1];
>>18 Data::Dumperは出力結果をevalすると元に戻るというのも趣旨の1つ。
そのため、元がテキスト文字列だったものをevalしてもテキスト文字列
に戻るように、"\x{ff84}"という記法で出力している。
use warnings して warnings の出力ちゃんと見てればあんな質問する前に原因に気づけてるはずなんだよ…… 大方、CGI でしか動かしてなくてしかも CGI::Carp を使ったデバッグすらしてない、とかなんだろうけど。
90 :
デフォルトの名無しさん :2011/11/01(火) 17:59:02.82
perlのソート関数ってどんなソート方法が使われているんですか? 1000個の配列を大きい順に並びかえるようなソートだと 自作関数だと1000*1000回のループになっちゃうんだけど、これより速いですか?
91 :
デフォルトの名無しさん :2011/11/01(火) 18:01:00.07
訂正:1000*(1000ーn)回のループです
#!/usr/bin/perl -w use encoding "utf8" use Encode; use strict; print encode('shiftjis',"テストテスト"); こんな感じのソースを書いて、UNIXサーバに送って TeraTerm(SJIS設定)で実行すると文字化けする んですが、何が問題なのでしょう? TeraTermをutf8設定にして、encodeなしでで表示させれば、 うまく表示されるんですが、SJISのファイルが多いので、TeraTermの 設定はSJISにしておきたいと思っています。 もちろん上記ソースはUTF8で保存してます。
>>94 おー ありがとうございます。
ソースが職場なので、あとで確認してみます。
この辺の漢字圏の文化を踏まえたPerlの本が
あると良いのですけど、ありませんかね?
漢字とか知らないけど モダンperlについて調べたほうがいい。 ネットは古臭いコードで溢れてる。
ユーザが繰り出すモジュールで最先端が変化するってのも これまた奇特な言語だな
Perlは管理する団体がないからね。 Perlの標準ライブラリとは、ユーザが作ったモジュール。 それが利点でもあるが、メンテナが一個人だったりするわけで その人の気分で仕様が変わり、互換性が低い部分がある。
CJKV日中韓越情報処理 ケン ランディ、小松 章、逆井 克己 文字コード「超」研究 改訂第2版 深沢千尋 まだあるけどね
Windows 2000、Activeperl 5.8 の環境で、 use Socket; socket(・・・); connect(・・・); な感じでインターネット上のwebサイトからページを取得してるんだけど、 サイトの応答が遅いとき、応答が帰ってくるまでCPU負荷が100%近くになる。 これって何が原因でしょうか。 まあ、PCのスペックはWin2000を使っているというあたりで想像いただけるとは思いますがしょぼいです。 Activeperlのバージョン上げれば直るのかな…
>>83 お薦めだけでも300冊位思いついちゃってレスがまんどくさく
なっちゃったんだろうなw
103 :
デフォルトの名無しさん :2011/11/03(木) 19:34:23.06
とあるサイトで、ファイルのオープンは3つの引数を指定してオープンするのを強く推奨していました。 理由はセキュリティ的に脆いかららしいのですが・・・ いったい、どうセキュリティ的に脆いのでしょうか?
DBI で長ったらしい SQL を複数行で書きたいのですがどうすればいいですか?
my $dbh = $DBI->connect(引数);
my $sth = $dbh->prepare("SELECT なんちゃらかんちゃら ~ 超長ったらしい ~;"); # ←ここ!
$sth->execute();
$sth->finish();
$dbh->disconnect();
>>103 OS コマンドインジェクション
例えば次のような open 関数呼び出しは危険。
open($fh, $filename);
この状態だと $filename = ";halt"みたいにして外部コマンドを実行できる。
対策として、
open($fh, "<$filename");
open($fh, "<", $filename);
sysopen($fh, $filename, O_RDONLY);
みたいにすると OS コマンドを実行できなくなる。
>>102 ありがとうございます。
行ってみます。
>>104 $sql = <<"_SQL_";
SELECT foo FROM table WHERE ~
_SQL_
$sth = prepare( $sql );
107 :
103 :2011/11/03(木) 20:54:27.16
>>104 なるほど~
任意の外部コマンドが実行されてしまう可能性があるって事だったのですね・・・
わかりました、これからは3つ引数でオープンする事にします。
ありがとうございます。
ちなみに、sql文は、
my $sth = $dbh->prepare(
"SELECT なんちゃらかんちゃら ".
"FROM 超長ったらしい ".
"WHERE うんたらかんたら"
);
の、ように、俺は分割してます。
>>106 まちがった。
$sth = $dbh -> prepare( $sql );
だす。
(my $sql = <<END_SQL) =~ s/\n//g; SELECT foo FROM table WHERE ... END_SQL
110 :
104 :2011/11/03(木) 21:13:42.72
>>106 >>107-108 ありがとうございます!
確かにヒアドキュメントとか文字列の結合を使えばできますねw
Cから乗り換えたばかりなのでなかなか思いつきませんでした。
111 :
104 :2011/11/03(木) 21:14:08.56
>>94 use utf8でうまく漢字が出るようになりました!
ありがとうございました。
>>87 うわ、ありがとうございます、よくわかりました。
前スレで答えてくれた方もありがとうございました。
>>104 折り返して書く小細工で極低頻度に発症するバグで呼び出されることも
あるのでそのまま1行で書くのもまた一興。
mooseのisaってStr,Intってあるけど、両方入ってくる可能性がある場合はどうしたらいいですか?
なるほど、Str|Intのほうが分かりやすくて親切かもと思ったけど、Strがある時点でNumも許容されちゃうからダメですね。 ありがとうございました。
118 :
104 :2011/11/05(土) 16:49:36.33
>>114 ありがとうございます。
参考にさせていただきます。
正規表現で /$self->method/とやっても$selfだけ展開されちゃってて、教えてもらったのが @{[$self->method]} なんですが、これってどういう理屈で動いてるんでしょうか?
my $arrayref = [ $self->method ]; /@{$arrayref}/
121 :
119 :2011/11/07(月) 01:10:07.93
えぇぇ、、、、それはなんか微妙ですね、、、、 他に分かりやすい方法ってないんでしょうか。
>>119 なんだか変な方法で展開してるね・・・
${self->method}で十分だと思うんだけど・・・
わざわざ、$self->methodの値を配列のリファレンスにして、
それをデリファレンスしてる・・・
意味があるんだろうか・・・俺も教えてほしい
print "${\( some_func() )}"
if ($string =~ $self->method) { ... }
>>123 いや、まじめなんだけど・・・
それが配列リファレンスだったとしても、
@{$self->method}で十分だと思うし・・・
どういう事なのですか?教えてください
まず
>>122 、${hoge} と ${self->method} とでは ${ } の意味合いが違う。
前者は $hoge だが、後者は self->method の戻り値をスカラーリファレンスと見做してデリファレンスするという意味になる。
しかし self->method なんてものは元々の話に出ていないので、見当違い。
次、
>>126 。$self->method の戻り値は配列リファレンスじゃなくて単品の文字列だから、
@ で配列にデリファレンスする前に [ ] で囲って要素1つの配列リファレンスに仕立ててあげる必要があるわけ。
>>127 あぁそっか、大きな間違いをしてた
$self->methodはサブルーチンのリファレンスだったね
しかし変な評価の仕方だな~って思って見なおしたけど、
言われてみれば、この形・・・
CGIとかでHTMLをヒアドキメントで書いた時、
その中で関数を実行する時に、この形書いた事があったや・・・
勉強になりました
129 :
デフォルトの名無しさん :2011/11/08(火) 00:01:09.30
ファイルポインタを指定した行の先頭に移動させるにはどうしたらいいんですか? seekだとバイト数でしか指定できないし $count=0; while(<IN>){ $count++; if($count==$gyousuu){ last; } } これだとファイルの行数が多いほどループ回数が多くなるから重くなる だからいっきに飛びたいんです
>>129 そもそも何行目かってのは
改行コードが何回出たかを数えないと特定不能
先頭から順番に読んで改行を数えるか
ファイル丸ごとリストに読んでから添字で飛ぶかしかない
ぶっちゃけそのままの方法が最善じゃないか?
>>129 @list = <$fh>;
とかやって配列で扱う
pushとpopでぽぽぽぽーん
>>129 $countとかいう不気味なカウンタ付けてるのが気になる
行数カウントなら自前で用意しなくても $. がある
相当な素人っぽいから、そこらの本やらサイトやらperldocやらを読んでみたほうがいい
134 :
デフォルトの名無しさん :2011/11/08(火) 12:17:14.78
>>134 たったの6年でドヤ顔されても困るんだがw
>>134 俺は13年だぜ(キリッ
しかし別に13年ずっとperlじゃないから、
ぜんぜん詳しくなく普通くらいなんだぜ!
出ました『普通』!! 『普通』ってどれくらい?
>>138 print "hello world"; (ドヤ
文字列を直接スカラー変数にする方法はどのようにするのでしょうか? $array = [ "a", "b", "c" ]; $hash = { a => "1" }; $scalar = ?? #my $string = "a"; $scalar = \$string; を一度にやりたい
my $string = "a"; my $scalar = \$string; print $scalar."\n" ; my $ref = \("a") ; # ココ!! print $ref."\n" ; こういうの?
単一の文字列リテラルに対してなら括弧いらんぞ
>>143 どうしてこういうヤツは例を上げれないの?
質問スレにお前は必要なの?
こういうことかな。めったに使わない気はする。 $ref = \ "a" print $$ref; スカラーリテラルへのリファレンスなんて生成できるのか。 Perl 本体のドキュメントにそういう例は見当たらない(あったら教えて)が、 『プログラミングPerl』(Vol.1)「8.2.1 逆スラッシュ演算子」に一つだけ $constref = \186_282.42; という例がある。
perlの本とかにはねーなー でもC言語なら説明があるっしょ 文字列はアドレスを値として持つ式だ、とかの
147 :
143 :2011/11/09(水) 16:03:25.19
perlref にこんなんあるよ。 $refrefref = \\\"howdy"; print $$$$refrefref; 無名スカラーリファレンスそれのみを単独で使うシーンはあまりないが、 モジュールなどで通常の文字列と区別するための印として使うことがままある。 たとえば DBIx::Class::Row の update メソッドは、通常、 $row->update({ last_modified => '2011-11-09 00:00:00' }); のようにして使い、値は SQL 側で安全な文字列として扱えるよう自動的にクオートされるが、 $row->update({ last_modified => \'NOW()' }); のようにスカラーリファレンスを渡した時はクオートしないという仕様にすることで、 大きくコードを変えずに SQL の NOW() 関数を実行することもできるようになっている。
この本にありそうかな?
「すぐわかるオブジェクト指向Perl」 深沢千尋 2008
http://www.supee.jp/sop/contents.html 2-4 名もないスカラー~無名スカラーリファレンス
のところがそれっぽい
ただ、「スカラー変数のリファレンスはあまり役に立たない 」とズバリ書かれてる
でもその後に無名配列、無名ハッシュ、そして無名関数と続いて、
最後にはクロージャに行きつくはずだから、
無名スカラーのリファレンスは、かならず説明しなきゃーならないモンなんだろう
149 :
141 :2011/11/09(水) 16:25:07.58
おお、たくさん議論されている。 ありがとうございます。 普段使う分にはあんま意味なさそうですよね。 今回やりたいことは、モジュールの引数が文字列のリファレンスを要求される場合に一発で書きたいと思っていました。
定数を作るのに役立つと、どっかのサイトで見た記憶がある *PI = \3.14; print $PI; $PI = 3; # エラー
>>145 >>150 http://perldoc.jp/docs/perl/5.10.0/perlmod.pod#Symbol32Tables > シンボルテーブルの別の使い方は、「定数」スカラを生成するためのものです。
> *PI = \3.14159265358979;
constant プラグマやプロトタイプ宣言による定数は関数なので文字列中に埋め込みにくい。
#!/usr/bin/perl -w
use strict;
sub CONST () { 'foo' }
our $Const; *Const = \'foo';
print join ' ', 'bar', CONST, $Const, "baz\n";
print "bar ${\ CONST() } $Const baz\n";
$Const = 'quux'; # Modification of a read-only value attempted at ...
スカラ変数にblessするのをどっかで読んだがどこかは忘れた
定数なら内部フラグを操作する関数を利用する手もあるね my $PI = 3.14; Internals::SvREADONLY($PI, 1);
定数は関数にするってのはマズいのか?
ちょっと何言ってるかわかんないです。
>>155 sub HOGEHOGE() { 10; }
パ・パ・パパッパ~Perlライス
インストールされているモジュールの一覧を確認したいと思っています。 しかし下記を実行しても use lib した './local1/lib'や'./local2/lib' にインストールしているモジュールが出力されないようです。 use lib で設定したパスも検索できるようにするにはどのようにしたら良いのでしょうか? #!/usr/bin/perl use lib ( './local1/lib', './local2/lib', ); use ExtUtils::Installed; my $ei = ExtUtils::Installed->new; print for $ei->modules;
162 :
160 :2011/11/11(金) 17:14:09.51
>>161 new()の所で設定できるんですね。
解決しました。ありがとうございます。
163 :
デフォルトの名無しさん :2011/11/11(金) 21:37:08.92
my $output = `/bin/ls -ls` とやって、$outputの中身を一行ずつ処理したいのですが、どう書けばいいですか? while (<>) { 一行ずつ処理; } みたいな感じです。
>>163 my @output = `/bin/ls -ls`;
これで、配列outputの各要素に1行ずつ格納できる。
それをどう処理するかは、outputの扱い次第。
>>163 while(<>) での <> をダイアモンド演算子と呼ぶ。
普通のファイルハンドラならダイアモンド演算子の部分を
<FH>とか<$fh>などと書けばいいのであるが、
$outputというスカラで受け取ってはどう書くのが分からない……のだとする。
とすれば
>>164 の言う通り結果を配列で受け取って、
for (@output) {
#処理($_が使える、$.は使えない)
}
のように、forで配列を書いて一行ずつ処理すればいい。
>>163 my @output = `/bin/ls -ls`;
foreach my $temp ( @output ){
# $tempが配列の各要素として扱える。
}
質問者ではないんだけど、リストコンテキストだから丸飲みってことだよね。 普通のファイルハンドルみたいに一行ずつメモリに読み込めないのだろうか。
open my $fh, '-|', '/bin/ls -ls'; while (<$fh>) { print "$. : $_"; }
169 :
デフォルトの名無しさん :2011/11/11(金) 23:44:03.07
great! thank you for the quick response. you guys are awesome!
Glad to help you. I wish this was StackOverflow so that I could get a +1 or more.
171 :
デフォルトの名無しさん :2011/11/12(土) 11:49:12.12
日本語でおk
どうやればいいのかさっぱりわからん
my $val = 1 / 3; say $val; # 0.333333333333333 say $val * 3; # 1 これを1ではなく、0.999999999999999として扱いたい場合どうすればいいでしょうか
Math::BigInt Math::BigFloat
UTF8の文字列を[0-9a-z_]+のみに変換して、それを元に戻したいです。 my $word = 'フルーツ'; #UTF8 $word = unpack('H*', $word); #$wordは「d5ebfcc4」 $word = pack('H*', $word); #←では$wordが元に戻らない。 とかやってみましたがうまくいかず、そもそもやり方がわかりません。 標準関数のみで実装する方法があれば教えてください。
181 :
180 :2011/11/14(月) 15:56:56.41
今まで試行錯誤続けて、いったんUTF8フラグを外すとちゃんと動作しました。
pack "H*" とかだと[0-9a-z_]じゃなくて[0-9a-f]になっちゃうけどそれでもいいのかい
>>181 utf8フラグを外さずに処理したいなら
use Encode;
my $word = unpack('H*', encode('utf8', 'フルーツ'));
# ...
$word = decode('utf8', pack('H*', $word));
とか
184 :
180 :2011/11/14(月) 16:17:56.04
>>182-183 ありがとうございます。範囲内に収まってたらOKってことで、解決しました。
あれ、でも自分で書いたのが
>>183 さんの方法と同じ感じだ
Encode::encode('utf8',$word);でフラグ外れるものと思ってた
>>184 ああ、utf8フラグを外すっていうのを
use utf8;
を使わないって解釈しました
use utf8; use feature qw(say); my $word = 'フルーツ'; say $word; #=> 'フルーツ' (UTF8フラグ有) my $hex = unpack 'U0H*', $word; say $hex; #=> 'e38395e383abe383bce38384' my $packed1 = pack 'U0H*', $hex; say $packed1; #=> 'フルーツ' (UTF8フラグ有) my $packed2 = pack 'H*', $hex; say $packed2; #=> 'フルーツ' (UTF8フラグ無)
要素が文字列の配列が空であるかを調べたいのですが 条件に@array eq ""とやってみてもうまくいきません いい方法があれば教えて下さい
> 要素が文字列の配列が空であるか ???
すいません 空の配列(初期化した状態)かどうか判断したいということです お願いします
うんでf
空? if (@ary) { } ってことかな。 ifはスカラーコンテキストだから、要素数が返ってくる。一個も入ってないなら0だからifは偽になる。
if(hairetsu is sky) { }
配列・イン・ザ・スカイ・ウィズ・ダイアモンド演算子
すみません寝てしまいました
defineというもの自体知らなかった初心者ですのでもう一度基礎から勉強しようと思います
初期化は@array = ();とやってました
>>191 わかりやすい解説ありがとうございます
おかげでやりたいことができました
196 :
193 :2011/11/15(火) 03:25:16.03
どういたしまして
activeperlでsleepさせている最中にwindowを休止させます 次に復帰させると、休止した時点ではまだsleepの残り時間はあったのに、 いきなりsleepから抜けて処理を再開してしまいます しかも、ログインする前に 休止しても残り時間を保持させる方法はありませんか
my $hoge = { hoge => 'HOGE' }; my $fuga = { huga => 'FUGA' }; my $piyo = $fuga; print $fuga; #$fugaのリファレンスアドレス出力 上記があった場合にリファレンスのアドレスを変えずに追加するには $fuga->{
>>199 途中で書き込んでしまいました。。
リファレンスのアドレスを変えずに沢山の要素を追加したいです。
①これではアドレスが変わってしまいます。
my $hoge = { hoge => 'HOGE' };
print "$hoge\n";
$hoge = {
%$hoge,
huga => 'HUGA',
piyo => 'PIYO',
};
print "$hoge\n";
②これだとアドレスは変わりません。
my $hoge = { hoge => 'HOGE' };
print "$hoge\n";
$hoge->{fuga} = 'FUGA';
$hoge->{piyo} = 'PIYO';
print "$hoge\n";
--------------------------------
①のようにできると書くのが楽だし、1処理で済むので処理も早いのではないかと思っています。
しかしアドレスを変えずにリファレンスに追加するには②の方法しかないのでしょうか。
書くのが楽かどうかは趣味の問題だが、どうみてもハッシュをいったん ばらして作り直す方が遅そうだぞ。
「アドレスが変わってしまう」わけではない。 $hoge = {...} は「新しいハッシュリファレンスを作って$hogeに代入」であって、 元の $hoge とは全く別の物を参照してるんだから違うアドレスになって当たり前。 「$hoge の参照先のハッシュに要素を追加する」んなら %$hoge = (%$hoge, fuga => 'FUGA', piyo => 'PIYO'); とすればいい。
204 :
デフォルトの名無しさん :2011/11/17(木) 21:22:00.11
あ~んまで文字について順に処理する方法が知りたいです 例えばある文字列にあが含まれるかチェック いが含まれるかチェック うが含まれるかチェック という感じです
50個ぐらい手書きで問題ない
あからんまで手書きで問題ない 'あ'..'ん'は動かんのかね my @kana = qw /あ い う え お か き く け こ さ し す せ そ た ち つ て と な に ぬ ね の は ひ ふ へ ほ ま み む め も や ゆ よ わ を ん が/ ; my $str = "月は東に日は西に僕は友達が少ない" ; my %seen; my @dup = (grep { $seen{$_} >= 2 } grep { ++$seen{$_} > 1 } (@kana, (split //,$str))) ; print encode ("cp932", (join "",@dup)) ;
% perl -CO -Mutf8 -e 'print chr for ord "ぁ" .. 3+ord "ん"' ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんヴ??
map { chr } ord('あ') .. ord('ん')
whileはきらい
orz(あ)
一人のNewbieがGuruに問うた。 「whileにも再帰性があるのでしょうか?」 Guruは答えた。 「無」 Newbieはまた問うた。 「あらゆるものに再帰性はあるとされるのに、なぜwhileにはないのでしょうか?」 Guruはまた答えた。 「カウンタ、インクリメントなどの余分があるからだ」 Newbieは更に問うた。 「再帰性があるならなぜwhileはこの姿のままなのでしょうか?」 Guruは更に答えた。 「自他ともに再帰性があることを知りながら、無限を為すが故である」
URL はアクセスするのに使ってるわけじゃないから関係ない 何が原因でテストがこけてるかは知らんが、 そもそもなんでわざわざソースからビルドするのに 5.10.0 なんて古いもん使うの?
新しいかどうかよりも、 ちゃんとテストされた環境かどうかのほうが 重要だからだろ。
インストールできなかったらちゃんとテストされてても意味がない件について
逆に言えば、インストールできればちゃんとテストされていて意味がある。 だからインストールするんだろう?
perlをインストールしようとしてて、いつの間にかCGI::url()のテスト のエラー回避の質問になっている件
え?
つ SKIP
220 :
デフォルトの名無しさん :2011/11/19(土) 15:19:40.24
え?
>>198 以下のように時間を計測しながらsleepさせるとどうなりますかね?
my $sleep_time = 100;
my $end_time = time + $sleep_time;
sleep $end_time - time while $end_time > time;
>>212 スキップして先に進め
test(14,1,"SKIP CGI::url()"); #function.t
test(15,1,"SKIP CGI::url()"); #request.t
223 :
212 :2011/11/22(火) 13:36:21.87
>>213-217 改版が終わった安定した偶数バージョンを使いたいと思い5.10に行きつきました。
しかしよく調べると、5.10.1がありましたのでこれを使用することににました。
コメントありがとうございました。
>>219 ,221
最初SKIPというコマンドがあるのかと思って調べていましたがみあたらず、221で1の所で
判定しているんだということがわかり、SKIP方法が理解できました。
ヒント&具体的な解説まであり助かりました。
遅くなりましたが、お礼&無事インストールできたことを報告しておきます。
linuxにcpanで下記のようにHTML::Template::Proをインストールしました。
perl -MCPAN -e 'install HTML::Template::Pro'
インストールはできましたが、YAMLが無いというようなワーニングが出ました。
気になって下記を実行しましたが、以下のようなメッセージで落ちました。
perl -MCPAN -e 'install YAML'
Can't locate object method "install" via package "YAML" at -e line 1.
下記では、YAMLを読まない設定にした。とありました。
ttp://d.hatena.ne.jp/hsmnet/20110409/1302367029 YAMLを調べてみるとマニュアルあたりをさわるのに使うもののようですが、これは読まないようにして良いのでしょうか。
225 :
sage :2011/11/23(水) 22:56:05.45
Perl で DOM Traverse というか、HTML Parse というか、、、 もっというと、 ようは、 $html = &innerHTML($document, "#THE_ID"); みたいなことがやりたいんですが、 何が一番いいでしょうか。 HTML::TreeBuilder/HTML::Parserなど、CPANで いろいろ探したのですが、jQuery の便利さに慣れた身からすると、 「わざわざサーバのCGIまでつかってこの程度かよ」 というのしかないのですが、、、、。
XML::DOM
CSS Selector って言葉を知らんとみえる
確かにjQueryは便利すぎるよな。
229 :
sage :2011/11/24(木) 00:19:09.28
225です。 うーん、あまりいい解決策がないようですが、、、。 いま候補にあるのは、PHPをコマンドラインで使う、 というなにか違いすぎるやり方です。 どう考えても、それなら Perlだろ、 とおもいますが。 なにか、いい DOM/HTML Parser 教えてください!!!!!!。
単純なことならHTML::TokeParserがお手軽で好きかな
サブルーチンを配列に格納したいです。 以下のようなので、barと表示して欲しいのですが、 CODE(0x1955b18)のような表示になります。 関数を配列に格納し、実行することは可能でしょうか? @func; push(@func, sub{return "bar";}); print $func[0];
例えば my @func; push(@func, sub{return "bar";}); print &{$func[0]};
print $func[0]->(); print $func[0](); print &{$func[0]};
236 :
sage :2011/11/24(木) 15:13:34.49
225です。
>>230 は結構よさげかも、、、。
でも、さがしたら 同名(実装はまったく別)のものがPHPにもあり、
さらに、検索するとそのほうが上に来る、というトホホぶり。
いわゆる「スクレイピング」の話しなわけですが、
なにかいい解決策ありませんか? > みなさま。
scraper使う xpath使える
238 :
sage :2011/11/24(木) 16:45:25.42
225です。 Web::Scraper ・・・これはいい!!!いきなり決定打です。 作っている人も有名な人っぽいですし。 ちなみに、ほかの候補ももしあればぜひ。
そんなことよりなんで名前欄もsageにしているのか気になる
2ch初心者 && 「sageを入れる」ことは覚えている && sageをどっちに入れるか覚えていない じゃね
Web::Scraperできまりだな。
242 :
デフォルトの名無しさん :2011/11/25(金) 13:46:26.11
フォームで入力したパスワードを暗号化して元に戻すサブルーチンってありますか? 暗号化しないで入力したパスワードをそのまんまhiddenで書き込むページまで持っていくのって 好ましくないんですか?
243 :
sage :2011/11/25(金) 13:50:03.63
244 :
デフォルトの名無しさん :2011/11/25(金) 20:46:04.70
引数でアスタリスクを渡すにはどうしたらいいんでしょう? hoge.pl * とやったら $#ARGV != 0 になったようです。 (たぶん-1?) hoge.pl \* とやったら*を渡したことになりました。 しかしglobのワイルドカードの内容を指定 させたいので、いちいち\*とか利用者に 書かせるのはかっこ悪いですw
はい
オススメのIDE教えろ糞ども
V・I・M!V・I・M!
Visual Studio
イデ?
CGIに値を渡したいときの方法で質問です。
①
ttp://example.com/index.cgi/1/2/ と、$PATH_INFOで渡すのと
②
ttp://example.com/?a=1&b=2 と、.htaccessに「DirectoryIndex index.cgi」を書いてPOST風?(呼び方がわからない)で取得する方法があると思いますが、
みなさんどちらを使っていますか?
どちらを使おうか悩んでいます。
(最初、index.cgiを消して$PATH_INFOで渡せればすっきりするなと思いましたが、それだと
ttp://example.com/1/2/となって index.cgiを読ませる場所と$PATH_INFOの切り分けができないと気づいて今に至っています)
個人の好みになるかもしれませんが、こっちをこんな理由で使っているという感想などいただけたら参考にしたいと思います。
ちなみにformタグではGETを使用しています。
256 :
254 :2011/11/26(土) 22:24:28.56
>>255 CGI専用スレがあったんですね。
そちらに行ってきます。
失礼しました。
原書のプログラミングPerl 4版が12月に出た。 翻訳されるのは2年後?
Larryがこれまで篭もっていたのは日本語学習のためだとしたら、 日本語版も同時発売になるかも知れないよ。少なくともUnicode については今までより学んでいると思う。たぶん。
そいつはなんとも心強い。 自分がPerlの好きな日本人で良かった。
そして裏切られるw
久しぶりにactiveperlインストールしたら、絶対パスじゃないとファイルの読み書きが出来ない open(FILE,'>C:\perl\test.dat'); はおkだけど open(FILE,'>./test.dat'); はfalse windows7なんですが相対パスでファイルにアクセスする方法ありますか?
>>262 その場所にファイルを作る権限はあるの?
>>263 Administratorでログオンしてるので問題ないと思ってましたがperlディレクトリに読み取り専用チェック入ってました。
チェック外しても次にプロパティ開くとまたチェック入ってる…orz
perlどうこうってよりwindows7の問題でしょうか
XPの時は相対パスで使えてたんですが
しつもんです。 コマンドラインからCPANと打ち込み起動するプログラムと、 perl -MCPAN で起動するCPANモジュールのシェルって違いはなにかあるのでしょうか?
>>265 内部実装を直接呼んでるか、
ツールとして整えられたコマンドを使うかの違い。
内部的には、cpanコマンドはCPAN.pmを呼んでる。
あと最近はcpanminusがナウい
perlでは、空文字列が偽になるのはいいのですが、「"0"」も偽になるみたいで困ってます。 「"0"」は長さ1の文字列だから真になってほしいのです。 $s = "0"; print $s || "X"; # 0 が表示されてほしいのに X が表示される これってどうすればいいんでしょうか。
>>268 print ($a eq "" ? 'X' : $a);
$sが必ず文字列なら print $s ne "" ? $s : "X"; とか
undef "" 0 defined $s 偽 真 真 $s ne "" 警告 偽 真 $s 偽 偽 偽
お前ら。 Perl歴1年の俺に、 || の代わりに // を使えばいいって 教えられる気分どう?
昔のPerlで止まってしまって、 最近のモダンなPerlを知らないから、 // のことも知らないんだぜw ちゃんと勉強しろ。
>>273 へ~、知らなかった~って思って、
my $a = 2;
if ($a eq "1" // $a eq "2") {
print "1か2だな";
}else {
print "1でも2でもないな";
}
ってやったら、うまく動かないんですが釣りですかこの野郎
undef と他の偽値とを区別する話なら// でいいけど(perl >= 5.10 という注釈つきで)、 そうじゃなくて空文字列と 0 を区別する話をしてるんじゃん
// を覚えたてでうれしくて仕方ないんだろうな。 気持ちはわかる。
>>273 0とか空文字扱いたい時に||じゃ困るってことだろ。
$v = 0;
$v //= 'default';
print "$v\n";
$v ||= 'default?';
print "$v\n";
283 :
262 :2011/11/28(月) 22:58:34.33
>>276 それこそモダンなperlを知らないのでお見苦しくてすみません。
open(FILE,'>','test.dat'); #こんな感じでしょうか
ググった末に警告レベル下げてUAC無効化しても相対パスだとファイル作成できませんでした。
でもその過程でコマンドプロンプトから実行する分には相対パスでも問題ないことが発覚。
CommandLineInterpreterの問題だろうとあれこれ試した結果、perl5.12.4.exeで開けば
大丈夫であることが分かりました。
よく分からないけど相対パス使えるようになったので良しとします。
スレ汚し失礼しました。
>>267 レスありがとうございます。
気になっていたことがすっきりしました。
cpanminusは後ほど調べてみたいと思います。
ありがとうございました。
>>283 > open(FILE,'>','test.dat'); #こんな感じでしょうか
openの構文、それぞれのパラメータの意味をきちんと調べたのか?
286 :
262 :2011/11/29(火) 13:49:43.06
>>285 open(ハンドル,ファイル); と認識してます。
>>286 それじゃ引数は2個だろうが。
なんか…根本的に向いてないね。
知識ではなく、物の考え方がね。
288 :
262 :2011/11/29(火) 14:48:19.01
3つ目の引数が何を指定するものか、さらっと検索した限りでは分かりませんでした。 指定することがパスの指定方法に影響するのでしょうか? win機で簡単なスクリプト組む分には古い知識と今の考え方で 不都合ないので失礼します。
いやそんなの検索しなくてもマニュアルに書いてあるぞ…
290 :
デフォルトの名無しさん :2011/11/29(火) 15:41:57.57
ほんと向いてないね。
>>283 で本人が終了させてんのに粘着する方もどうなんよ
292 :
デフォルトの名無しさん :2011/11/29(火) 15:46:55.86
293 :
262 :2011/11/29(火) 16:14:34.70
>>289 なんか荒れてるけどその話付き合った方がいい?
294 :
デフォルトの名無しさん :2011/11/29(火) 16:59:10.40
本人キタ━(゚∀゚)━www
CPANモジュールガイドは良本
左の白いのまじおもしろくねー ヘラヘラしてそう ウケ狙ってる感ばりばり Macつかっちゃって 目立ちたがり屋かな このしのびの服装したやつは まともだね マジっぽさが よくわかってる日本を
この前身タイツのアホは「これで真珠だ!」とか思ってねーだろな?
CPANモジュールガイドは駄本
駱駝本?
>>301 あれ?まじで?
俺はいままでモジュールってほとんど使った事なかったけど、
この本見て、こんな便利なモジュールいっぱいあるのかーって関心したけど・・・
でも、便利なモジュール使いまくると、
もうPerlじゃないね、違う言語になる
関心→感心
>>303 同意ですです。
まあ、その人の習熟度に依るんだろうけど。
正規表現の中に@を使ったらうまくいかなくて\@にしたら動いたけど、 @って何の意味だっけ?
配列
Perlは言語というよりCPANにアクセスするためのツールだと思ってる。
>>306 変数として展開されてしまうからな。
メアドの正規表現ならEmail::Valid使った方がいいかも。
$が展開されるのは判るけど、@なんか展開したって添え字の数になるだけだろうに
えっ?
>>308 俺は多機能テキストフィルタとして使うかな
>>311 まだ1/3くらい
実際に試しながら読んでるし・・・
何?後半で恐ろしい雑な説明になってるとか、
突然フォントのサイズが巨大になって内容が薄くなってるとか?
でも実際、教科書類の余白性は重要だ
文字列が全て全角カタカナだったらヒットさせる場合は下記でできたのですが、 $word =~ /^(?:\xE3\x82[\xA1-\xBF]|\xE3\x83[\x80-\xB6])+$/; それプラス、「ー」にもヒットさせたいと考えていますが、下記ではうまくいきません。 どのようにしたら良いでしょうか。 $word =~ /^(?:\xE3\x82[\xA1-\xBF]|\xE3\x83[\x80-\xB6\xBC])+$/;
(A|B|C)
318 :
316 :2011/12/02(金) 14:26:41.44
すみません。 文字コードはutf8です。
てst
(A|B) (A|B|C) タイ━━━━||Φ|(|´|Д|`|)|Φ||━━━━ホ!!!
321 :
日系アメリカ人 ◆japYJPNx6A :2011/12/02(金) 17:14:12.94
ゲーム開発者>>>>Perlエンジニア すべてにおいてカス 音楽+絵+プログラミング+ネットワーク 束ねるゲーム開発者は最強(日本を除く)
>>321 F1レーサー>>>>車の整備士
と、言われてるくらい違和感ある
比べる物が違うだろ・・・
どうせ釣り針垂らすなら・・・
Rubyエンジニア(モダン)>>>>Perlエンジニア(老害)
これくらい大きくないと
Rubyそのものは別に悪いとは思わんが、 Ruby厨が大抵目つきが逝ってるのは何故だろう?
325 :
316 :2011/12/02(金) 17:53:00.83
>>317 ,320
解決しました。
ありがとうございました。
326 :
日系アメリカ人 ◆japYJPNx6A :2011/12/02(金) 21:03:43.76
Matzって朝鮮とか韓国人みたいな顔してるよな アジア顔だな エキゾチック 平面七三分け
痛々しいコテハンと、輪をかけて痛々しい中途半端さな鳥。 でもその鳥のおかげであぼーん設定が楽でよろしい。GJ!!
329 :
デフォルトの名無しさん :2011/12/03(土) 19:41:17.57
jap YahooJPN
>>328 そういうのについていちいち言及するのをやめるか、せめて対象にアンカー付けてくんない?
NGに一度指定したものは二度と意識しなくて済むようにって連鎖透明あぼーん設定してんだから。
331 :
日系アメリカ人 ◆japuuq4c3Y :2011/12/03(土) 21:46:16.68
物凄い悔しいご反応ですね
クソワラタw
ごめん誤爆
perl で2ちゃんに書き込むプログラムソースなんかは割りと見かけるけど p2 通して書き込むプログラムってのは無いの?
336 :
日系アメリカ人 ◆japYJPNx6A :2011/12/04(日) 10:44:10.25
自分で作れよカス 俺の身内はLarryWallだぞ
在日うぜーよw
338 :
日系アメリカ人 ◆japYJPNx6A :2011/12/04(日) 11:05:32.76
hibari.2ch.net/test/read.cgi/gamedev/1322167021/ ここきて こいつらがウザい
なんだかんだ言っても文字列の処理はPerlが一番楽だったんだけど use utf8すると途端に面倒臭くなる…。 ほんとにみんな使ってるの?
久しぶりだな皆。 トリップの流出で、偽者が暴れまわってるみたいだが気にしないでくれ。 そうだ、めでたい話があるんだが、俺は今年の夏ごろ、livedoorに入社してな。 WEBの企画に携わってて来れなかった。 本名は伏せておくけど、Perlのことなら聞いてくれ。 ある程度実力ついたんで答えられると思うけど。
2週間ごとに1回、出社する程度だよ。 自宅で仕事。
use utf8は仕方なく使ってるなあ。他にいい方法がないもんで。
またPerl忍者の偽者か? バカだからlivedoorなんて入社できるわけないだろ。
もし本当に入社してたなら、お前こんなトコで明かしたら首切られるぞw
utf8は使いにくいんで使っていない。
やっぱりそうだよなぁ。 モダンPerlはuse utf8が必須とか書いてたからびびったわw 元からこんな面倒臭い言語だったなら絶対すぐ投げ捨ててるし。
マルチバイト文字のことがよく分からないまま、思いつきで 実装してしまったのです。まさかこんなに使いづらいものに なるとは予想できなかったのです。
Perlのマルチバイト文字処理はまあまあうまく折り合いつけてる方だと思うよ。 もともとマルチバイト文字列自体が厄介な性質を持つ代物なんだからある程度は仕方ない。 思いつきだったらPHPの方がよっぽど全般にわたって思いつきの実装だらけだし。 まあ次元の違うものを比べてもなんだけど。
349 :
335 :2011/12/05(月) 05:01:03.99
perl 初心者が適当にやってみたけど、できない
・・・
my $ua = LWP::UserAgent->new(
agent => "Monazilla/1.00 hoshu-bot.pl/$VERSION",
cookie_jar => {},
);
sub sjis { encode('cp932', $_[0]) }
my $name = '';
my $mail = 'sage';
my $message = 'test';
my $res = $ua->post("
http://$host/test/bbs.cgi ",
[ bbs => $board_key, key => $thread_key,
FROM => sjis($name), mail => sjis($mail), MESSAGE => sjis($message),
submit => sjis('書き込む'), time => 1, hana => 'mogera' ],
Referer => "
http://$host/$board_key/ ");
・・・
この部分をどう変えたらいいんだろう
風も拗らせたししんどい
文字コードが何でこんなめんどくさいんですか? あほくさいですね よく使えますね タイムイーター言語ですよPerlは
元々向いてないこと無理やりさせてるんだから我慢しろって誰かが言ってた
ヒゲだろどうせ
use Sample; Sample->new('$file_name'); 上記のようなモジュールを作っています。 これを引数も入れてクラス継承?(下記)で書くにはどのようにすればよいのでしょうか? use base qw/Sample/; 私が知っている知識だけで書くと、Sampleモジュールにsetサブルーチンを書いて セットする方法くらいしか思いつきませんが、ダサすぎます。 ちゃんと引数を渡せる書き方があるのではないかと思っているのですが。 use base qw/Sample/; $sample = set('$file_name'); #1アクション増えてダサい
つまりコンストラクタのオーバーロードしたいの? それともそれとは別?
>>351 文字コードがめんどくさくない言語処理系があるの?
あるなら教えて。後学のために是非。
そういえばjperlでShift JISのみを扱っていた時代は考えることが少なくて多少はラクだったかな。
でもいまどき文字コード変換は避けて通れないからねえ。Shift JIS決め打ちでは済まないわな。
357 :
日系アメリカ人 ◆japYJPNx6A :2011/12/05(月) 12:08:54.60
じゃっぷは文字コードもハンディ 英語もハンディ かわいそうだね
358 :
354 :2011/12/05(月) 13:38:56.98
>>355 それで合っています。
よろしくお願いします。
正規表現に関して質問です。 量指定子を付けるのに、対象を()で囲んでいるのですが、 $1に入れたり戻り値に含めたくない場合はどうすればいいのでしょう? sにgオプションを付けて置換した対象のリストを得たいのです。 置換後の文字列に元の文字列がそのまま含まれているので、g外してwhileに入れると無限ループになります。
360 :
354 :2011/12/05(月) 17:50:29.25
>>355 ,358
調べていたらどうも違うようです。
一度取り消して再度質問しなおします。
361 :
354 :2011/12/05(月) 18:03:55.55
######################################### #[1]色々なプログラムで使いまわせるものとして管理 package HOGE; sub new{ my $class = shift; my $path_home = [ split '/',$ENV{HOME} ]; #[A] my $hash= { path_home => $path_home, }; bless $hash,$class; } sub path_home{ my $class = shift; return( $class->{path_home} ); #[B] } 続きます↓
362 :
354 :2011/12/05(月) 18:05:09.09
######################################### #[2]用途別に使えるものとして管理 package HOGE::FUGA; use base qw( HOGE ); sub new{ my $class = shift; $path_temp = '../../tmp/'; my $hash= { path_temp => $path_temp, }; bless $hash,$class; } sub path_temp{ my $class = shift; return( $class->{path_temp} ); } 続きます↓
363 :
354 :2011/12/05(月) 18:06:39.57
上の続き↓ ######################################### #[3] use HOGE::FUGA; my $hogefuga = HOGE::FUGA->new(); printf "HOME : %s\n", $hogefuga->path_home(); ######################################### 上記のように「値やサブルーチン」を共通で使い回しできるモジュール[1]と、 部分的に使えるモジュール[2]を作成&管理し、それぞれのハッシュリファレンスを [3]で使いたいのですが、その場合のスマートな実装方法はどのようなものが ありますでしょうか? ※これはサンプルですので、直接[A]を[B]に入れたらいいというのは無しでお願いします。 ※この方法は素人の思いつきなので、他にスマートな方法があればそれを教えてください。 ここまで
>>350 うん。
Webアプリとか書いてる人ならともかく
俺はシェルスクリプト的な使い方しかしてないし
システムの文字コードで書いておけば十分事足りる。
use utf8すればダメ文字の入ったファイルパスも直接指定できるのかと思ったら
ダメなままだし,俺にとっては利用価値を見いだせなかった。
利用価値を見出したから Perl使ったんじゃないのか?w シェルスクリプトで全部やればいいと思うんだが。
>>365 既存のプログラムを順番に実行する+αくらいならともかく、
それ以上のことをするならPerlで書くかなあ。
1レスで理解できるutf8フラグ utf8フラグとい名前がまずかったね。 文字列フラグなどという名前だったらよかった。 文字列フラグはPerl固有のものだから Perlコード外部から渡されるのは文字列ではない。 文字列でなかったらなにか?それはバイナリ。 バイナリを文字として扱いたければ、文字に変換しないといけない。 それがdecode。 ではソースコードに書いてあるのは、文字かバイナリか。 それはuse utf8を使えば文字で、そうでない場合はバイナリ。 話はこれだけ。
文字列フラグというければ、どうして文字列なのにフラグが立つ ときと立たないときとがあるの?フラグが立っているかどうかと 文字列なのかどうかは一致しないと思うければ。
>>364 ダメ文字と言っているからActivePerlの事だと思うけど
それはPerlの問題じゃなくてAPIの呼び出しにA系を使っているのが原因
W系を使って呼び出せば問題ない
>>368 あなたの文字列の定義とは?
人間が文字と思っているから文字なんだ。ではだめ。
そんな曖昧な定義はコンピュータは理解出来ない。
んなこたあない。
こまけぇこたぁいいんだよ!!
質問しておいて回答を制限するという..ナイスw
>>365 Perlの利用価値はずっと前から見いだしてるから使ってるけど
use utf8の利用価値は見いだせなかったということねw
>>369 うんうん。
use utf8はAPIもW系に切り替えてくれる万能薬なのかと想像してたら
全然違ったという;;
W系を呼び出せば問題ないってのは呼び出す方法があるの?
ダメ文字入ったファイル名の件はすっかり諦めてて
普段はワイルドカードで切り抜けてるけど
W系を呼び出す方法があるなら知りたい!
W系 A系ってなに?
ワロス系とアフォ系の略です
俺もActivePerlのutf8プラグマはcp932とUTF-8間の融通をきかせてくれるものと 当然のように思ってたら何もなかったのでブチキレた 二度とuse utf8は使わないと心に誓った
つまりuse utf8がどういう効果があるか 知らないわけね。 ドキュメントちゃんと読んだ?
読んでないからわからないんだろw 読んでいたらuse utf8を何もかも解決してくれる 万能なおまじないだとか勘違いするわけがない。
>>374 >>377 use utf8がどんな機能を持っているのか
ドキュメント読んで、ここに書いてみ。
単純にお前らが、ドキュメント読んでないだけってのが
よくわかるからさ。
381 :
日系アメリカ人 ◆japYJPNx6A :2011/12/05(月) 23:43:36.07
なんか凄い文字コード覚えた手のバカが必死だね なんだろうこの感じ アホくさい知ったか君 ばかばかしいね見てて 自分もPerlやってるけど ここまで354さんの質問無視して エンコード語りしてるやつ気持ち悪いね 覚えた手かな
382 :
日系アメリカ人 ◆japYJPNx6A :2011/12/05(月) 23:44:20.72
ここは 君の うんちく 話す場所じゃないから 帰れ
男ってどうして無駄に自分が上だと張り合うのかね
全角w
>>379 まぁ人それぞれだと思うけど,俺はとりあえず先に手を動かしてみるたちなんで。
だいたいのものは予想してた通りに動いてくれるし
あれ想像してたのと違うぞ?となったらそこで詳しく調べればいい。
「Unicodeで書くことを宣言してるんだから当然APIもUnicode版を呼び出してくれるんだろう…」
と事前に予想するのはごく自然なことだと思うけどなぁ。
>>380 面倒臭そうな奴だなぁ。
キミはこんなとこで粋がることに何かしらの価値を見いだしてるのかw
386 :
日系アメリカ人 ◆japYJPNx6A :2011/12/06(火) 00:04:38.65
君は テストステロン って知ってるかね? >>筋力トレーニングや不安定な興奮(例えば闘争や浮気など)によってテストステロンの分泌が促される。 男はテストステロンの量が多いんだよ ね? だったらわかるでしょ? 男は 勝ち負けこだわる それが本来人間の男の姿 君はもやしだから わからないだろうけど
387 :
日系アメリカ人 ◆japYJPNx6A :2011/12/06(火) 00:06:35.37
様々な神経伝達物質とホルモンが攻撃行動と相関することが示されている。もっともよく言及されるのがテストステロンである。ある研究はテストステロン濃度と攻撃的な反応が明確に関連していると指摘した。
388 :
デフォルトの名無しさん :2011/12/06(火) 00:12:43.09
>>385 ☓自然
◯願望
~できるって勝手に(先に手を動かすw)思い込んどいて、自然だと思うけどなぁだってさw
>>385 > 「Unicodeで書くことを宣言してるんだから当然APIもUnicode版を呼び出してくれるんだろう…」
> と事前に予想するのはごく自然なことだと思うけどなぁ。
で予想が外れてマニュアルも見ずに
ワーワー騒いでいるわけ?
いいからマニュアル読んでこい。
> 「Unicodeで書くことを宣言してるんだから そんな宣言をお前はしてない。 お前が宣言したのは、ソースコードのリテラル文字列に UTF8フラグを立てると宣言しただけだ。 初心者脱出したと思ってる初心者にありがちだ。 マニュアルを読まずにかってに思い込む奴。 馬鹿だお前は。
391 :
日系アメリカ人 ◆japYJPNx6A :2011/12/06(火) 00:24:49.64
W系 A系ってなに? 教えてください もやっとしてます
392 :
日系アメリカ人 ◆japYJPNx6A :2011/12/06(火) 00:25:25.67
後10分後に寝るので教えてください どうか 教えて ください W系 A系 夜が眠れません
がんばれクソコテ
自問自答乙
>>370 かなが50字だとすると、俳句は五、七、五で文字の並びは 50**(5+7+5) の
組合せがある。これはちゃんと上限があって、(数学的に)数え上げることが
できる。ただし、かなりの割合で意味をもたない文字の並びになっている。
意味をもつ並びは少ないと予想できる。
それでは、一体、いくつの並びが意味をもつと言えるのか?
デジタルデータは全て、広義のバイナリデータだといえる。その中にはテキス
トデータを意図するものを含んでいるだろうし、あるいは意図はせずともテキ
ストデータのように見えるものがあるかもしれない。
広義のバイナリデータのうち、テキストデータを含めないものを狭義のバイナリ
データとすると、狭義のバイナリデータとテキストデータの違いは何なのだろ
うか?
その違いは数学的に定義できるのだろうか?おそらくできないと思う。
で、お前にとっての文字列の定義は? 質問の答えはまだかい?
人間が文字と思っているから文字なんだ。 つまり、コンピュータは(その定義を)理解出来ない。
>>388 何がキミの琴線に触れたのか知らんがとりあえずもちつけ。
>>389 最初に予想が外れてることに気づいた時点で目を通したよ。
そしてがっかりしたわけだ。
>>390 コードの中のすべてのリテラル文字にフラグを立てるなら
それはコードそのものがutf8で書かれているのと同義と見ていいだろう。
実際utf8でコードを書くときしかuse utf8は推奨されてないのだから。
(ASCII文字だけが並んだリテラルにはフラグ立ちませんからw みたいなツッコミはやめてね。)
>>391 WindowsのAPIの話だよ。
同じAPIでも末尾がAのとWのとあるでしょ。
つまり俺が言いたいのは use utf8; 以前に -T と -B はうそっぱちだ ということだ。
やーい、やーい、うそっぱち、うそっぱちぃ~
>>359 (?: )ってことかな?
それと、やりたいことって、文字列の削りだしなんかな。
>>354 の質問がよくわからん、、、、
両方のハッシュリファレンスを得たいって、path_homeとpath_tmpを別個に呼び出せばいいのではとも思うし、でもそれは望んでる答えではないだろうし、
前の質問の、引数を渡したいって動機もよくわからない。
package Sample2;
use base Sample;
Sample2->new("$file_name")
っというのだとダメ?
>>374 完全じゃないけど Win32::Unicode とか
俺は WIN32::API を使って自分で書いているけど
>>401 記号を検索する方法が分からないのですが、条件演算子としての三項演算子です?
削り出しと置換を同時に行えないかなと思いまして。
その対象の中に、()付きの量指定子が含まれるのです。
s/((文字列)量指定子 文字列)/文字列$1文字列/g;こんな感じの時に、外側の()でマッチした一覧だけを取り出したい場合はどうすればいいのでしょう。
>>361-363 親クラスのプロパティは以下で取ってこられるけど、なんか変な感じ?
my $hash= {
%{$class->SUPER::new},
path_temp => $path_temp,
};
>>354 の引数を渡したいというのはこういうことでしょうか?
package HOGE;
sub new{
my $class = shift;
my $path_home = [ split '/',$ENV{HOME} ]; #[A]
my $hash= {
path_home => $path_home,
@_,
};
bless $hash,$class;
}
package HOGE::FUGA;
use base qw( HOGE );
sub new{
my $class = shift;
$path_temp = '../../tmp/';
my $hash= {
path_temp => $path_temp,
};
$class->SUPER::new(%$hash);
}
406 :
354 :2011/12/06(火) 14:28:58.62
>>354 です。
別の問題が出てきました。
下記を実行すると①の箇所で以下のようなエラーが出ました。
Unknown encoding 'HOGE::FUGA=HASH(0x92ffb50)' at xxx.pm line ***
use base qw( Encode );をしているのでメインまでencodeが継承されるという認識なのですが、
認識間違いなのでしょうか?
HOGEパッケージのuse base qw( Encode );をメインで使うにはどのようにすればよいのでしょうか?
########################################
#メイン
use HOGE::FUGA;
my $hogehuga = HOGE::FUGA->new();
my $nihongo_utf8 = $hogefuga->encode('utf8','あああ'); #①
########################################
package HOGE;
use base qw( Encode );
sub new{
my ( $object, @args ) = @_;
my $hash ={hoge => 'HOGEHOGE'};
bless $hash,$object;
}
########################################
package HOGE::FUGA;
use base qw( HOGE );
sub new{
my ( $object, @args ) = @_;
my $class = $object->SUPER::new( @args );
$class->{fuga} = 'FUGAFUGA';
return($class);
}
409 :
デフォルトの名無しさん :2011/12/06(火) 15:39:36.14
Perl初心者です。マイナスの値をpack関数にてビックエンディアンに変換してから、unpack関数にて再度変換すると符号無しで変換されます。これは仕様でしょうか?
>>410 ,411
そんなのあったっけと思ったら5.9.2からか。
perl勉強したのだいぶ前だからなぁ。たまにはリフレッシュしないと
だめだな。
>>410 、411
レスありがとうございます。確認してみます。
あれ、そもそも置換すると、複数キャプチャできないのですか? my @cap = $txt =~ s/(~)/~/g; で、置換回数しか受け取れないみたいです。 置換無しならうまくいくのですが。
何がやりたいのかさっぱりわからん……
置換もしながらキャプチャもしたいという欲張りさんなのかな。 e使って適当に保存するコード書けばいいんじゃね? s/(~)/push @cap, $1; ~/ge
420 :
407 :2011/12/06(火) 22:50:06.45
>>416 複数改行でのマッチ?とエスパーしてみた。
$txt =~ s/\A(~)\z/~/xmsg;
誰か
>>407 わかる方いませんか?
>>407 Encode::encode はオブジェクトのメソッドとして呼び出すようにできてないから。
>>404 (?: hoge)はグループ化するだけで、後方参照用に記憶させない
>>419 その通りです、ありがとうございます。
perlreではやり方が見あたらなかったので助かりました。
>>407 $hogefuga->encode('utf8','あああ')は、実際はencode($hogefuga,'utf8','あああ')のように
第1引数にオブジェクトを入れて呼ばれます。
>>421 が言うように、encodeは第1引数に文字コードを想定しているので、そこにオブジェクトが
来ると
>>407 のようなエラーになります。
以下のようにすれば望みの結果になるかもしれませんが、このような使い方を私は見たことはないです。
my $nihongo_utf8 = $hogefuga->can("encode")->('utf8','あああ'); #①
Encodeを継承する一般的な方法(Encodeを継承していいのかも含めて)を知りませんが、以下のように
encode/decodeのラッパー関数を作って、①と同じことをすれば望みの機能が達成できるかもしれません。
package HOGE;
use base qw( Encode );
sub new{
my ( $object, @args ) = @_;
my $hash ={hoge => 'HOGEHOGE'};
bless $hash,$object;
}
for my $func ( qw(encode decode) ) {
no strict "refs";
*$func = sub { goto shift->can("SUPER::$func") };
}
425 :
デフォルトの名無しさん :2011/12/08(木) 04:12:23.33
0001001100 0010000001 0000000000 0000000001001 という行単位の出力があるのですが、ここから 0001001100 ====> 4,7,8 0010000001 ====> 3,10 0000000000 ====> 0 0000000001001 => 10,13 というように1のある位置を出力させたいのですが、ワンライナーでできるでしょうか? 1が無い場合は0を出力します。 4,7,8 3,10 0 10,13 こんな感じでもとの行はなくてかまいません。1が1個だけだとIndexでできるんですが、 複数になるとどうすればいいですか
$ perl -lpe 'my@a;push@a,pos while/1/g;$_=join(",",@a)||0' とか
427 :
デフォルトの名無しさん :2011/12/08(木) 06:03:09.60
Net::Google::Calendarを使って
ttp://shokai.org/blog/archives/1280にある googleカレンダーの予定を取得するプログラムを実行したいのですが
実行しても
403 Forbidden at /usr/local/share/perl/5.10.1/Net/Google/Calendar.pm line 619.
エラーが出て予定を取得できません.パケットが流れているのでうまくSSL通信できていないのだろうと思うのですが
原因としてどういったものが考えられるでしょうか?
試してないけど、loginではなくauthかoauthで認証しないとダメなんじゃないかな 取ってくるだけなら限定公開URLを使えばloginせずに取れる
429 :
407 :2011/12/08(木) 15:43:33.52
>>421 ,424
やっと理由が分かりました。
$hogefuga->encode()で呼び出すということは、第一要素にオブジェクトが入りますね。
encode()で呼ぶ場合はそれが無い。
スコーンと忘れてました。
たまに自分で作ったパッケージでも同じとこで間違えることがあります。
詳しい説明のおかげで理解することができました。
遅くなりましたが、お礼を申し上げます。
ありがとうございました。
~色々略~ $dat = kakou($dat, $in); sub kakou{ my $dat = shift; my $in = shift; ~$inを使って$datを加工する。$inが空なら何もしない~ return $dat; } $datが巨大な場合、$inが空かどうかの判定は&kakouを呼ぶ前に毎回行った方が良いのでしょうか? こういった場合はどういう書き方が最適なのでしょう?
>>430 >&kakouを呼ぶ前に毎回行った方が良い
そりゃ、サブプロ行く前に判断した方が早い。
他にはリファレンスを渡す。
>>431 ありがとうございます。
Perl側で何か上手くやってくれてるのならこの書き方でも問題ないかと思ったんですが、毎回まじめにメモリ確保して代入処理してくれてるってことでしょうか?
ところで、リファレンス渡しの場合は、明示的にリファレンスを渡すのと、$_[0]を直接編集するのではどちらの書き方が一般的なんでしょうか?
@_ の要素は実引数のコピーではなくエイリアスだから、文字列渡しでも my $dat = shift; とかするまではコピーは発生しないよ。
つっても
>>430 じゃサブルーチンの戻り値がその文字列だから結局コピーは不可避だけど。
処理するしないにかかわらずコピーを避けるなら、
kakou(\$dat, $in);
sub kakou {
my($dat_ref, $in) = @_;
return unless $in;
# $$dat_ref に直接ほげほげする
}
434 :
デフォルトの名無しさん :2011/12/08(木) 21:17:51.75
「Perlで有名な小飼弾に暴言を吐いたキチガイw OSSコミュニティから物凄いパッシングw」
http://blog.livedoor.jp/dankogai/archives/51733482.html 北畠徹也氏が代表の「テラ・インターナショナル」がPerlを勝手に商標登録
>>この北畠って人は、ツイッターとかでも自殺するって言って話題になったり
よく分からないNPOか何かに募金をしてくれってメールを数万人規模のMLに流したり
それらは実はチョットした技術的ミスだって釈明してたりする人らしいね
Tetsuya_K 北畠徹也
@dankogai の家に電話したら、「小飼弾は死にました」らしい。ざまみろ。ざまみろ。というか、死んだ方が社会にとって幸せ。以上。# どうでもいいが、jcode.plなんて簡単につくれるじゃろ。あんなので調子に乗るアホもどうかしてるぜ。
Tetsuya_K 北畠徹也
I compared my @klout with @dankogai, how does your @klout compare? klout.com/user/dankogai/… @Tetsuya_K に比べたら全く大したことねーな。大口叩く愚か者が。
コメントの一覧
「みんなおもしろいおもしろいいってるけど北畠さん完全にかわいそうな精神病の患者ですよね」
「コメント欄が病的で怖い。人格が分裂してる?」
「本当に何がしたかったんだろう・・・」
「無事取り消されたそうで。本当によかった。」
その人が頭おかしいのは前からわかってるのでもう名前も見たくないです
Perlのバージョンは 5.14 subversion 2 OS WinXP Pro sp3 全くの初心者で、本の見ながらサンプルを打ち込んで確認しているんですけど、はてな?で教えて下さい。 ↓ $n ='9'; if ($n =~ /^[[:alpha:]]/) { print "$n はアルファベットです\n"; } elsif ($n = ~ /^[[:digit:]]/) { print "$nは数値です\n"; } else { print "$n はアルファベットでも数値でもありません\n"; } ↑ で コマンドプロンプトで perl test.pl ってやると 9は数値です って表示されるはずが、 4294967295は数値です とかって表示されてしまいます。 なんで????
↓これが答えだ!
= ~ 離すな危険
'=' と'~'はくっついていないと駄目なんすか!?
へぇぇ、、、びっくりです。
>>438 ありがとうございます。
440 :
437 :2011/12/08(木) 23:13:22.62
どういたしまして
>>439 逆に 何故離れていてもいいと思ったのか知りたい
>>433 ありがとうございます。
kakou($dat, $in);
sub kakou {
my $in = $_[1];
return unless $in;
# $_[0] に直接ほげほげするか、my $dat_ref = \$_[0];するか
}
この方法でもコピーを避けれるかと思うのですが、
呼び出し側で\付けてリファレンスを渡してやる方が一般的なんでしょうか?
$stringという値があります。 これをuse Data::Dumperで出力すると下記のようになります。 $VAR1 = [ "\x{e3}\x{81}\x{8c}" ]; しかしfrom_to($string, 'utf8', 'utf8') をDumperの手前に入れると下記のようになります。 $VAR1 = [ 'が' ]; 気づいた点は""(展開する)から''(展開しない文字列)に変わっています。 後者の状態にしたいのですが、from_toで「行って来い」だと効率が悪すぎると思うのですが、 何か方法はありますでしょうか? $string = eval($string)ではうまくできませんでした。 use utf8;は入れています。
> $stringという値があります。 この値をどっからどうやって取ってきたかが問題なんじゃないの?
>>442 それでも同じではあるけど、っていうか
>>443 見て Encode::from_to はまさにそういう呼び出しの例だと思い出したけど、
そういうある程度一般的な関数の場合を除けば普通は呼び出し元で \$dat としておいたほうが「$dat の中身だけを直接変更する」という意図が一目瞭然だと思う。
>>443 from_to でいいと思うよ。それか decode('utf-8', $string) で utf8 フラグ付きの 'が' が得られる(decode_utf8($string) ではダメ)。
ただし、"\x{e3}\x{81}\x{8c}" ってのがそもそも普通の状態じゃない(大抵はコーディングミスかモジュールのバグ)ので、
意図してそういう状態にしてるんじゃなければ、まずその原因を探して取り除いたほうがいい。
(具体的には utf8 フラグなしの 'が' を utf8::upgrade すると "\x{e3}\x{81}\x{8c}" になるのだが、普通そんなことはするべきではない。)
446 :
442 :2011/12/09(金) 13:18:22.96
>>445 仰るとおりだと思います。参考になりました。
ありがとうございます。
掲示板のコメントだけをテキストファイルなどに出力するプログラムってperlが向いてると思うんだけどどう書いたら良いですか? 簡単らしいんですが初心者なんで解りませんorz よろしくお願いします。
>>447 掲示板へアクセスしてログを取得
↓
ログの中から必要なコメントだけを抜き出し
↓
ファイルへ出力
↓
出力したファイルを見る事なく数年過ぎる
↓
「なんだこれ?あぁこんなの作ったっけイラネ」
↓
結果:無駄
>>447 どう、っつーても掲示板次第だと思うぞ
ブラウザ右クリしてソースの表示して法則をみつけるよろし
>>441 $_ を対象として /^[[:digit:]]/ をマッチさせた結果の
1の補数を $n に代入するだなんて、これっぽっちも思い
つかなかったんで。
>>441 くっつけて書けって本には書いてなかったもんで
まあ、ゆとりは大事だからねぇw
=と~ って考えるか =~ で1つと考えるかだろうねー。
= は代入演算子 ~ はビット否定演算子 =~ はパターン結合演算子 これらが書かれていない本は捨てて、新しい本を 買ってこい。この先何があるか分かったもんじゃ ないぞ。
>>451 え?まさか「= ~ と書いてもいい」とか載ってないよね??
初期のC言語にもこの類の問題があったな。C=+3とか。
457 :
デフォルトの名無しさん :2011/12/10(土) 21:50:09.75
初めまして。cygwinでperlを動かそう思っています。 perl-e 'print "hello!\n";'は上手くいくのですが、hello.plというファイルを作った時は では上手くいきません、良ければご教授下さい
hello.plの中身をなぜ書かないのか気になる
459 :
デフォルトの名無しさん :2011/12/10(土) 21:58:29.15
すいません #!/cygwin/bin/perl print "Hello, World"; とかいろいろサイトみて試してみたんですが、よくわからなくて
> perl hello.pl
461 :
デフォルトの名無しさん :2011/12/10(土) 22:08:58.63
perl hello.pl と打ち込むと Can't open perl script "hello.pl": No such file or directory と出ます。
>>455 まあ、
a=b+1;
でも
a = b + 1 ;
でも通るから、スペースは無視されるとでも思ったんじゃね?
《エスパーモード》 ファイル hello.pl がカレントディレクトリにない。 (たぶんデスクトップ上にある)
464 :
デフォルトの名無しさん :2011/12/10(土) 22:21:40.65
>(たぶんデスクトップ上にある) そうです!ありがとうございます cygwin\binに移しました。 -bash: perl: command not found とでました・・・
which perl
「カレントディレクトリ」と「カレントディレクトリの変更」を 調べてもう一度戻ってきてください。
あるいはフルパスで指定するとか
もう、すれ違いじゃない?
すでにCygwinについての質問になってるな。 cygwin上で動かすんだったらshebangは #!/cygwin/bin/perl じゃなくて #!/usr/bin/perl だろう。 cygwinを普通にインストールしてたら、 cygwin上から /cygwin にアクセスしようとしてもできない筈だぞ。
proveコマンドでテストを実行できるのはべんりなのですが、 テストが失敗した場合、どのテストが失敗したかを知るにはどうしたらいいですか。 試してみたところ、何番目のテストが失敗したかが表示されるだけで、すごくわかりづらいです。 Test Summary Report ------------------- t/foo.t (Wstat: 0 Tests: 17 Failed: 1) Failed test: 17 Files=1, Tests=17, 0 wallclock secs ( 0.04 usr 0.01 sys + 0.06 cusr 0.02 csys = 0.13 CPU) Result: FAIL テスト番号ではなく、ファイル名と行番号が表示されるようにしたいのですが、どうしたらいいでしょうか。 よろしくお願いします。
>>470 すみません、勘違いでした。
Test::Moreだと行番号がきちんと表示されるのですが、自作のツールだと表示されないようです。
もうちょっと調べてみます。
再度質問です。同じ出力をするスクリプトなのに、proveコマンドの挙動が違うのはなぜかについて。 use strict; use warnings; use Test::More tests=>1; is 1+1, 3; というファイルをperlで実行すると、次のようになります。 $ perl foo.t 1..1 not ok 1 # Failed test at foo.t line 4. # got: '2' # expected: '3' # Looks like you failed 1 test of 1. 続く
続き これをproveコマンドで実行すると、失敗したテストの行番号が表示されます。 $ prove foo.t foo.t .. 1/1 # Failed test at foo.t line 4. # got: '2' # expected: '3' # Looks like you failed 1 test of 1. foo.t .. Dubious, test returned 1 (wstat 256, 0x100) Failed 1/1 subtests Test Summary Report ------------------- foo.t (Wstat: 256 Tests: 1 Failed: 1) Failed test: 1 Non-zero exit status: 1 Files=1, Tests=1, 0 wallclock secs ( 0.03 usr 0.01 sys + 0.02 cusr 0.00 csys = 0.06 CPU) Result: FAIL 続く
続き で、先程と同じ出力をするスクリプトを、Test::Moreを使わずにprint文だけで作りました。 use strict; use warnings; print "1..1¥n"; print "not ok 1¥n"; print "# Failed test at foo2.t line 4.¥n"; print "# got: '2'¥n"; print "# expected: '3'¥n"; print "# Looks like you failed 1 test of 1.¥n"; これをproveコマンドで実行すると、行番号だけでなく、「#」で始まる行が表示されません。 $ prove foo2.t foo2.t .. Failed 1/1 subtests Test Summary Report ------------------- foo2.t (Wstat: 0 Tests: 1 Failed: 1) Failed test: 1 Files=1, Tests=1, 0 wallclock secs ( 0.03 usr + 0.01 sys = 0.04 CPU) Result: FAIL いちおう prove -o で、コメント行が表示されることは分かりましたが、 知りたいのは、2つのスクリプトが同じ出力をしているのに、 proveコマンドの動作が違うのはなぜかということです。 たぶんTest::Moreのis()がなんか特殊なことをしているのだとおもいますが、 どんなことをしているのかは分かりません。 だれか知っている人がいたらおしえてください。
475 :
443 :2011/12/12(月) 15:14:39.81
>>445 遅くなりました。
"\x{e3}\x{81}\x{8c}"はフォーマット的におかしいんですね。
しかし、モジュールの結果で返ってきてるんで、今回は仕方ないとあきらめておきます。
教えていただきありがとうございました。
また、別の疑問が出てきました。
utf8の日本語をConfig::TynyとYAML::XS::LoadFileでインポートしてDump::Dumper::Dumperすると下記のようになります。
Configの方は''で完全な文字列ですが、YAMLの方は""で変数展開用のダブルクォーテーションになっています。
この違いはプログラム作成側としては気にしなくて良いのでしょうか?
また、Dumperで確認するときにConfigの方が日本語が読めていいと思うのですが、YAMLでシングルクォートにする方法はどのようにすればよいのでしょうか?
#Config::Tyny
$VAR1 = [
bless( {
'_' => {
'keyword' => 'キーワード'
}
}, 'Config::Tiny' )
];
#YAML::XS
$VAR1 = [
'_' => {
'keyword' => "\x{30ad}\x{30fc}\x{30ef}\x{30fc}\x{30c9}"
}
];
476 :
475 :2011/12/12(月) 15:23:39.91
すみません。
>>475 は、少し意味が違いますね。
よく見たらUTF8フラグがついている。↓
"\x{30ad}\x{30fc}\x{30ef}\x{30fc}\x{30c9}"
YAMLでロードすると、内部コードに変換して取り込むんですね。
そのせいで""ダブルコーテーションになってそうな気がしますが、合っていますでしょうか?
これだとインポートした文字列を出力したい時に、
ファイル→インポート(内部文字コード変換)→出力(encode)
と、無駄な変換が発生している気がしますが、そんなに負荷はないのでしょうか?
おちついてください
>>475-476 Data::Dumper には U+0080 以上の文字を問答無用で16進表記してしまうという問題が
あるので、日本語をまともに出したい場合は
sub Data::Dumper::qquote { local $_ = shift; s/['\\]/\\$&/g; "'$_'"}
と書いておく(ただしこれだと Useqq=1 が動かなくなる欠点あり)。
Config::Tiny には read のほかに read_string があるようなので、 自分でファイルをまるごと読んで、その内容を read_string に渡せば 問題なくなるはず。 use Config::Tiny; sub rd($) { local $/ = undef; open(my $f, '<:utf8', shift); <$f> } my $cfg = Config::Tiny->read_string(rd('foo.cfg'));
>>474 >「#」で始まる行が表示されません。
>>472 「#」ではじまる行は STDERR に出力されてるようだけど、そういうことじゃなくて?
>>478 追記。
$Data::Dumper::Useperl = 1;
これが必要なのを忘れてた。
482 :
デフォルトの名無しさん :2011/12/13(火) 17:29:10.64
my($year, $month, $day, $hour, $minute, $second)から UNIXタイムスタンプを得る方法を教えてください。 こんな事にモジュールは使いたくないので、計算で出したいです。 どっかのブログに書いてあった計算式では正しい結果が得られませんでした。
>こんな事にモジュールは使いたくないので 5.005のお守ですか? ご愁傷様です
Time::Localでも見てきやがれですyp
>>484 だからCPANは使いたくないんだってば
Time::Local は Perl5 に標準添付だから CPAN は使わなくて済むと思うが。 use することすら嫌なら「どっかのブログ」じゃなくて Time::Local の中身でも「見てきやがれ」としか。
ソースコードは提供されてないとか思ってんだろ(´_ゝ`)プッ
CPANを使いたくないんじゃなくて 使えないんだろ?
なにそれ地獄すぎる
>>482 CPAN使えない(使いたくない)奴がこの程度のことをモジュール使わんと自力で書けずに
2chなんぞに質問ぶっぱなしてる時点でオワってるとわたくしは思います。
素直にモジュール使え。
何か他人が煽って荒れてる…
>>484 ありがとうございました。
Time::Localごちゃごちゃしてて読む気なかったんですが、参考にして自分で実装しました。
しかし某ブログの計算式は何だったんだろう。
Perl用ではなかったんだけど、intくらいしか関数使ってなかったし。
本来は条件分岐とか一切なしに1行の計算だけで出せるものなんですか?
markdown.pl
http://daringfireball.net/projects/markdown/ についての質問です
Markdown 記法の説明は
http://blog.2310.net/archives/6 にありますが、
改行後に文字が続くと<p>でくくります。たとえば
テストですよ、
どうですか
この文字列はつぎのように展開されます。
<p>テストですよ、
どうですか</p>
英文ならこれでも体裁は良いのですが、html上日本語の文の場合いらない空白が出てきてしまいます
<p>テストですよ、どうですか</p>
このように改行直前の文字がマルチバイト文字(非ascii文字)なら
改行を取り除いて<p>でくくりたいのですがどう改変すればいいのでしょうか
markdown.plのsub Markdownがその改変すべき処理なのかと思ったのですが
どこから手をつければよいのかわかりません
>>491 > 本来は条件分岐とか一切なしに1行の計算だけで出せるものなんですか?
“某ブログ”に、考え方から計算式の導き方まで懇切丁寧に書いてある。
>>493 でもその肝心の計算式がそれっぽい数字は出るものの結果が合わないです。
計算過程は長すぎて、そこからあるかどうかもわからない間違い探しをするのも手間なので、結論を知ってる方が教えてくだされば早いのですが。
普通はTime::Localで済むので、わざわざ自分で何とかした方はいないですかね。
>>494 あんまりPerlと関係ないような気がするし、某ブログとやらも知らないけれど、
int を使ってるということだから、プログラミングの初歩で習うゼラーの公式と
同じ考え方を使うんじゃないの?
>>494 そんなことより、なぜTime::Localを使わず自分で実装したがるのかを知りたい。
Perlはインタプリタ言語だからライブラリをincludeすると重くなる?浅はか。
勝手にバージョンが変わって動かなくなるのが心配?そんな環境ならそもそもPerlを使うのが愚。
下手の考え休むに似たり。 下手だから無駄なことしてるんだよ。
>>482 ここで聞くまでもなく「UNIXタイムスタンプ」を(ブログ
なんかじゃなくて、ちゃんと)調べれば自然にできると
思うけどな。
>>480 そういうことでしたか。ありがとうございます。
↓これなんで文字化けするの?perlは今まで1文字も書いたことないし、 プログラムも録にしたことないからこれがperl独特の文字化けなのかわからんちん。 ついでに出来れば'<small>晴れ</small></td>'と'<small><font color="#999999">晴れ</font></small></td>'のパターンの中の天気の文字列を取ってくる正規表現ください。 #! /usr/bin/perl $string = '<small><font color="#999999">晴れ</font></small></td>'; $pattern = ">[^<](.+)[^>]</"; if ($string =~ /$pattern/) { print '$1は、', $1, "です", "\n"; }
>>500 ・・・と、適当な事いっちゃったけど、
$pattern = ">([^<].+[^>])</";
こうだな。
>>502 Genius has come! ありがとうございます。
$pattern = '<small>(?:<font[^>]*>)*(.+)(?:</font>|</small>)';
ここまで作ってみたけどgreedy match使うと後ろの方に引っかかっちゃうよ系の罠に引っかかってた。
$pattern = '<(small|font).*>([^<>]+)</\1>'; print "\$2は、$2です\n";
> Genius has come 天才は米を持っている。
ActivePerlをWindowsにインストして コマンドプロンプトからPerlのプログラムを実行したいのですが systemに日本語のファイル名を渡すと正常に処理できません。 どうすればsystemで日本語のファイルを処理できますか? system "dir 日本語.txt"; を実行すると 「ファイルが見つかりません」となりますが コマンドプロンプトで dir 日本語.txt と打つとファイルの情報が表示されます。
>>7 の 2行目から 5行目って
use open qw(:encoding(cp932) :std);
一個で済むんじゃないの?
もうなにがなんだか...
511 :
デフォルトの名無しさん :2011/12/17(土) 11:45:35.17
# [Perl 日本語処理]
# さまざまな機能をわかった上でどうしても,という方を留め立てする
# つもりはありませんが,
>>7 でできることのほとんどはもう
use Sjis;
require 'jacode.pl';
# に含まれてるかもです。
# いまさら
>>7 を使わずに,いなばの道を行くしかありません。
>>506 > system "dir 日本語.txt";
普通に通るぞ。
v5.12.3 build 1204
Perl 関係のスレで Sjis.pm とか jacode.pl を勧めてくる人って一人でやってんのかな。作者本人かしら。 そういうのが必要なシーンもあるのか知らんが、9割9分の人間は Encode 使ったほうがいいと思うなあ。
>>513 たぶん 506 の人はプログラムを UTF-8 で書いてるのでは。
>>514 古いスクリプトの資産があって、なるべく変更したくないっていうんならともかく、
新しく書くんなら utf8 + Encode の一択でしょうね。
なるほど、use utf8;前提なら必要なのは
>>7 の
> # ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、
> # この例のように cp932 でエンコードする必要があります。
517 :
506 :2011/12/17(土) 14:34:01.02
100人乗っても大丈夫な道
ワニの集団に襲われたのに、よく皮剥がされただけで済んだよな いなば君強しw
剥がされた皮はまだ被っていた皮なんじゃね?
524 :
デフォルトの名無しさん :2011/12/17(土) 17:51:05.69
フォームで入力した文字が、ファイルから読み込んだ文字列に何個含まれるか を求める方法を教えてください ようするにパターンマッチした個数ですね。 できればモジュールを使わない場合のやり方も教えてほしいです 十や表などの文字化けする文字がふくまれていてもうまくいくようにです
また嫌モジュール厨が舞い戻ってきたか。 仮にモジュールを教わったら、自分で中身を読めばいいだけのことだろうが。
$count = ($input =~ s/\Q$keyword//g);
>>525 モジュールを使わないのであれば、自分でマルチバイトアンカー
リングする必要がある。
それはいばらの道だ...
ち、ちがうもん
「できればモジュールを使わない方法が知りたい」って人は理由を書いて、論破されたほうが幸せになれる
まあ「毎回モジュールの読み込みに時間がかかるから」てのは一昔前に俺も思ってたことあったな HTML解析系とか、自前で正規表現の組合せでやった方が高速なケースは今もたまにあるし
Perlのバージョンが上げられないパターンは多そう
ここですぐ答えがもらえるような類なら、該当モジュールを読んでコピペでもした方が 質問するより手っ取り早いよ。
>>533 特にOOなモジュールは1桁遅いからねえ
非力な環境ではキツい場合もあるな
「大きなファイルや沢山のファイルを入れると怒られるから本体と.dllだけ入れて動かすしかない」 …っていう理不尽な状況なら昔俺がやったなw 一応簡単なフィルタならそれだけでも書けなくもなかったが どうしても苦しい処理があるから選抜して2、3個は入れさせてもらった ちなみに、一切useしなくても 一部の関数は.pm無しでは動かないものがあったよ、どれか覚えてないが 割と知らず知らずのうちに使ってる可能性がある
strict.pm と warnings.pm は必ず使ってる。
>>537 それは Windows だとよくやる。テストマシン上とか。
ファイル2個だけでそこそこ役に立ってくれるのはありがたい。
>>539 よくある事なのか…理不尽だなんて言ってられんか
まあでも、素のコマンドプロンプトじゃほとんど何も出来ないこと考えると
Perlあるだけで世界が変わるだろな
JScriptもVBScriptも コマンドラインで動くから あまり関係ないな。
つーか、みなさん環境に恵まれすぎだろう
おまいらが禁止されすぎなんだよ ActivePerl禁止、仮想環境禁止って 禁止禁止言ってる側は何と戦ってるんだかw
jcode.plは禁止 use strict; use warnings;書かないと禁止 禁止 禁止オタクですか?
ワンライナーで失敗したときってダサすぎんだけど やっぱりワンライナー書く練習してるの?w
「ワンライナーみせつけてやるか(キリッ」 perl -e " ほにゃららら のひゃら 'ほにゃら" 「ふっ」 Can't find string terminator "'" anywhere before EOF at -e line 1. ひそひそ ( ;゚д)ザワ ウワダサッ!(;゚д゚;) ワンライナーミスッテマスヨ(д゚; ) ヒソヒソ
スレタイのPerlには当然Perl4を含んでいると思っている おいらだから「モジュールを使わない方法で」って言われ るとそっか、Perl4なのね、ライブラリなら使えるのねっ てすぐにピンとくらあ。
>>532 その人は個人的な制約で困っているわけじゃないだろうから論破しても意味
がないと思う。仮にその人がギブアップした場合でも他の人がそのポジショ
ンを補うことになるわけで、(2chで質問するかはともかく)「モジュールを
使わない方法」を模索する気がする。
論破しようとするも、先方が取り合わない
Sjisを使うのはアホでFA
リリース日がAFなので正しくは「ばか」、な?
そうかねこでも使えるのか、そりゃいいな
まあsjis扱いたかったらjperlがあるしな
558 :
デフォルトの名無しさん :2011/12/18(日) 18:08:58.87
文字列中のマッチした文字を太字にしてマーカー(色)をつけるようにしたいんですが困っています。 $str="あああaaaFONTwww"; $str = &merker($str,"あああ","#00ff00"); $str = &merker($tr,"www","#0000ff"); print "$str"; この場合は"あああ"と"www"にマーカーがつきますが $str = &merker($str,"あああ","#00ff00"); $str=&merker($str,"FONT","#0000ff"); print "$str"; 上記のように"FONT"をマーカーしたい場合だとタグが崩れてうまくいきません うまくいく方法を教えてください merker{ my($str) = $_[0]; my($merker_str)=$_[1]; my($merker_color) = $_[2]; $zentai_str =~ s/$merker_str/<FONT STYLE=\"background:$merker_color\"><\/FONT>/g; return($str); }
559 :
デフォルトの名無しさん :2011/12/18(日) 18:09:49.84
あ、subが抜けてたsub merkerです
560 :
デフォルトの名無しさん :2011/12/18(日) 18:11:36.05
あ、またまちがえた $zentai_str =~ s/$merker_str/<FONT STYLE=\"background:$merker_color\"><\/FONT>/g; ではなく $str =~ s/$merker_str/<FONT STYLE=\"background:$merker_color\"><\/FONT>/g; です
561 :
デフォルトの名無しさん :2011/12/18(日) 18:13:27.37
あ、またまた間違えました $str =~ s/$merker_str/<FONT STYLE=\"background:$merker_color\"><B>$merker_str<\/B><\/FONT>/g; です
s#(?<!<)$marker_str#<span style="background:$marker_color;font-weight:bold">$marker_str</span>#g
綴りまちがってるのが気になってコードが考えられない
おっぱい禁止
>>563 何しろzentai_strのレベルだから、そこに気づくのも無理だろ
微妙に遅くなるかもしれないけど、こっちの方が確実だな。
もっとうまい書き方があるのかもしれないけど、とりあえず。
sub marker {
my ($s, $p, $c) = @_;
my @d = split m/(<.+?>)/, $s;
for (@d) {
next if /^</;
s|$p|<span style="background-color: $c">$p</span>|g;
}
return join '', @d;
}
これならたとえば marker($str, "style", "#ffcc99"); なんてのでも変換できるはず。
なお関数内で複数のパラメータを受け渡す時は my ($a, $b, $c) = @_; みたいにやるのが普通。
あとPerlとは関係ないが、今のHTMLではFONTタグの使用はおすすめできない。
style属性を使うならなおさら、
>>562 のようにspanを使うのが一般的。
PerlだけでなくHTMLも勉強しようぜ。
オレだったらshiftするなぁ my($str) = shift; my($merker_str)=shift; my($merker_color) = shift; 一個一個に or die $! 付けたり付けなかったり 後から引数増やしたりとかの関係で ともかく、とりあえず$_[0]とかは使わない
何回もmarker呼び出すんじゃなくて一回の走査で全部置換するようにすればいいんじゃないの。 sub marker { my ($str, $color_hr) = @_; my $re = join '|', map { quotemeta } keys %$color_hr; $str =~ s,($re),<span style="background-color: $color_hr->{$1}">$1</span>,g; $str; } print marker($str, {'あああ' => '#00ff00', 'www' => '#0000ff'});
569 :
デフォルトの名無しさん :2011/12/19(月) 14:46:27.96
アナルパールとかいうアダルトグッズあるよね
Perlerは手首に巻いたりするらしい
金井克子?
金井克子についての質問は板違いです。WEB プログラミング板でどうぞ。
576 :
デフォルトの名無しさん :2011/12/19(月) 17:47:26.91
makeはメイクだから makerはメイカーだろ? だからマーカーはmekerで正しいんじゃないのか?
何がだからなのかわからん
on your mark!
579 :
デフォルトの名無しさん :2011/12/19(月) 19:16:58.60
$str="<FONT COLOR=\"#00ff00\">aaa</FONT>bbb<FONT COLOR=\"#00ff00\">ccc</FONT>"; $str_ =~ s/<FONT COLOR=\"#00ff00\">.*?<\/FONT>/AAA/g; このような場合だとaaa~cccまでがAAAに置換されてしまいますが aaaとcccだけAAAに置換する方法を教えてください
.*?を.+?にしたらいいんじゃないの?
━┓ ┏┛ ⌒ ・ .___ ⌒ ___ ━┓ / ―\ / ― \ ┏┛ /ノ (● X (●) \ヽ ・. | (●) /_ (⌒ (●) /. | (__/  ̄ヽ__) /
579だけど質問が違いました 特定のタグで囲まれた中の文字列の置換について教えてください 例えば $str = "<FONT COLOR=\"#00ff00\">aaa<\/FONT><FONT COLOR=\"#00ff00\">bbbFONT<\/FONT><FONT COLOR=\"#00ff00\">ccc<\/FONT>"; のbbbFONTの部分のFONTをAAAに置換したい場合 $str =~ s/<FONT COLOR=\"#00ff00\">.*?FONT<\/FONT>/AAA/g; だと結果はAAA<FONT COLOR=\"#00ff00\">ccc</FONT>になってしまいます
>>584 理解できなかった理由は「長すぎたから」では無かろ。
#!/usr/bin/perl -w
use strict; use CGI qw(escapeHTML);
my $str = <<'EOH';
あああ<span title="FONT">FONT</span>www
<span title="www
www">あああaaaFONTwww</span
>aaa<span>FONT<span title="aaaあああaaa">wwwあああwww
</span>FONT</span>
EOH
print 'あああ = ', mark(\$str => 'あああ', with => '#00ff00'), "\n";
print mark($str => 'FONT', with => '#0000ff');
sub mark {
my($str, $target, %css) = @_;
With: {
defined $css{'with'} or last With;
local $_ = delete $css{'with'};
/^#/ and $css{'background-color'} = $_, last With;
}
$css{'font-weight'} ||= 'bold';
my $css = escapeHTML(join ' ', map "$_:$css{$_};", keys %css);
#
http://www.din.or.jp/~ohzaki/regex.htm#ReplaceOutside my $count = (ref $str ? ${$str} : $str) =~
s{ ((?:\G|>)[^<]*?) (\Q$target\E) } {$1<span style="$css">$2</span>}gx;
ref $str ? $count : $str;
}
>>585 おまえ、これまでのみんなの回答をぜんぜん読んでも試してもいないだろ。
質問する資格なしだな。
こういう手合いは、何か解決作やらヒントを知りたいんじゃなく、 ピンポイントで答えだけを聞きたいヤツだ。 長々書いてやっても、どこに答えがあるのかわかってない。 質問する前に、もっと入門書なり読んで基本学ぶべきだ。
590 :
583 :2011/12/20(火) 16:38:20.98
>>584 自分では結構よく書けたと思うんだがなァ……
具体的にどこら辺が分からなかったのか教えてくれると嬉しい。
コメント入れる時の参考にする。
$str =~ s/>bbbFONT</>bbbAAA</g;
>>586 リファクタリング練習。求む(反論 or 改善案)
sub mark {
my($str, $target, %arg) = @_;
my %css = (
# specify your default marker styles below:
'font-weight' => 'bold',
'background-color' => delete $arg{with},
%arg,
);
# Serialize CSS.
my $style = join ' ',
map { "$_:$css{$_};" }
grep { $css{$_} ne q{} }
grep { $css{$_} !~ /[":]/ }
grep { ref $css{$_} eq 'SCALAR' }
keys %css
;
my $count = (ref $str ? ${$str} : $str)
=~ s{
((?:\G|>)[^<]*?) (\Q$target\E)
} {
$1<span style="$style">$2</span>
}gx;
ref $str
? return $count
: return $str
;
}
こんなかんじじゃねーの。 動かないって?知ってる。 my $parser = HTML::Parser->new( api_version => 3, text_h => [\&conv], ); $parser->parse($html); sub conv { my ($self, $tagname, $attr, $text) = @_; $text ~= s/$merker_str/<FONT STYLE=\"background:$merker_color\"><\/FONT>/ }
タグで囲まれた中の置換最短プログラム $word="FONT"; $chikan="RRR"; $str =~ s/([^<])$word([^>])/$1$chikan$2/g;
>>594 それだとたとえば $word='COLOR'; $str='<FONT COLOR="#FF0000">'; なんて時にアカン。
Web::Scraperとか重すぎ ごみすぎ カスすぎ オワコン なんか柔軟性にかける
また新たにヘンなコテハンが出てきたな。 専ブラのブロック設定更新しとくか。
自分「Web::Scraperっていうのいいですよ」
和田「そういうのは 使わないほうがいい 正規表現があるじゃないか」
自分「え?」
和田「たとえば和田が開発したWEBアプリ Perlがあればそのまま導入できちゃいます 顧客先で」
自分「はい なんかCPANが簡単になるのあるらしいですけど」
和田「Web::Scraperというやらはな CPANから導入しないと大変 依存関係もめんどくさい」
和田「それならPerlだけで動く 標準的なソースコードのほうが導入しやすい」
自分「なるほど でもWeb::Scraperはいいですよ CSSセレクタもそろって抽出しやすいです 正規表現より凄いです」
和田「なんのための Perl!!!! 正規表現は王道!!」
和田「Perlは好き だけど言語学習じゃないんだ 結局は何を作るか」
自分「はい」
和田「まあ見たまえ わしのサイトを
http://www.synck.com/ 」
自分「凄いです!和田さん!!」
600 :
デフォルトの名無しさん :2011/12/21(水) 13:25:27.47
HolyGrail「 え?なにこのフリーランス まじ強すぎ 俺よりやばくね 俺元ヤフーなんだけど 負けるわけがない 」 自分「ゲームばっかりしてるてめーが和田に勝てるかよw」
説教君まだいたのか。
コテつけてくださいPerl忍者さん
my @words = ( 'sevens', 'even' ); foreach(@words){ print "even=$_\n" if( $_ =~ /(?:(?!s)even)/ ); print "sevens=$_\n" if( $_ =~ /(?:sevens)/ ); } 上記でeven=even sevens=sevensとプリントしたいのですが、上記では$_に"sevens"が来たときに 両方プリントされます。 (?!s)でevenの前にsが無い時、と表現しているつもりなのですが、どこがおかしいのでしょうか。 ^$(先頭、最後尾)を使わずに実現したいです。
>>603 その場合は否定戻り読み(?<!…)を使ってください。
>>603 > print "even=$_\n" if( $_ =~ /[^s]even/ );
> print "sevens=$_\n" if( $_ =~ /sevens/ );
[^s] は行頭にはマッチしませんことよ
あ、s/行/先/
609 :
603 :2011/12/22(木) 09:20:21.02
>>604-608 色々と情報ありがとうございます。
607がよさげなのでこれで対応しました。
ありがとうございました。
> ^$(先頭、最後尾)を使わずに実現したいです。 なんだったのか
単語の部分文字列にマッチしたくないんだから、 ¥b を使えば楽な ケースじゃないかと
> 単語の部分文字列にマッチしたくないんだから、
んなこた書いてないと思うけど。
seven と even を区別するだけなら \b でもできるけど、
たとえば revenge はマッチさせたいって場合だと困るね。
個人的には
>>604 でいいじゃんと思う。
一番いいのはHTMLパーサーを使うこと。
615 :
デフォルトの名無しさん :2011/12/24(土) 02:47:34.54
length()関数は日本語まじりの文字列でも文字数を返します 例: my $test="テストです!!!!!"; print length($test),"\n"; 結果: 10 バイト数を知りたい場合はどうすればいいのでしょうか?
bytes::* は非推奨らしいよ encode_utf8 しろとさ
>>615 >>617 バイト数は文字コードによって違ってくるから
utf8ならencode_utf8でいいけどShift JISとか他のコードの場合はまた別
だよね
619 :
デフォルトの名無しさん :2011/12/24(土) 17:40:34.42
本来なら全角一文字は2バイトですよね? なぜ全角一文字が3バイト扱いされているのでしょうか? #!/usr/bin/perl use utf8; binmode STDIN, ":utf8"; #binmode STDOUT, ":utf8"; binmode STDERR, ":utf8"; use Encode; use Encode qw(encode_utf8); my $test="あいうえお"; print length(Encode::encode_utf8($test)),"\n"; #結果は15
>>619 いつから全角一文字が2バイトだと錯覚していた?
>>619 日本語文字に10バイトくらい使う文字コードもあってもいいんじゃねーーーの???
622 :
デフォルトの名無しさん :2011/12/24(土) 17:48:06.93
shiftjisでうまくいきました
特殊記号消えるぞ
タグの中以外の文字列の置換やっとできた sub make_merker{ my($zentai_str) = shift; #全体の文字列 my($merker_str) = shift; #マーカーをつける文字列 my($merker_color) = shift; #マーカーの色 my($disp_merker_str); #マーカーをつける文字列を表示するときの文字列 my($disp_zentai_str); #表示する全体文字列 my($tag,$data); my(@tag_list,@data_list); my($n) = 0; $disp_merker_str = $merker_str; $merker_str =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g; while($zentai_str =~ /<(.*?)>/g){ push(@tag_list,$1); } $zentai_str =~ s/<(.*?)>/<>/g; @data_list = split(/<>/,$zentai_str); foreach $data(@data_list){ $tag = $tag_list[$n]; if($tag ne ""){$tag = "<".$tag.">";} else{$tag = "";} $data =~ s/$merker_str/<FONT STYLE=\"background:$merker_color\"><B>$disp_merker_str<\/B><\/FONT>/g; $disp_zentai_str = $disp_zentai_str.$data.$tag; $n++; } return($disp_zentai_str); }
無駄な努力ご苦労様としか
こういうゴミが日々生産されるのもperlの醍醐味 本人が手ごろな作業感と達成感を得られるんならほっといてもいいけど
HTMLパーサー使えばもっと簡単に もっと安全に作れるのにな。
何でも自分で作りたい年頃なんだろうな。
Perl厨って同じ正規表現をあちこちで使うやつ多いよな。 んなもん、適当な名前つけて関数にすればいいのに。
モジュールのサイトとかほとんど英語で書かれていて どれが使いたい関数なのか探すのに時間かかるから 結局自分で作った方が速い
お前がそう思うならなんちゃら
そうなんだすごいね!
モジュールのパスは、lib/5.8.8が標準モジュールで、 lib/site_perl/5.8.8は後からCPANで入れたモジュールでしょうか?
>>633 設定やディストリ次第だが概ねそんな感じ
彼が他人の回答も意見も全く読んでないことをよく示していますね
そもそも、引数を取り出すのに今どきshiftだもんなぁ…
>>624 のような石頭爺は万事これだから困る。
>>624 なら = @_ のほうがいいってのはわかるけど、
shiftで引数取ること自体は特定の場面では有用だろ。今も昔も。
'0'と'1'のみで構成された文字列を 4桁ごとにスペースなどで区切って表示したいのですが (文字列の長さは4の倍数に既になってます) 何か良い関数・妙案はありますか 今のところ配列に突っ込んで愚直に4回ずつshiftしつつ表示してます
場合によりけりかな。 カプセル化した時なんかはよくshiftつかってる。 sub method { shift->_method(@_); }
>>639 my $str = '010111010010101010100101010';
print join( ' ', split(/([01]{4})/, $str) );
print join (' ', unpack("(A4)*", $str));
print join (' ', $str =~ m/..../g);
>>641 それだと余計な空文字列要素が間や先頭にできてしまう
>>644 切り詰めれば
$,=$";print$str=~/..../g
とかはできる。さらに $str じゃなくて $_ なら6文字縮むし、print のかわりに say が使えれば2文字縮む。
ワンライナーか競技ゴルフじゃなきゃやらんけど
書く文字数を減らすんじゃなくて、 処理速度が速い方法を考えろよ・・・
俺はゴルファーでも一行野郎でもないので、
ここは文字列が4の倍数以外でも表示できる
>>642 を推したい。
>>641-647 ありがとうございます。色々と勉強になりました。
一応文字列は4の倍数で来るはずですが
何かの手違いで狂っていた場合に見つけやすいということで
>>642 にします。
pack/unpackは未だに苦手なので、あまり理解できていないのですが…
あとは
>>645 さんのもワンライナー用に覚えておこうかなと思いました。
パッと見で理解できる分、覚えやすいですし。
$ うんたらかんたら | perl -nE'$,=" ";say/..../g'
みたいな感じでサラッと書けたら楽しそうです。
終了しているとこなのにすまん $str =~ s/(....)/\1 /g; または (my $str1 = $str) =~ s/(....)/\1 /g; だと思うんだ 評価求む
>>650 …盲点でした
考えてみれば、それだけのことですよね…
というか、むしろ何故それを思いつかなかったんだろう?!
split()してshift()とか俺は最初に何をしていたんだあああ
ちなみに後に(キリッ)とばかりに書いたワンライナーに至っては
perl -pe's/(....)/\1 /g'
…要するに
sed 's/\(....\)/\1 /g'
になってしまいました…
ま、まあ
>>642 という良さげな案を貰えたので結果オーライということにしておきます!ありがとうございました!
どういたしまして。
653 :
650 :2011/12/25(日) 18:20:01.11
>>651 レスありがと
自分が当然こうだと思う答えが微塵も触れられてないと、
いささか不安になります
当たり前のことに気がつかないことって、結構あってこわいですね
>>653 目的が「表示したい」であって「文字列を加工したい」ではないから、
元データを破壊する方法は採らないし、
出力に流し込めば済むものをわざわざ変数に入れないのが自然。
置換の場合の別解: s/(?<=\G....)/ /g
>>650 お題だけ見るとそれで正解なんだけど、
察するにバイナリを整列させた上で何かを見比べようとしてる風に見える。
なら4桁毎に配列になってるほうが後々同じ事繰り返すリスクを減らせると思う。
「2桁目が1のヤツだけ抜き出したい」とか「出現頻度調べたい」とか。
1と0の羅列を目に見せるのが最終的な目的とはちょっと思えないかな。
656 :
650 :2011/12/25(日) 23:25:29.40
>>654 ,655
そういうことですか。やっぱ、気が回ってないのですね。
勉強になります。ありがとう
657 :
650 :2011/12/25(日) 23:36:46.91
あっ、654も読めてないのですね。 654さん、失礼しましたm(_ _)m
658 :
657orz :2011/12/25(日) 23:43:58.13
×654 ○651
map/grep/sortといった関数は、第1引数がブロックだとその後にカンマが要らないのですが、 何故そのような仕様なのでしょうか?
#-- 初期化 --# $hash = { 'name1' => 'value1', 'name2' => 'value2', 'name3' => 'value3' }; #-- 代入 --# $hash->{'name4'} = 'value4'; $hash->{'name5'} = 'value5'; $hash->{'name6'} = 'value6'; $hash->{'name7'} = 'value7'; 複数代入する時に$hashを毎回書かないようにする書き方ってありませんか?
>>661 動かないコードを示されてもね…
だからヒントだけ。例えば↓
@array = (1, 2, 3);
@array = (@array, 4, 5, 6);
>>662 それだと新たなハッシュが作られませんか?
あくまでも現在のハッシュに追加したいのです。
>>661 データの追加なら↓とか
$hash = {
%{ $hash },
'name4' => 'value4',
'name5' => 'value5',
'name6' => 'value6',
'name7' => 'value7'
};
>>664 ありがとうございます。
参考ページまで付けて頂いて感謝します。
668 :
デフォルトの名無しさん :2011/12/27(火) 16:21:59.06
環境はcygwin windowsXPです。 なぜか文字化けするのですがどうしたらなおりますか? #!/usr/bin/perl # ソースコードはutf8で書かれています use utf8; binmode STDIN, ":utf8"; binmode STDOUT, ":utf8"; use strict; use warnings; print " ここでは文字化けしない"; open (IN, "<./in.txt"); # in.txtはUTF8 while(<IN>){ print $_; #なぜか文字化け } close IN;
open IN, '<:utf8', 'in.txt'
668ですが utf8::decode()でなおりました
>>669 うまくいきました
ありがとうございます
binmode STDIN, ":utf8";
をつかえばUTFフラグつきの文字列を受け取って貰えるかと思っていました
>>668 open (IN, "<:utf8", "./in.txt");
が最適解かな。
うわもう出てたごめん。 あとは open (IN, "<./in.txt"); binmode IN, ":utf8"; while(<IN>){ ... とか。
取り込んだ文字列を関数で処理しようとしましたが正しく処理されないのはなぜでしょうか? #!/usr/bin/perl # test.pl: a /usr/bin/perl\015 script, UTF-8 Unicode (with BOM) text executable, with CRLF line terminators use utf8; binmode STDIN, ":utf8"; binmode STDOUT, ":utf8"; use strict; use warnings; my @array; open (IN, "<:utf8", "./in.txt"); # in.txt: UTF-8 Unicode (with BOM) text, with CRLF line terminators while(<IN>){ chomp($_); push(@array, $_); } close IN; print "$array[0]...........\n"; # ........... print "$array[1]...........\n"; # ........... print &repeat($array[0]); # 変になります print &repeat("テスト2"); # テスト2テスト2 sub repeat{ my ($str) = @_; chomp($str); print "*** $str$str ***\n" } 実行結果: ........... ........... ***トスト 1*** テスト2テスト2 *** 1
in.txtを CRLFからLFにしたらなおりました
cpanplusで質問です。 下記でモジュールインストール出来ますが、アンインストールをコマンドライン一行でする方法はどのようにすればよいのでしょうか? perl -MCPANPLUS -e "install Math::Round"
$_ = decode('utf-8', $_) してる俺に隙はなかった
>>679 decode_utf8を使わぬとはまだまだだな
681 :
デフォルトの名無しさん :2011/12/28(水) 14:12:31.36
>>678 App::pmuninstall
で行けなかったっけ?
682 :
678 :2011/12/28(水) 16:35:13.45
>>681 おお出来ました。
ありがとうございました。
decode_utf8が気になって今ググってるのですが、decode_utf8の使い方は utf8の文字コードがあった場合、utf8フラグを付け、すでにフラグがついてればそのまま返す。 というもので、文字コードがsjisとかだと使えないということでしょうか?↓ use utf8; my $str_utf8 = encode('utf8', 'あああ'); my $str = encode('utf8', $str_utf8); my $str_test = encode('sjis', $str_utf8); my $hoge1 = decode_utf8($str_utf8); #そのまま返すのでutf8フラグあり my $hoge2 = decode_utf8($str); #utf8フラグ付きで返す my $hoge3 = decode_utf8($str_test); #sjisなのでエラー??
sjisだと使えません。素直にdecode使ってください。
encode('utf8', 'フラグ付き') で得られた $str_utf8 をさらに encode してる時点でおかしい
文字コードがsjisなのに「use utf8;」としている時点でおかしい
>>686 ソースの文字コードと扱うデータの文字コードは別だからおかしくはないだろ
(1 .. 5)と(1, 2, 3, 4, 5)は何が異なるのでしょうか? これだと上手く行くのですが、 foreach my $n (1 .. 5) { $n = $n * 10; print "$n\n"; } これだと「Modification of a read-only value」と言われてしまいます。 foreach my $n (1, 2, 3, 4, 5) { $n = $n * 10; print "$n\n"; }
>>683 とりあえず use utf8; を外せばうまくいく。
必要になったときに use utf8; を使うようにすれば悩むことはない。
文字コード変換は Jcode.pm、フラグの悩み無用か。
だんだんと何に悩んでいるのかわからなくなりました
一度、C言語に戻ってPERLが必要になったらまたきます
ポインタより難しいPerlのutf8フラグさすが高級言語初心者お断り
ポインタよりリファレンスの方が難しいと思う
1レスで理解できるutf8フラグ utf8フラグとい名前がまずかったね。 Perl文字列フラグなどという名前だったらよかった。 Perl文字列フラグはPerl固有のものだから Perlコード外部から渡されるのは文字列ではない。 文字列でなかったらなにか?それはバイナリ。 バイナリを文字として扱いたければ、文字に変換しないといけない。 それがdecode。 ではソースコードに書いてあるのは、文字かバイナリか。 それはuse utf8を使えば文字で、そうでない場合はバイナリ。 話はこれだけ。
とある本ではPerl文字列を「"文字列"」って表現(""含む)してた これは良かったな
encode/decode が逆に感じる気もしないでもない?
情報源→符号化→通信路→復号化→受信
Perl様の視点から見てencode/decodeだもの
おれらはPerl様のしもべなのね 目的と手段を逆にするとこんなに苦しいとは
下位層を実装するときは、実装者が王様になってはいけないと思うの だってアプリケーションプログラマを見下すようなことになるんだもの そうでしょ?おじいさん
えー? Shift JISとかEUC-JPとかUTF-8とかはそれぞれのコード体系にencodeされてるんだし Perl内で文字列として処理する時はどんなバイト列になってるかとかは考えない、 つまりcodeとして意識する必要はないってタテマエなんだから、 encode/decodeは現状どおりで合ってんじゃね?
ASCIIのときもそうしてたっけ? なんか言ってること間違ってない?
to_bytes()/to_string()みたいな名前だったら分かりやすかったな。 名前は大事だ。
つーか、素直に文字コード変換でいんじゃね? プログラミングするにあたっては何かひとつにまとめるんだろうけどさ
encodeだけにするとかは? decode関数は、 my $perl_internal_string = encode("internal", $binary);
あ、ごめん。 $binaryの文字コード情報がないわw
いやあるだろ データ列そのものが情報源 なかったらテキストエディタとか自動判別に困る
いやw 情報源がなくて困ってるから 自動判別なんて曖昧なものを使うしか無いんだろw 100%の制度を持つ全世界言語対応の 自動判別エンジンなんて無いんだぞ。
デタラメに乱数でねつぞうしたバイナリに utfフラグ付ければ、それはutf文字列になるのか? ならんだろ。 そういうことだ
> Shift JISとかEUC-JPとかUTF-8とかはそれぞれのコード体系に > encodeされてるんだし コンピュータサイエンスとして正しいかもしれないけど、プログラマ もユーザもそのことを意識してない(意識させない)でしょ?普通。 例えば ASCII のときにそのことを意識してないでしょ?
>>714 そういうことだ(キリッ)って恥ずかしくない?w
バイナリにutf8フラグをつけたらどうなるかだって?
答えは出てる。
一部(全部)が壊れたutf8文字列だ。
壊れているってことが解るのも重要なことなんだが、
お前はランダムで捏造したバイナリを
どう扱って欲しいわけ?
>>715 > 例えば ASCII のときにそのことを意識してないでしょ?
論点がずれてるなぁw ま論点がずれた話に付き合ってあげるか。
ASCIIの時に意識してないというのは正確に言えば全部が
ASCIIで統一された世界であれば意識しないってことだよ。
残念ながら世界はASCIIで統一されていない。
ASCII以外を扱う世界で、ASCIIと同じように意識させない作るとしたら
すべてを何か一つのコードで統一しなければならない。ASCIIと同じように。
すべてをっていうのはPerlだけじゃなく内外すべての文書をUTF8なりなんなりで
統一するということ。それが可能ならその方法でいいよ。でも現実的じゃないよね。
じゃあどうするか、方法は2つある。
1.変数にどの文字コードが入ってるかを人間が意識してコーディングする
2.Perlの中だけは統一した世界を作って人間は変換処理だけをすればいい。
前者はShift JISとか日本語系文字コード以外も全て意識しないといけないので大変。
後者なら変換部分だけやれば、あとは文字コードを意識しないでいい。
つまり、ASCII以外を扱う世界において、ASCIIのように意識しないでいい最善の方法。
それがUTF8フラグ。
>>717 最後の一行(と最後から4行目のくだりも)に同意できないんだな、これが
「後者の変換部分」は「前者の意識しないといけないので大変」と 同じわけだから、後者のほうが(最善の方法とか言って)まるで 魔法のように簡単であるかのような書き方には注意が必要です。
ASCIIコードはまァ、Perlの処理系の記述に使ってる「大前提」の存在だからな。 「Perlで扱う文字列データ」の範疇の前にまず「Perlを記述するための記号セット」な訳で。
UTF8はUTF8でOS依存なのどうかならんのか
>>711 なんにしても外部から入力される文字列のコードページは
誰にも判断できないんだから自動判断するしかないわな
いわゆる外字を常に使っているような環境では、テキストといっても 公式の規格外の符号位置を含んでいるわけで、そのままではdecode/ encodeがうまくいかない(入出力双方のマッピングテーブルが必要に なる)。外字セットをたくさん扱っている場合は、毎回テーブルを 作るのも面倒だし、そもそもマッピングテーブルを作ることが仕事の 目的ではない。そうなると外字を含むテキストデータはバイナリと して扱うのが当然の流れになる。 これが世の中の一般的なことだと主張するつもりはないけれど、自分 の身の回りに限るとこれが一般的。 "前者"も"後者"も変換を強く意識しているものの、自分の環境ではむ しろ「外字も含めて意図しない変換がされないようにすること」が ものすごく重要。
そういう場合に、Encodeモジュールを使えば、 変換規則を自分で簡単にカスタマイズできるからいい。 既存の何かが気に食わなければ自分で作ればいいのよ。
×そうなると外字を含むテキストデータはバイナリとして扱うのが当然の流れになる。 ○そうなると外字を含むテキストデータは入力された文字コードのまま扱うのが当然の流れになる。
シフトJIS版のJPerlにもEUC版のJPerlにも文字列フラグはない。 にも関わらず、マルチバイト文字もバイナリデータも扱うことが できる。もしUTF-8版のJPerlがあったとしたらやはり同様だろう。 UTF8フラグの存在理由として、バイナリと文字列の区別のためと まことしやかに語られるが、それは正しくない。 正しくは、Latin-1とUTF-8の区別のため、だ。 だからLatin-1のサポートをやめればUTF8フラグは必要なくなる。 その際にバイナリデータが扱えなくなる、なんてことにはならない。
(キリッ)
>>726 Latin-1のサポートをやめたら
バイナリデータが扱えなくなるぞ。
なんか最後の行で先手を打ったつもりだが無意味だ。
バイナリデータが扱えなくなるぞ。
>>726 馬鹿だなぁw JPerlを持ってきた所で意味ないじゃないか。
JPerlの制限分かってるか?
その制限はそのまんまお前が言うUTF8版Perlに当てはまるんだよ。
http://gihyo.jp/dev/serial/01/modern-perl/0031 > jperlの制約
>
> ただし,田中氏のパッチではすべてが2バイト文字対応されていたわけではありません。
> readme.sjには以下のような制約が残っていることも明記されています。
>
> tokenに漢字を使うことはできない
> 文字列の大小関係はCのライブラリ関数の実装に依存
> substrやreverseは漢字を意識しない
> index,rindexの返す値は(文字位置ではなく)バイト位置
これがまさにUTF8フラグがなかったら、実現不可能なことになってるんだよ。
substrやindexについては対応できなかったというより, すべてを漢字対応にしてしまうと(たまたま漢字と同じバイト列が含まれているような) バイナリデータを扱うときや,全角半角入り混じった文字列の長さを 考慮した処理をしたいときに困るので,あえてオリジナルの挙動を 残しておいたと見るべきでしょうが,「jperlを使えばどんな書き方をしても 正しく日本語が処理される」というのは幻想にすぎません。jperlを使おうと, こう書いてしまえば文字化けは起きます(上のchopの例と同じく, 一見正しく動作しているように見えますが,次の出力があったときに文字化けが起こります)。
indexとか幻想とかそういうキーワードが出てくるなら その幻想をぶち○す人とかも出てきそうだ。
言われてる通り自分も名前が混乱の一端になってるような気がする。 encode/decodeは直観的でないし、UTF8フラグとかUTF-8バイナリ文字列と混同しそうだし。
Latin-1を捨てられないのであれば、同じ理由でシフトJISを捨てられない のも道理。別に"対抗処置"で使い続けている訳ではないはず。
「バイナリデータ」という用語を「デジタルデータ」と「非テキストデータ」 の2つの用語に使い分けると混乱の収拾に役立つ。その場合、「外字を含む テキストデータ」は「テキストデータ」なの?「非テキストデータ」なの? ということになるわけで、文字列フラグというアイディアがあんまり有効で ないことがここで判明する。
問題はPerlには変数に型がないから ファイルからデータを変数に読み込んだ時 そのファイルに入っているのが、テキストかバイナリか 区別する必要があるってこと。 UTF8フラグが立っていればUTF8テキストでlengthで 1~3バイトが1文字として返ってくる。 そうでなければ、lengthはバイト数で返ってくる。 変数に型もない言語においてutf8用の関数を作らないで対応するなら UTF8フラグみたいに値にフラグをもたせるしか無い。
いくら、なんだかんだ言ってもしょうがない。 Perlの設計した人がいう通りに使えばいいじゃないか。 特に不便は感じない。
そうだ、そうだ。オレが出口まで送ってやるから。
むしろたった数個の関数を追加したほうが手っ取り早いし、使う側も 理解しやすい。UTF8フラグ1ビットに数年かけて議論するということ もない。
ほう、すべてのテキスト処理関数に UTF8版を作れってかw CPANモジュールにあるほぼすべての 関数が2倍になるなw UTF8フラグを付けるだけで対応は完了するのに ご苦労なことだなw
どんな関数でも一文字づつ処理するだろう。 ただのデータ出力であったとしてもだ。 UTF8バイトの途中で切れたらいけないしな。 そうすると、大きな修正が必要になる。 すべての関数が2倍になるほどに。
中で正規表現使っているような関数はUTF8フラグがあれば、 正規表現部分がUTF8対応になれば動作するけど、 UTF8対応正規表現が別に用意されると、関数自体を書き換えないといけない。 もちろん互換性のために関数自体を書き換えるのではなく、別の名前の関数を 用意しないといけない。 そしてこの関数を使用している部分も書き換えないといけない。 このように依存関係のことまで考えると、そうとう修正が大きくなるのだが。
「使わないようにしていこう」と「取り除こう」は別、な。 特殊変数 $[ や $* は存在し続けているおかげで、既存の スクリプトを書き換える必要がなかった。 エリートは過激にコトを考えすぎるので困る。
UTF8フラグは存在し続けることで再発明を防いで欲しい。
テキスト処理関数の数はbytes.pmを見ると分かるようにたいした数ではない。
入力→decode()→処理→encode()→出力 ※decode/encodeを二度がけしてはならない。 基本これだけ。 あとは、複数ある、どの方法でdecode/encode処理をするか。
連想配列についてですが %test("mikan","みかん","ringo","りんご","budou","ブドウ"); foreach(%test){ print "$_<br>"; } これだと全部出力されてしまいます アルファベットの部分だけ出力するにはどうすればいいんですか?
>>748 foreach(keys(%test)){
print "$_<br>";
}
750 :
デフォルトの名無しさん :2011/12/31(土) 20:05:54.57
昨日までファイルを追加書き込みモードでオープンすると 古いファイルが勝手にリネームされて困ってたのが 今実行したらファイルの最後に追加されるようになった。 ソースを全くいじってないのにうまくいってしまった どういうことですか? if ( !open( DATAFILE, ">>", $input ) )
>>751 正直にいっとこう。
なんかいじったんだろ?な?
こりゃなんか絶対にいじったなwww
754 :
751 :2011/12/31(土) 21:43:36.17
いじってないです。 もうひとつの謎が急にpathが通ったことです。 ActivePerlをインストした時に環境変数のpathを通したはずなのに ”perl”では認識されずに”c:\perl\bin\perl”と毎回打ってたのが 再起動もせずに休止状態から復帰しただけで”perl”で認識されました。
まsかインストしてから一度も再起動しなかった…… とかじゃねーーーだろなwww
756 :
754 :2011/12/31(土) 21:50:49.73
インスト直後に再起動しました。
>>754 落ち着いてもう一度思い出すんだ。
環境変数はシェル毎に異なりうる。
設定が行われる前に開いていた違うシェルでは当然反映されない。
また再起動しなくても環境変数は反映させることができる。
古いファイルがリネームというのはどういう状況なのか
>>751 ではよく分からない。
一行だけじゃなくて、動くコードが無いと判断しようがない。
758 :
デフォルトの名無しさん :2012/01/04(水) 15:38:08.25
760 :
デフォルトの名無しさん :2012/01/05(木) 12:45:23.83
配列はunshiftで追加できるけど 連想配列を先頭に追加するにはどうやったらいいんですか?
761 :
デフォルトの名無しさん :2012/01/05(木) 12:46:35.75
連想配列に連想配列の要素を追加するという意味です
連想配列に前も後ろもないですよ
763 :
デフォルトの名無しさん :2012/01/05(木) 13:50:51.47
%todoufuken("toukyou","東京","chiba","千葉","gumma","群馬"); $todoufuken{'hokkaidou'}="北海道"; foreach(keys(%todoufuken)){ print "$todoufuken{$_}<br>"; } ソートしないで北海道を最初に表示させたいんですがどうすればいいんですか? keysはどういう順番で表示されるのかわかりません
my @todoufuken = ( {k => 'toukyou', v => '東京'}, {k => 'chiba', v => '千葉'}, {k => 'gunma', v => '群馬'}, ); unshift @todoufuken, {k => 'hokkaidou', v => '北海道'}; for (@todoufuken) { print $_->{v}, "<br>"; } とか。(あまりすっきりはしてないが)
自分のIPアドレスやホストを取得するにはどうすればいいのでしょうか?
hostname は Sys::Hostname の hostname() ip は IO::Interface::Simple でとればいいんじゃね Windows だとどうなるか知らないけど あと、手元の環境では、IO::Interface::Simple だと IPの振り方によっては2つ目以降のIPを取れないことがあるっぽい
Perl以前の質問、CGIの質問、どっちにしてもスレ違いなんだなあ
>>769 hostname も変な環境変数しか出力されません
>>771 参考のためにどう検索したか教えて下さい
>>772 参考になりました
ありがとうございました
テキストファイルを開くとして そのファイルを利用する部分から抜けたら 確実に閉じられるような書き方・関数などはありますか? こう書いておけば、途中でいきなりlastとかreturnとかしちゃってても その部分から出る際に自動的に閉じてくれる、みたいな感じです
close
open my $fh, ... で開いてれば $fh のスコープが終わると同時に自動クローズされる それでも本当は毎回 close $fh or die $!; とかするべきではあるけど
そういうfuckな話が二ヶ月ほど前にあった 堂開いたらいいか どう作ったらいいかってな話が 際限なくソースがのびてグダグダになってabonしそうなクソが出来上がった 過去グロ嫁
要するにこんなことがしたいだけです。
Perlじゃ簡単にできないんですね。
http://dev.classmethod.jp/etc/p3210/ The try-with-resources Statement
リソースを含めたtry文
プログラムが終了した際にクローズされていなければならないリソースを
try文に含めることができるようになりました。これらのリソースは
ステートメント終了時にクローズされることが保証されます。
>>777 >>779 ありがとうございます、これで安心して開けます
>>777 さんの最後が「閉じるほうも or die したほうが良いの?」と
ちょっと気になりましたが
>>779 さんのサイトからclose()で偽を返す場合について確認しました
パイプは分かるのですが
PerlIO層がエラーを返す場合ってどんな場合なんでしょう?
>>779 確かにその類のことがやりたかったことに違いはありませんが
煽り目的の成り済ましはやめて下さい。
うああレスアンカー間違えてる!
ええと…感謝とサイトは
>>781 さんへ、です…
初心者ですが詰まってしまいヘルプお願いします。 1,2,3,4,5 aiu,eo,kaki,ku,keko と書いてあるdata.csvを用意しておき、これを使って新しくnewfile.textを作成して、その内容を こんにちは こんな 1 感じに 2 文字を 3 挿入 4 したい 5 こんな aiu 感じに eo 文字を kaki 挿入 ku したい keko としたいと思っています。formatを使ってやったところ、@<<<<< の長さが固定されてしまい、 csvファイルに描いてある文字列の長さによっては不必要な空白が入ってしまいます。 これをうまく回避するにはどうしたらいいでしょうか?
perl -nle 'use List::MoreUtils qw/zip/; print zip @{[qw(こんな 感じに 文字を 挿入 したい)]}, @{[split(/,/)]};' data.csv > newfile.text
>>782 > PerlIO層がエラーを返す場合ってどんな場合なんでしょう?
書き込んでいてcloseされると、バッファフラッシュでwrite(2)が呼ばれて、そのエラーが返ることがある。
よくネタにされるのが、デバイス領域が足りない(ENOSPC)。
この辺りはCと同じ。
>>785 ありがとうございます。しかし高度すぎて理解するのに時間がかかりそう。がんがります
>>786 MySQLの勉強してたんですけど、tableに一気にデータ入れたくてそれをperlでやってみようとしたらドツボにはまりました。
作ったのは以下のようなスクリプトなんですが、@<<<<<を長くすると不必要な空白が入ってしまいます。
------
open (NEWFILE, "> newfile.text");
open (DATA, "data.csv");
@data = <DATA>;
$length_data = @data;
for ($record_num = 0; $record_num < $length_data; $record_num++){
#print ("@data[$record_num]");
($id, $user_id, $title, $body, $created, $joined) = split(/,/,@data[$record_num]);
write NEWFILE;
}
close (NEWFILE);
close (DATA);
# Start Format
format NEWFILE =
insert into posts (id, user_id, title, body, created, modified) values (null, '@<<', @<<<<<', '@<<<<<', '@<<<<', '@<<<<<');
$user_id, $title, $body, $created, $joined
.
# End Format
---------------
それで、Formatのほうでは、@<<などの文字をVuser_idVなどの文字にして、writeのあとで文字置換しようとしたんですが、write NEWFILEの下に
while(<NEWFILE>){
s/Vuser_idV/$user_id/;
}
と書いてみたんですがダメでした。forループの中でその都度置換すればいいかと考えたんですが正しいやり方とかありますでしょうか。
回答じゃなくて申し訳ないけど >open (NEWFILE, "> newfile.text"); 今時どんな本でこういう書き方してるのか気になる あとformat, writeとか使ってる人なんて十数年ぶりに見た
いくら丁寧な文章を書いても「がんがります」で台無し
あと、スクリプト見る限りではSQL命令をずらずら並べたテキストファイル作って mysqlコマンドにリダイレクトしようとしてるのかな? その書き方じゃ普通にSQLインジェクションに弱くて危険だから 今からでも遅くないのでDBI使うようにするのをおすすめしたいです
「すいません」
>>791 「す『み』ませんだろゴルァ」
>>791 はいはい先生は偉いお方だから口悪くても許されますねー
手元にあるのが95年初版のLearning Perlなんだけど、やっぱり古すぎたのか…。どうしよ
下記の3つのprintのうち、真ん中のprintの出力理由が分かりません。 どのように動作しているのでしょうか? よろしくお願いいたします。 #!/usr/bin/perl my $str = "abc"; print utf8::is_utf8($str)? 'flag' : 'no flag', "\n"; # no flag print "x" . utf8::is_utf8($str)? 'flag' : 'no flag', "\n"; # flag <- ? print "x" . (utf8::is_utf8($str)? 'flag' : 'no flag'), "\n"; # xno flag
print(("x" . utf8::is_utf8($str))? 'flag' : 'no flag', "\n"); と等価になってるのでは?
print 3+5 . "km"; と print (3+5) . "km"; どちらも8kmと表示されるものかと思いましたが違いました。 結合順が変わってしまうのは何故なのでしょうか? 前者では8kmと表示されますが、 後者では3+5とprintが先にくっついてしまい8と表示されてしまいます。
あ、関数名()が関数呼び出しの基本だからですね。 print(3+5)という形があり、それに. "km"している形ですね。 printのカッコ省略に慣れて見えていませんでした。 スレ汚しスマソ
>>788 なるほど。
その辺まで突き詰めると、もうPerl固有の話ではなくなりそうですね。
色々調べてみます、ありがとうございました!
|a.あいうえお | かきくけこ という文章のあ~そまでを抽出する正規表現を書きました。 m/^a.(.*?)\n\n/ms 思い通りに動きました。ここに例外を加えたいです。それは |a.あいうえお | ↑ここに全角スペースがある場合はマッチさせないという動作です。 否定戻りよみを使い右のようにしました。 m/^a.(.*?)(?!< )\n\n/ms しかしこれでは上記の文がマッチしてしまいました。 .*?が全角スペースを含む長さまで伸びた際にマッチするからだと思います。 どのように書けば期待する動くを実現できるのでしょうか?お知恵をお貸し下さい。
>>802 レスありがとうございます!
なるほど否定先読みを使ったアプローチをすれば良かったのですね。
マッチさせたくないケースは1行目より下に全角スペースだけの行がある場合なので
例えば
d.イロ ハニホヘト
チリヌルヲ
のように途中にスペースを含むケースはマッチさせたいです。
なので(?:(?!\n ).)*?)としたらうまくいきました。
本題からそれますが、このHERE演算子の使い方は初めて見ました。こういう使い方も出来るんですね。
示してもらった具体例をコードにするための方法としてぴったりしていると感じました。
趣味とはいえそこそこ長い間Perlを触って来ましたが、
まだまだ知らない事だらけのような気がしてきました。リャマボン買ってみようかなー。
>>804 折角 /m 付けてるんだからその場合 (?!\n ) より (?!^ ) の方が文意を読み取り易いかもな。
一方ロシアは grep や next if を使った
807 :
デフォルトの名無しさん :2012/01/08(日) 16:45:11.65
アレイを[-1]でアクセスしている古いスクリプトがあるのですが、 これはどういう意味でしょうか? (最終要素?) perl 5.14で動くようにする簡単な記法も教えてちょーだい。
自分で試してから聞け屑
動かねえなら問題はそこ以外だ
810 :
デフォルトの名無しさん :2012/01/08(日) 16:51:53.54
古いperlがないから聞いたんだけど、インストールしないで試す方法を教えてちょうだい。 インストールするくらいなら聞かずに試してるわ。
$ perl -le '@a=qw(f * c k);print $a[-1]'
>>809 抜き出すと、↓これで
my @a = ();
print $a[-1]->[0];
エラーメッセージは
Modification of non-creatable array value attempted, subscript -1 at x.pl line 2.
>>811 なぜか
print $a[-1];
はOKで
print $a[-1]->[0];
はエラーなのですよ。
それで、古いperlは[-1]で最終要素にアクセス出来たのでは? と予想したんだけど。
require 5.005;と書いてある。^^;
>>808 古いperlを入れずに試す方法を早く教えれ。
C言語の配列とアドレスを百ペン嫁
$ perl -le '@a=([],[],[qw(a h o)]);print $a[-1]->[0]' エラーの意味も分からないのねかわいそうに
最新バージョンでも15年前のスクリプトが基本的にそのままで動くように後方互換を維持してるのがperlだというのにな。良くも悪くも。
どーも。それじゃ[-1]は5.14でも最終要素ってことか。 原因は別のところか面倒だなあ。
馬鹿なくせにその自覚のまったくない質問者ってイライラするね。 自戒自戒…
バカっていうか、質問文が完璧だったという前提があるかのような自信はどこからくるのっていう、、、、 とにかく前提を省略しまくった質問は勘弁だわ、、、、、
>>823 世の中にはおまえみたいな気違いもいる、といういい見本になってくれてありがとう。
perlref読めとしか……
826 :
デフォルトの名無しさん :2012/01/10(火) 17:59:44.50
formで入力したパスワードをこのようにhiddenで渡していくのは好ましくないんでしょうか? print "<INPUT TYPE=\"hidden\" NAME=\"pass\" VALUE=\"$FORM{'pass'}\">"; crypt関数っていうの使った方がいいのですか? これだと元に戻すのができないんだよな
>>826 >>827 に加えてついでに書いとくと
> formで入力したパスワードをこのようにhiddenで渡していくのは好ましくないんでしょうか?
好ましくないどころか根本から大間違い
829 :
デフォルトの名無しさん :2012/01/11(水) 01:19:01.38
でも結局はhiddenで渡していくしかないよな
なわけねーだろ お前セッションて知らないのか?
833 :
デフォルトの名無しさん :2012/01/11(水) 10:08:24.32
確認画面でパスワードなどをhiddenにしておくのがだめって HTMLソースで見られるか、外部打ちでデータ書き換えできるからってことだろ? そんなことするやつなんておらんだろ。 仮にいたとしてもパスワードをcryptで暗号化しておけば見られても平気だし リファラ調べて外部打ち禁止にすればいいだけだからな
>>832 で徳丸本薦めてる一つ後のレスが「IPA()とベッタリの徳丸本なんかクソクラエ」と言わんばかりのダメダメ論理で泣けてくる
てゆか2chで徳丸本読んでる奴って100人もいないんじゃないか?
>>833 一体お前いつの常識に基づいてプログラムしてるんだ
手元にあるテキストは90年代に出版されたやつじゃないだろうな?
あとWebの基本知ってればReferer改ざんなんて誰でもできるぞ
>>834 すまん、これで最後にする
あとはセキュリティのセの字もわからん奴が暴れ続けないことを祈りたい
>>835 90年代でもそんなひどい本は売ってなかったろ さすがに…
>>834 ゴミカスって言った奴が真のゴミカス と昔から決まっている
バカがなんかほざいてます
Windows7 32bit + ActivePerlでGUIプログラミングをしたい人は gtk2を使うべきなんですか?
丸得本ってどれのことですか?
841 :
デフォルトの名無しさん :2012/01/12(木) 12:29:13.88
結局セッションを使ったとしてもセッションIDをhiddenに埋め込むわけだから やっていることはほとんどかわらんな
>>839 あ、俺も聞きたい。
Tkいじってて、GUI32:+LOFTに手を出してみたらLOFTがダメで、
wxPerlに手を出そうとして資料の無さに絶望してTkにもどった
趣味でいじっているだけの人間だけどGTK+ってどう?
なぜTkのままじゃいけないのか自問しました。
>>840 ママゾンの和書のページに「本のお買い得情報・バーゲン」っていう
のがあります。
Tkは見た目が古い
時間がたてば古く見えるのは当然だと思うけど、これからも見た目を 新しくするためにスクリプトを書き直したり、新しいモジュールの 使い方を覚えたりするの?その労力を何か創造的な方面に...
>>847 TkはPPMでいれられない
5.14.2用どっかあるとこ知らない?
849 :
デフォルトの名無しさん :2012/01/15(日) 15:53:25.92
@hobby_list=("ゲーム","アニメ","パソコン"); foreach(@hobby_list){ print "hobby=$_"; } これの結果が ゲーム、アニメ、パャRンになってしまいますが ファイルにゲーム,アニメ,パソコンと書き込んで open(IN,"hobby.dat"); $line = <IN>; close(IN); @hobby_list = split(/,/,$line); としてprintした場合ちゃんとパソコンと表示されますがこれはどうしてでしょうか? また文字化けをパソ\コンと手動で文字化けを直すのではなくて 自動で直す方法を教えてください
855 :
デフォルトの名無しさん :2012/01/15(日) 18:19:01.35
>>851 ソースコードをEUCにするとソースコード中の全角文字が読めない文字になるので
好ましくないだからshift-jisでやってる。
パソコンをパソ\コンというように文字化けしないように
自動的に\を付けるようにするようにしたいのである。
utf8使えよアフォwwwwwwwwwwwwwwwwwwww フォフォフォwwwwwww
>>849 前者は、まずソースファイル上でメタキャラクタとして認識された後に、データとして格納されている。
後者は、最初からデータとして扱われている。
なんでutf8で書かないのかな?
(エディタの問題じゃ…?
(ヴァカなのか……?
>>855 諦めてuse utf8とuse Encodeで処理したまえ。
855じゃないけど、utf8嫌いだから、shiftjisを細工なしに扱えるperlが欲しいや…
そんなこと言うとまたjacode.plとかSjis.pmとかいうゴミをドヤ顔で紹介する人が来ちゃうでしょ!
,.へ ___ ム i 「 ヒ_i〉 ゝ 〈 ト ノ iニ(() i { ____ | ヽ i i /__, , ‐-\ i } | i /(●) ( ● )\ {、 λ ト-┤. / (__人__) \ ,ノ  ̄ ,! i ゝ、_ | ´ ̄` | ,. '´ハ ,! . ヽ、 `` 、,__\ /" \ ヽ/ \ノ ノ ハ ̄r/:::r―--―/::7 ノ / ヽ. ヽ::〈; . '::. :' |::/ / ,. " `ー 、 \ヽ::. ;:::|/ r'" / ̄二二二二二二二二二二二二二二二二ヽ | 答 | j c o d e . p l │| \_二二二二二二二二二二二二二二二二ノ
use encoding 'cp932';
以下、「
>>865 空気嫁」が1000まで続きます
文字コードを攻略する一番の近道は utf8フラグを理解することだってわかってないのかね? どうせ、sjisだけ使う、euc-jpだけ使うと言ってても 結局はライブラリの制限によってutf8フラグに かかわらないといけないだろう? ほんの数時間、ちゃんと勉強すれば分かるはずのことを避けて、 逆に時間がかかってたら意味が無いだろう。 それとも認めるのかい? 自分がutf8フラグを理解出来ない馬鹿だってことを。
Windows環境ならuse utf8で標準入出力をcp932にした方が早い。
まあ、どおぉ~してもShift JISで処理したいまたは処理しなければならないなら、 がんばってjperlでも探してくるしかないな。
use encoding qw(cp932); で十分。
>>869 それじゃだめだろ。
お前、use encodingの意味わかってないな。
だ~か~ら~、ちゃんとutf8フラグを勉強しろと。
シフトJISを使うときになぜutf8フラグ必要になるのかまるで 共感できない場合は require 'jcode.pl'; @hobby_list=("ゲーム","アニメ","パソコン"); foreach(@hobby_list){ jcode::convert(\$_,'sjis','sjis','z'); print "hobby=$_"; }
>>871 さらに
open(IN,"<:encoding(cp932)", "hobby.dat");
にすればおkじゃね?
そんなバッドノウハウ覚えるぐらいなら、 普通にutf8フラグを理解すれば良い。 遠回りすんなや。
は?decode()、encode()は基本だけど PerlIO触るのも別にバッドノウハウじゃねーだろ
utf8フラグが普通じゃない罠。
utf8フラグはPerlで文字列触る基本となってるのは事実。 それ以外の推奨されないようなやり方は、自分がいいなら使えばいいけど、 初心者に進んで教えてるのはよくないな。
1レスで理解できるコピペなかったけ?あれ出せばいいじゃん
1レスで理解できるutf8フラグ utf8フラグとい名前がまずかったね。 文字列フラグなどという名前だったらよかった。 文字列フラグはPerl固有のものだから Perlコード外部から渡されるのは文字列ではない。 文字列でなかったらなにか?それはバイナリ。 バイナリを文字として扱いたければ、文字に変換しないといけない。 それがdecode。 ではソースコードに書いてあるのは、文字かバイナリか。 それはuse utf8を使えば文字で、そうでない場合はバイナリ。 話はこれだけ。 (やばいぞ、この流れw)
CPAN本でdecode済みの文字列を"文字列"って表現してたのは良かったね(""含めて)
同意できない
誰かのご機嫌をとりながら書かなきゃいけないプログラミング言語って Perlの他にもあるのかな?
>>883 えっ、Perl は言語の中ではご機嫌を取らないほうだろ?
悪いこと言わない。 よっぽどの理由が無い限りコードはutf8で書いときなよ。
うちは出来上がるデータが命だから、そういうことはできないのん
ちょっとよく分からん……
文字コード変換がロスレスだと考えるのは夢想的すぎる
>>888 cp932とeucjpms使わんから…
扱うデータがシフトJISの場合、コードに書かれているutf8による リテラルと比較するにはどちらかをコード変換して合わせる必要が ある。まあ、推奨の方法によれば外部データのシフトJISをutf8に 変換(decode)するわけだが。
891 :
デフォルトの名無しさん :2012/01/15(日) 23:53:59.04
ウインドウズでPerlやりたいんですが ストロベリーパールっていうやつはどうなんですか??? リナックスみたいに ウインドウズでもPerlとかCPANモジュール使いたいんですが お勧めの構成教えて下さい なんか crygwinっていうやつクソでした Linuxとまるっきり同じ感じにしたいです ストロベリーパールっていうやつは CPANモジュールとかダウンロードできるような機能あんですか??? 教えてください
じゃあlinux入れれば
893 :
デフォルトの名無しさん :2012/01/16(月) 00:00:05.86
オンラインゲームができなくなるからいやです
誰がお前のPC上のWindows消せと言った… てゆか板違いだし英語もろくに書けないし何なの一体
895 :
デフォルトの名無しさん :2012/01/16(月) 00:15:02.20
>>891 クノーピクスでも使っていやがれ
CD-ROMで起動できるfuckな環境だっぜ
colinuxつかって環境作ってる。便利。 すれち、すまぬ。
899 :
デフォルトの名無しさん :2012/01/16(月) 00:56:21.65
文字化けする文字の後ろに\をつけるのだと難しいので 全角文字すべての後ろに\をつけるようにした方が簡単だな
質問側も回答側もなんでこう…90年代から進歩してないんだ…
>>897 iconvインスコして、以下のバッチを作って、適当に名前付けて、パス通しておけばいいよ。
@echo off
perl %* | iconv -f utf-8 -t cp932
という私もcolinux突っ込んでる。
902 :
デフォルトの名無しさん :2012/01/16(月) 08:39:53.80
>>900 おれはいろんなperl入門のサイトで見て勉強してる
とほほとかKENTとか
釣れますか?
一人釣れたようですね
905 :
デフォルトの名無しさん :2012/01/16(月) 12:29:29.87
メモ帳でソース書いてるけど EUCで保存って項目がないわ
906 :
デフォルトの名無しさん :2012/01/16(月) 12:39:04.00
$str="aaa\bbb\ccc"; $str =~ s/aaa/www/g; aaaをwwwに置換はできますが $str =~ s/\/www/g; \をwwwに置換しようとするとエラーになります どのようにして\を置換できるのか教えて
\\
正規表現もだけど、もう1行目の時点で期待してるであろう文字列とは違ってるよね
バカしかいないのか
910 :
デフォルトの名無しさん :2012/01/16(月) 15:53:28.12
>>906 は解決しました
でも$str="あ表あ";
$str=~s/あ/www/g;は置換できるけど
$str=~s/表/www/g;はエラーで置換できませんでした
これの置換方法を教えてください
以下シフトJISの話題でループ
とりあえず、Windows環境でPerlやるヤツはファイルの先頭に なにも考えずにコレを書いて、utf8で保存だ。 -- ここから -- #!c:/perl/bin/perl.exe use strict; use warnings; use utf8; binmode(STDOUT, ":encoding(cp932)"); binmode(STDIN, ":encoding(cp932)"); binmode(STDERR, ":encoding(cp932)"); -- ここまで --
>>910 CP932で 表/ は(\x95,\x5C,\x2F)の並びになる。
\x5Cはバックスラッシュ(\)なので、次の文字のスラッシュ(/)はクォートされ、
リテラルキャラクタ扱いになる。
これを防ぐには、"\\"というようにバックスラッシュを二つ重ねて、
バックスラッシュをリテラルキャラクタにする。
つまり、表\/ (\x95,\x5C,\x5C,\x2F)の並びにすれば良い。
よって、
$str=~s/表\/www/g;
これは、CP932の文字列をバイナリ列のまま扱うことに起因する問題なので、
>>7 を守れば問題は起きない。
参照:
http://perldoc.perl.org/perlre.html
914 :
デフォルトの名無しさん :2012/01/16(月) 17:55:11.13
メモ帳でANSI形式で保存して $str="パソコン"; &jcode'convert(*str,'euc'); print "str=$str";としたところ文字化けしてしまいました、 ちゃんとEUCに変換したのに結局はパソ\コンとして\を追加しなければだめでした EUCならば文字化けしないはずじゃなかったのですか? もちろんHTMLのMETAタグはEUC-JPにしてます
916 :
デフォルトの名無しさん :2012/01/16(月) 18:11:20.47
なるほどわかりました
917 :
デフォルトの名無しさん :2012/01/16(月) 20:14:53.13
perl5.8以降のopen関数で書き込む場合ファイルハンドル、文字コード、ファイルパス の3つの引数が指定できるらしいけど それ以前のperlでは書き込みファイルの文字コードはどうやって指定するんでしょうか? 普通はそのまんまopenでファイル作るとsjis形式になっているのでそこにEUCデータを書き込むと ファイル開いたとき全く読めない文字になっているので
このメンバーで1000まで行こう、な
トロロベリーパールはどこにありますか?
>>917 古くはjcode.plなどを使って文字コードを変換してから書き出した。
その後、PerlがPerl5になるのにともない、Jcode.pmがリリースされ、 オブジェクト指向による文字コード変換が行われるようになった。
さらにその後、さすがのゆとり世代でもご存知かと思われるが、 Encodeモジュールというものができ、日本語だけではなく、世界中 の文字を扱えるようになったと一部では信じられている。
以下、Encodeの酸鼻が続く
>>917 はPerl5.8以降を使ってはいけない会社で働かされているんだろうか
いま、うちの会社をばかにしましたか?
>>885 よっぽどの理由があるのでsjisで書かせてください。
俺も長いことやってるけどUTF-8なんて聞いたことないよ、 おとぎ話の中でしか。
928 :
デフォルトの名無しさん :2012/01/16(月) 21:27:47.04
素直にutf8でやったほうが 早く終わるよ。 今ではutf8を使ったのほうが ノウハウ多いしね。
どうしてもjcode.plでハングルを扱いたいです。 よろしくお願いします。
ハングルを扱うのならjcode.plは不要と思われ。素のperlだけで扱える。 コードは何から何に変換するつもりなの?
>>929 プログラマにそんな選択の自由与えられていないだろ。
>>933 社長様がPerl4で書けなどと強要する脳内ブラック企業はもういいです
社長と俺しかいないのかよっ(しかもPerl4て、ぷぷ)
重要性の比較 インタプリタの互換性 < スクリプトの互換性 < データの互換性 な。スクリプトはある意味、データだからな。
・大規模データ ・分散システム ・無停止システム ・さらにこれらに付随する多数の小規模システム そう簡単にUTF-8にできるわけじゃないし、そうする動機もない
東電みたいなこと言うなよ。
>>937 そんなのをPerlで作ってるところなんて無いからw
webアプリのようなmod_perlとか使うなら大規模なシステムもperl使えそうだけど、 それ以外でなら、Javaとかの方がいいかもしんない
>>940 こういうとき絶対に「Java上で書かれた言語」とかじゃなく「生のJava」をお勧めされるよねw
コードをutf8で書いたらデータの互換性が無くなるとか 書き方はいくらでもあるだろ
943 :
デフォルトの名無しさん :2012/01/17(火) 12:15:39.86
utf8とかいうの試してみたけどエラーで表示できませんでした 環境はatciveperl5.8でwin7でブラウザはIEです ちゃんとterapadとかいうエディタでソースコードをUTF8保存しました どこがだめなんでしょうか? 結局sjisかeucでやるしかないのかな? use utf8; binmode STDIN,":encoding(cp932)"; binmode STDOUT,":encoding(cp932)"; print "テスト";
945 :
デフォルトの名無しさん :2012/01/17(火) 12:32:10.47
>>943 ソースにBOMついてない?
一応レス。
946 :
デフォルトの名無しさん :2012/01/17(火) 12:33:52.16
>>944 IEでこのブラウザでは表示できませんってエラーがでてくる
えっ?コマンドラインじゃないの? 本買ってきて基礎からやった方がいいよ。
948 :
デフォルトの名無しさん :2012/01/17(火) 12:39:44.90
>>943 terapad はutf-8n指定しないとBOM
が付くみたいだから、それためしてみ。
>>947 そしてどこで買ったか知らないが「表紙が赤い」オライリー本で勉強するいつものパターンですね、わかります
ブラウザはIEです、ってまず意味がわからん。なぜIEが出てくる。 もしCGIの話をしてるんだったらスレ違いだ。
951 :
デフォルトの名無しさん :2012/01/17(火) 13:07:22.28
>>943 はCGIとPerlの区別もついてないゴミクズ
よく恥ずかしくないなこのゴミ
>>1 すら読めない池沼はさっさと回線切れや
952 :
デフォルトの名無しさん :2012/01/17(火) 18:50:33.75
スレを無駄に消費しないでください 分かる方のみ回答をお願いします
分かってる人しか回答していない事実
1000に届くついでに ・Perl4スレ ・Perl5.005スレ ・Perl5.8以降スレ に分割すればいいのかと夢想したが、そうすると話題がないので スレが伸び悩む。
5.8以前は全部いっしょくたでいいよ それよりモダンなPerlの書き方に関するスレ立てたいんだが閑古鳥必死かね…
それは立ててみないと分からないので try{} すべし
モダンPerlだのユニコードだのutf8フラグだのと机上でトップダウン で考え出されたものは・・・・・・だからね。
>>959 お前が無知なだけw
お前の知ってる方法で、世界中の言語を
扱ってみろよ。
世界中の言語を扱[わえ]ないからw
世界中の言語を扱うっていうのはどういうことを言っているの? length 関数と substr 関数が使えれば世界中の言語を扱っている っていうことなの?プログラマ自身が読み書き会話できないと その言語を扱うっていうのは無理なんじゃないかと思うんだけど。
>>962 たとえば受信したメールを
文字化けしないように表示すること
内容を理解する必要はないわなw 文字化けしないように表示できればいいだけだな。 そんなこともわかんないのか?w
>>961 扱ってみろと言ってるだけ。
練習すらできない?
文字を扱うのと言語を扱うことの区別がないとはw もうじきクラス替えみたいだから、元気でな
高専あたりにゃクラス替えはないから これから最長4年間ほどは耐えなきゃならんな まあガンバれYO!プークスクス
揚げ足のつもりはない。気が向いたらこっちのスレにも顔出してな。
揚げ足取りなんてつまらないことやめて、 世界中の文字コードをちゃんと解釈して表示できるものを jcodeなんかを使ってやってみせてよ。 Encodeでしかまともに実現できないでしょ。 大幅に時間がかかる方法は却下。
1.第一に世界中の言語を扱うことがない。大事な主張なのでこれで2度目な。 2.表示の問題はフォントや表示機器の問題。 3.jcode(jcode.plのこと?)は変換のためのものだから表示うんぬんに関係がない。 4.文字が扱えるけど言語は扱えないっていうのは例えば、数式の記述にギリシア文字が使えるが、ギリシャ語を扱えるわけじゃないっていう例がある。でもそれは恣意的な例に思える。例えばその言語の禁則処理はできなくてもいいのか?それで言語を扱えてると言えるのか? まあ、世界中の文字を扱えるって言いたかったのかもしれないとエスパーするが。
扱うことがないかは問題ではない。 やってみせろと言ってるだけ。 練習もできないのか?
結局「いままでこの方法でやって来れたから」 できたから、現在主流になってる方法がつかえなく いつまでも古い問題に振り回されてるんだよな。 勉強する気がないならプログラマ向いてないよ やめたほうがいい。
お前のために練習できない。 それと中学はやっぱりクラス替えあるってよ。
> お前のために練習できない。 日本語も不自由なようだw
出来る奴と出来ない奴 出来ない奴は、やらない理由を探す癖がある。
そういう実験はお前がやって自己満足してろよ、おれは邪魔したりはしないよ。
実験じゃなく、実用で使ってる。 つか世間的にはそれが一般的 メンテが続いているほとんどのCPANモジュールも きちんと対応されてる。 お前と俺とでは格が違うよ。 俺はやった上で言ってる。 お前はやらない理由を探してる。
だから、実験でも実用でもお前の邪魔したりしないから、落ち着け。 そんなに向きになんな。
えらい、えらい、おまえはえらい、おれはバカだ。そうだ、そうだ。 これからもおれはお前の邪魔したりはしないから、向きになんな。
>>979 じゃまとかなにか勘違いしてるんじゃないのか?
俺は、お前以外の人に、最新のPerlはEncodeモジュールを
使うのが標準と伝え、お前のように勉強しない奴が
どれほどダメな人間かをこうやって伝えてるんじゃないか。
やってみろといってもやらない、
やらない理由探し、俺には必要ない。
言い訳ばかり、お前のしゃべる言葉すべてが
恥ずかしい言葉として、他に人の目に写っている。
それこそが俺がこうやってレスしている目的なんだがw
ようし、これで1000までいこうぜ!
邪魔どころか、俺の計画通り ダメ人間っぷりを晒してくれて 手伝ってくれて、どうもありがとうって感じなんだがねw
そういえば、お前仕事は見つかったのか?
>>984 きっとその件についても
やらない理由を探してるよw
>>985 すまん、残り少なくなってきたが分からないので解説よろ。
>>986 仕事さがしてないってことだろw
Encodeモジュール程度でさえ、やらない理由を言ってるやつだぞ
仕事探しもやらない理由を言うばっかりでやってないに決まってるw
うめ
うめ
うめ
うめ
うめ
うめ
うめ
うめ
うめ
うめ
この世界はおれたちの心のようには美しくなくて、ときどきめげそう になることがあるな。でもな、生きていればきっといいことがあるから、 あきらめるんじゃないぞ。
うめ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。