Perlについての質問箱 ..
116:109
06/12/29 18:24:42
>>108=115
乙!
WindowsのActivePerl初心者による
似たようなQ&Aの再生産を回避するために
テンプレートを設置しようというのはとてもすばらしいッス!
でも、
・テキストモードとバイナリモード
・ASCIIとマルチバイトコード
・日本でのマルチバイトコードは複数の種類が存在すること
・UTF-8以外でのマルチバイトコードの扱い
を理解してないと結局はすぐにつまづくと思う。
でも、これを丁寧に説明してるとテンプレートで紙面が足りないから
結局「http://〜を読んで」、「binmode, Encodeでググると吉」
ってなっちゃうんだよね。。。
次ぎスレに115のテンプレを追加して様子を見るのがいいのかな。
117:デフォルトの名無しさん
06/12/29 18:40:57
両方うぜーよwebprogでやれ
118:109
06/12/29 21:07:36
>>117 うぜぇのは同意だけど、ウェブはかんけぇねだろバーカw
119:デフォルトの名無しさん
06/12/29 21:10:13
レベル的に物凄く関係ありまふ
120:デフォルトの名無しさん
06/12/29 21:15:52
くだすれPerlだな
121:デフォルトの名無しさん
06/12/29 21:24:28
117のスルー力たんないからスレが荒れたな。
スルー力身につくまでおまえがROMるかwebprog行ってろ
122:デフォルトの名無しさん
06/12/29 22:30:03
>>104
Jcode.pmにパッチあててなくね?
123:デフォルトの名無しさん
06/12/29 22:46:19
するーかって何だよ
スルメイカかよ
124:デフォルトの名無しさん
06/12/29 23:08:30
>>123
どうも「スルーする力(ちから)」という意味みたいだな。
それより、>>117にぴったりのスレがあるぞ。こっちで活躍したらどうだ
【Perl上級者コーナーPart01】
スレリンク(php板)l50
125:デフォルトの名無しさん
06/12/29 23:24:05
ゾーキャスラー力を思い出す流れだが、まぁ通じないだろう。
126:107
06/12/30 00:21:53
>>112,113
できました!ありがとうございましたm(_ _)m
127:デフォルトの名無しさん
06/12/30 09:48:58
URLリンク(www.google.co.jp)
スルーカ の検索結果 約 173,000 件中 1 - 10 件目 (0.03 秒)
128:デフォルトの名無しさん
06/12/30 09:53:09
Срука
129:デフォルトの名無しさん
07/01/01 03:05:23
kent-web の sunbbs.cgi を改造しまくって使っています。
記事番号が奇数番号のときと偶数番号のときとで、
交互に違う情報を入れたいと思っているのですが、
perl で偶数と奇数を判別するのってどうやればいいんでしょうか?
130:デフォルトの名無しさん
07/01/01 03:07:15
%2
131:デフォルトの名無しさん
07/01/01 03:14:40
?
132:デフォルトの名無しさん
07/01/01 03:22:34
>>129
2で割った余りが0なら偶数、1なら奇数と判定すればOK
133:デフォルトの名無しさん
07/01/01 07:26:19
1 と and とって1ビット目が 0 か 1 かで判断してもおk
134:デフォルトの名無しさん
07/01/01 15:02:29
>>132-133
例文でお願いしますです。orz
135:デフォルトの名無しさん
07/01/01 15:12:55
>>134
この程度のこともわからないのに
>kent-web の sunbbs.cgi を改造しまくって使っています。
なのか
136:デフォルトの名無しさん
07/01/01 15:22:34
>>134
%2
137:デフォルトの名無しさん
07/01/01 18:38:54
巨大な数字ってどういうビット構造なんかな?
$a = 234;
if ( $a & 1) { print "奇数" }
else { print "偶数" }
138:デフォルトの名無しさん
07/01/02 00:43:33
詳解 正規表現
をかったんだよお年玉で
139:デフォルトの名無しさん
07/01/03 10:43:45
WINDOWSの鯖でファイルが書き込み可能かどうかを判断するにはどうしたらいいんですか?
WINDOWS鯖の場合だと
if (-w $write_file_path) { print "書き込み可能\n"; }というプログラムがが使えないんです
140:デフォルトの名無しさん
07/01/03 11:06:17
>>139 == スレリンク(php板:635番)
マルチなので放置しましょう
141:デフォルトの名無しさん
07/01/03 11:20:32
>>109
>use encodingは弊害がでかすぎるかと…。
kwsk.
今まで、Jcode->new($hogehoge)->sjis; でちまちま変換していた者としては
use encoding という技は新味ですyo.
142:デフォルトの名無しさん
07/01/03 14:25:47
うるう年かどうかを判別するプログラムが課題で出ているのですが
$y=1900;
if($y %4==0){
print "$y is a leap year.\n";
}elsif(($y %4==0) && ($y %100==0)){
print "$y is a common year.\n";
}elsif(($y %100==0) && ($y %400==0)){
print "$y is a leap year.\n";
}else{
print "$y is a common year.\n";
}
これで1900を$yに入れても、うるう年になってしまいます。
1900をcommon year.にするには、どうすればよいのでしょうか?
143:デフォルトの名無しさん
07/01/03 14:35:27
>>142
そういうのは400,100,4の順番に判定するんだよ
144:デフォルトの名無しさん
07/01/03 14:45:24
なんてほのぼのする質問だろう
145:デフォルトの名無しさん
07/01/03 14:52:27
正直に課題って言ったのも好感w
146:デフォルトの名無しさん
07/01/03 15:09:31
>>142
最初の条件 $y %4==0 が、「4で割り切れたら」だから、4で割り切れる数字は、
全てここで引っかかっちゃうよ。
147:デフォルトの名無しさん
07/01/03 17:45:10
(´・ω・)ヤサシス
148:デフォルトの名無しさん
07/01/03 20:54:19
なんでうるう年は4年に一回なのに400と100も判定にいれるの?
149:デフォルトの名無しさん
07/01/03 20:55:00
>>148
それは冗談で言っているんだよな。
150:デフォルトの名無しさん
07/01/03 21:13:58
愉快なスレだな
151:デフォルトの名無しさん
07/01/03 21:22:42
use DateTime;
my $y = 1900;
if (DateTime->new(year => $y)->is_leap_year) {
print "$y is a leap year.\n";
} else {
print "$y is a common year.\n";
}
こうですか? よくわかりません><
152:デフォルトの名無しさん
07/01/03 21:25:31
アッー!
153:デフォルトの名無しさん
07/01/03 21:27:16
>>151
反則です
154:デフォルトの名無しさん
07/01/03 21:31:37
しかし >>142 にはモジュールを使ってはいけないなんて一言も(ry
まあ冗談だろうけど、実際に閏年の判定を書くとしたら >>151 なんだよなぁ・・・。
155:デフォルトの名無しさん
07/01/03 21:41:17
>>149
まあ、今後 90年以上は >>148 が正しいわけだが。
156:デフォルトの名無しさん
07/01/03 21:41:24
でもデフォルトで入ってたっけ?
157:デフォルトの名無しさん
07/01/03 21:50:31
最新のactiveperlには入ってた。
158:デフォルトの名無しさん
07/01/03 22:00:08
>>142の心温まる条件式を眺めてると、質問者に>>151を見て欲しくない気持ちになってきた。
159:デフォルトの名無しさん
07/01/03 22:20:40
4000年で割り切れる年も入れないとね。
160:デフォルトの名無しさん
07/01/03 22:34:26
>>159
どんだけ先の話やねん
161:デフォルトの名無しさん
07/01/03 22:51:30
つ 「このように広く普及するのであれば、もっとちゃんとした設計を施すべきだった」
162:デフォルトの名無しさん
07/01/03 22:59:36
そんなに長いこと使われないだろうと思って作ったソフトが2000年問題とかの原因になったんだよな
1993年使われ続けることも考慮しとくべきだな
163:デフォルトの名無しさん
07/01/03 23:02:58
sub is_leap_year {
$j = shift() + 660;
unless ($j % 4) {
unless (($j - 660) % 100) {
return 0 unless ((($j - 660) / 100) % 4);
}
return 1;
}
return 0;
}
どぞ。
164:デフォルトの名無しさん
07/01/03 23:04:31
だが、心配のしすぎではないか。
165:デフォルトの名無しさん
07/01/03 23:08:42
もうまもなく4000年になろうとしているのに4000で割り切れる年を閏年にすべきか否かは未だ意見の分かれるところだね。
地球の自転が遅くなるからとか言うが。小賢しい。
166:デフォルトの名無しさん
07/01/03 23:10:06
そういってy2kが問題になってたんじゃないか。
だいたい時間を1970/01/01 00:00からの32bit整数であらわすのも心配だな。やっぱり64bitはほしいところだ。
167:デフォルトの名無しさん
07/01/03 23:20:41
符号付 64ビット整数で紀元からのピコ秒数で数えることにすると紀元の前後300年弱しか表せない。
168:デフォルトの名無しさん
07/01/03 23:26:13
perl -e "print scalar(localtime(0xffffffff/2));"
だと「Tue Jan 19 12:14:07 2038」って出るが
perl -e "print scalar(localtime(0xffffffff/2+1));"
だと何も表示されないな
perlは普通にでかい値扱えるから
localtime関数も符号付32bitの上限超えても平気かと思ってたがだめなのか
169:デフォルトの名無しさん
07/01/04 00:32:15
じゃあ紀元から符号付で128bitあれば足りるかな。
170: ◆TWARamEjuA
07/01/04 00:35:18 BE:5336677-BRZ(6700)
コンパイル時に指定してあげれば、、、@64bits
171:デフォルトの名無しさん
07/01/04 09:43:47
ピコ秒って光が30cmしか飛べないんだぜ。
原子時計の精度が1ピコ秒なんだぜ。
どうやって計るんだぜ?
172:デフォルトの名無しさん
07/01/04 13:46:03
>>168
表示はされたけど1901年だったわさ
173:デフォルトの名無しさん
07/01/04 19:54:07
>>171
10E-16sオーダの時間の計測に成功したっていうニュースなら見た気がするが。
174:デフォルトの名無しさん
07/01/04 20:23:27
不確定性原理からいくと、最小の時間単位は何だっけ?
175:デフォルトの名無しさん
07/01/04 20:34:09
プランク時間か?
176:デフォルトの名無しさん
07/01/04 23:41:55
当方perl初心者です。
全角スペースを半角スペースに置き換えたく、
~s/\xA1\xA1/\x20/g
としています。スペースの置き換え動作自体はするんですが、「ァー」や「ぁ!」などの文字列が文字化けするようになりました。
文字コードはEUCです。
コードを調べてみると「ぁ!」は
A4 A1 A1 AA となっており、全角スペースと誤認してしまうようでした。
どのように解決したら良いのでしょうか、教えてください。
177:デフォルトの名無しさん
07/01/04 23:49:59
require 5.8.1;
use encoding 'euc-jp';
178:デフォルトの名無しさん
07/01/04 23:50:19
URLリンク(www.din.or.jp)
179:176
07/01/05 00:12:36
解決しました。ありがとうございます。
180:デフォルトの名無しさん
07/01/05 13:30:32
さんざんキシュツかもしれませんが、見つからなかったので質問。
Windows XP ActivePerl の環境で、system コマンドで呼び出したプログラムをバック グラウンド で動かしたい。どうすればよい? 例えば、スクリプトはこんな感じ。
---
my $IE = "c:\\Program Files\\Internet Explorer\\IEXPLORE.EXE";
system ($IE, "URLリンク(www.hotmail.com"));
---
例えば、上記を test.pl としてセーブし、これを DOS 窓から呼びだすと、こんな感じでとまり、別プロセスとして実行してない。
---
C:\Documents and Settings\takasaks>perl e:/work/0my/scripts/test.pl
_
---
別プロセスで動かしたい、どうれすればよいのでしょうか?
181:デフォルトの名無しさん
07/01/05 13:41:21
system(1, ...);
ActivePerl限定だった希ガス
182:デフォルトの名無しさん
07/01/05 13:45:21
日本語が得意なフランス人みたいな日本語だな。
183:180
07/01/05 14:54:17
すげー。うまくいった。ありがとう。m(_ _)m
>>182
確かに今読み直すと変だね。
184:デフォルトの名無しさん
07/01/05 21:25:20
以前、(スクリプトが)短い掲示板がどっかに貼ってあったのですが検索しても見つかりません。
突然もう1度見たいのですが、どなたか知っている方居ませんか?
1行に出来るんだから行数関係ないっていわれそうですが6行くらいで、掲示板として機能していたPerlのプログラムでした。
2chのどこで見たんだったかなぁ、、
185:デフォルトの名無しさん
07/01/05 21:26:55
七行プログラミング part5
スレリンク(tech板)
186:デフォルトの名無しさん
07/01/05 21:32:38
七行プログラミング
スレリンク(php板)
187:デフォルトの名無しさん
07/01/05 22:38:22
>>185-186
それっぽいです。
ありがとうございました。
188:デフォルトの名無しさん
07/01/06 02:56:25
ダイス用のモジュールってありませんか?
$s に 3d20+10 のような文字が入ってたら、20面ダイスを3回振って結果に10を足す、ような。
$s に複数入っててもちゃんと計算してくれるのが良いです。更に言うと 1d6+5-4 のように加算減算も複数扱えると尚良いです。
自作しようかと思ったら結構フクザツで・・・。
189:デフォルトの名無しさん
07/01/06 03:32:00
URLリンク(search.cpan.org)
こんなんあったよ。
あとはsplitしたり調整したりするラッピングするだけで実装できるんじゃない?
そんなマニアックなものあるかよ!と思ったらあったw
恐るべしCPAN
190:デフォルトの名無しさん
07/01/06 03:37:50
置換 + evalで出来るよと言おうとしたけどCPANに真面目なのがあったか。
CPANスゲー
191:188
07/01/06 04:23:08
おおー、CPANにあるんですね!
最近 Perl と離れてたんですが、やっぱり便利だ!
ありがとうございました。
192:デフォルトの名無しさん
07/01/06 21:10:42
正規表現で()を後方参照としてではなく、ただの括弧としてマッチさせたい場合どう書けばいいんでしょうか
193:デフォルトの名無しさん
07/01/06 21:13:44
(?:re)
194:デフォルトの名無しさん
07/01/06 21:14:04
(?:pattern)
つperlre
195:デフォルトの名無しさん
07/01/06 21:34:41
おおぅ、それグループ化のみだと思ってました
ありがとうございます
196:デフォルトの名無しさん
07/01/06 21:39:55
\( ではないのか
197:デフォルトの名無しさん
07/01/06 21:48:35
括弧としてマッチさせるには \( が正しいみたいです
お騒がせしてすみません
>>196 ありがとうございます
198:デフォルトの名無しさん
07/01/06 22:19:53
すいません、ちょっと質問ですが、
Perl モジュールをCPANに登録して公開するときって、
GPLライセンスでいいんですか?
Wikipedia項目リンク
それとも、この Artistic License ですか?
199:デフォルトの名無しさん
07/01/06 22:26:32
Module::License::Reportなんてのがあるくらいだし
Apache Licenseとかも混じってるし
URLリンク(www.google.co.jp)
なんでもいいんじゃない?
200:デフォルトの名無しさん
07/01/06 23:42:21
>>198
GNUプロジェクトによれば、首尾一貫性と均一性のためにperlと同じライセンス
(GPLとArtistic Licenseのデュアルライセンス)を適用することを推奨されている。
<blockquote cite="URLリンク(www.gnu.org)
Perl のライセンス
このライセンスでは、Artistic ライセンス とGNU GPLのどちらかを選択できるとしています。
言い換えれば、あなたはこれらの2ライセンスのどちらかから選べるということです。
フリーソフトウェアのライセンスに要求される条件は満たしますが、本物のコピーレフトとは言えないかも知れません。
選択肢の一つとして GNU GPLがありますので、GNU GPLとは矛盾しません。
Perl 4 や Perl 5 用のパッケージを書く場合には、Perl プログラミングの世界における首尾一貫性と均一性を促進するために、
このライセンスを適用されることをお勧めします。Perl 以外の分野では、単に GNU GPL を使う方が好ましいので、
このライセンスを使わないよう強くお勧めします。
</blockquote>
が、好きなライセンスにすりゃ良いんじゃない?
ついでにperlmodstyleには
<blockquote>
Licensing
Make sure that your module has a license, and that the full text of it is included in the distribution
(unless it's a common one and the terms of the license don't require you to include it).
If you don't know what license to use, dual licensing under the GPL and Artistic licenses
(the same as Perl itself) is a good idea. See perlgpl and perlartistic.
</blockquote>
とある
201:デフォルトの名無しさん
07/01/07 02:04:43
修正BSDとかMITとかもあるけど。やっぱりGPL/Artisticのデュアルライセンスにしとくのがいいかな。
202:デフォルトの名無しさん
07/01/07 05:25:31
[1-9.]のみで構成される文字列を表示したいのですが
if ( $text =~ "[1-9.]" ) {
print "$text \n";
}
だとうまくいきません。
どのように修正すればいいですか?
203:デフォルトの名無しさん
07/01/07 05:25:42
(?: って変数に入れないようにするやつでしょ?
204:デフォルトの名無しさん
07/01/07 05:28:07
print "$&\n" if $text =~/[1-9.]/;
205:デフォルトの名無しさん
07/01/07 05:32:00
文字列だった。すまん
一つだけなら
/[1-9.]+/
すべてなら
print(join(',', /[1-9.]+/g));
206:デフォルトの名無しさん
07/01/07 06:01:09
#!c:\usr/bin/perl ←だとアクセスできますが、
#!usr/bin/perl ←だとアクセ500のエラーがでます。
3時間探しましたが答えが見つかりませんでした。
よろしくお願いします。
os:win2000
webserver:apache 2.059
active perl
207:デフォルトの名無しさん
07/01/07 06:04:39
>>206
#!/usr/bin/perl
208:デフォルトの名無しさん
07/01/07 06:05:19
スラッシュ一個たんなくね?
×#!usr/bin/perl
○#!/usr/bin/perl
209:デフォルトの名無しさん
07/01/07 06:09:07
>>207-208
いろいろやっていくうちに"/"が消えてました。
やっとゴールにたどり着きました。ありがとうございました。
210:デフォルトの名無しさん
07/01/07 06:25:02
>>205
説明不足ですみません。
$text = "12:24" なら $textの表示そのものをしない
$text = "3.142" なら表示する
というような不要な文字が1つでもあれば
無視するといった感じのものが作りたかったのです。
よろしくお願いします。
211:デフォルトの名無しさん
07/01/07 06:30:58
$text =~/^[1-9.]+$/ and print "$&\n";
212:デフォルトの名無しさん
07/01/07 06:32:14
printのとこ、$textじゃなくてわざわざ$&で出力する意味あるの?
213:デフォルトの名無しさん
07/01/07 06:35:49
短縮。
214:デフォルトの名無しさん
07/01/07 06:40:16
>>211
無事作成できました。ありがとうございました。
215:デフォルトの名無しさん
07/01/07 07:26:19
2chのdatファイルを、差分で取得したいのですが、どのようにしたらよいのでしょうか?
216:デフォルトの名無しさん
07/01/07 08:09:31
If-Modified-Since と Range をつけて叩いて 206|304|416 のどれかをもらうようにする
217:デフォルトの名無しさん
07/01/07 14:11:53
package の中で、
sub func(\[$@]) {
my $class = shift;
my $arg = shift;
}
として、$arg に配列もしくはスカラのリファレンスを受け取りたいのですが、
$arg にはスカラしか入ってくれません。
どう書くのが正解でしょうか?
218:デフォルトの名無しさん
07/01/07 15:06:23
>>202
\. じゃなくてええの?
219:デフォルトの名無しさん
07/01/07 15:44:04
>>218
自分でちょっと試せばいいだろ
print "Matchn" if 'ABC' =~ /[.]/;
220:デフォルトの名無しさん
07/01/07 17:38:56
>>218
文字クラスの中だから
221:デフォルトの名無しさん
07/01/07 20:45:01
>>217
prototypeに頼らないのが正解。
そのprototype、第一引数について書かれてないけど。
222:デフォルトの名無しさん
07/01/07 22:45:16
ppmをつかってモジュールを持ってくるときに、zipで圧縮されてると展開方法を知らんとエラーが出てしまうのですが、
どうすればこのエラーが出なくなるんでしょう。
223:デフォルトの名無しさん
07/01/07 23:28:08
Archive::Zip入ってる?
224:デフォルトの名無しさん
07/01/08 00:48:56
>>223
入ってます。
225:デフォルトの名無しさん
07/01/08 01:27:07
手元だとzipアーカイブでもインストールできるなぁ。どこのリポジトリの何で発現してる?
226:デフォルトの名無しさん
07/01/08 01:49:50
>>225
ためしに再インストールしようとしたArchive::Zipで出てます。。。
何処のレポジトリかはどうやってわかるんでしょうか。
227:デフォルトの名無しさん
07/01/08 08:59:59
csvの一行目を検索して、二行目をprintするだけなんですが
「ー」を含む言葉だと検索結果で出力されません
「。」「・(半角)」「・(全角)」とか色々やったんですが、どうやら「ー」だけのようです
解決方法をよろしくお願いします
open(IN,"$file");
while(1) {
$line = <IN>;
@data = split(/,/ ,$line);
if ( $line eq "" ) { last;}
if ( $data[0] =~ /$in{'test'}/ ) {
print "$data[1]\n";
}
}
close(IN);
228:デフォルトの名無しさん
07/01/08 11:44:40
>>227
CSVファイルを扱うならば、Text::CSV をお使いください。
(Text::CSV_XS かもしれない、手元にソースがない)
229:デフォルトの名無しさん
07/01/08 12:25:03
>>228
返信ありがとうございます
Text::CSVモジュールを使わないと対処できないということでしょうか?
フリーのwebスペースを利用したいので、モジュールはインストール出来ないです
Text::CSV自体は優れものみたいですね
230:デフォルトの名無しさん
07/01/08 12:27:20
>226
えっと、ppmシェルで、
search Archive-Zip
って入力して。
Searching in Active Repositories
1. Archive-Zip [1.18] Archive-Zip
こんな感じに出てくると思う。仮に1番なら
desc 1
って入力したときなんて表示されてる?
231:デフォルトの名無しさん
07/01/08 13:21:02
>>227
つShift_JISの罠
/\Q$in{'test'}\E/
Text::CSVはマルチバイト文字通ったっけ?
Text::CSV_XSでbinaryオプションを与えない駄目だったような記憶が
232:デフォルトの名無しさん
07/01/08 14:02:13
Text::CSVは0x09(Tab)と0x20(Space)から0x7e(Tilde)の範囲しか使えないね。
Text::CSV_XSでbinaryオプションつけないとダメだ。
233:デフォルトの名無しさん
07/01/08 14:07:57
>>231
返信ありがとうございます。おかげで解決することができました
ただ、「\Q」が「\Eまでのメタ文字をリテラルとして判断する」のは別ったのですが
「/$in{'test'}/」←これのどこにメタ文字があるのかが分らないです
解決はしたけど理解出来てない…
234:デフォルトの名無しさん
07/01/08 14:25:47
>>233
「ー」はShiftJISで0x81 0x5Bと表される。この2バイト目が'[' = 0x5B
他にもソ('\')とか+('{')とか色々。
文字コードの割り当て参考資料
URLリンク(www-cms.phys.s.u-tokyo.ac.jp)
ASCIIコード表
URLリンク(adlib.rsch.tuis.ac.jp)
235:デフォルトの名無しさん
07/01/08 14:31:01
>>233
「$in{'test'}」自体がメタ文字を含むってことじゃなくて、
実行時に変数$in{'test'}にメタ文字を含むShiftJIS文字が入る可能性があるってこと。
236:デフォルトの名無しさん
07/01/08 14:51:17
>>234-235
かなり見当違いな考えをしてたみたいですね
「ー」以外にも注意しなければいけない文字が結構ありますね
ご丁寧にありがとうございました
237:デフォルトの名無しさん
07/01/08 16:52:09
>>230
1: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Ned Konz <perl@bike-nomad.com>
Provide: Archive::Zip version 1.18
Require: File-Which
Require: PathTools
Repo: trouchelle
CPAN: URLリンク(search.cpan.org)
Installed: 1.18 (perl)
2: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Adam Kennedy (cpan@ali.as)
Provide: Archive::Zip version 1.18
Provide: Archive::Zip::BufferedFileHandle
Provide: Archive::Zip::MemberRead
Provide: Archive::Zip::MockFileHandle
Require: File-Which
Repo: ActiveState Package Repository
CPAN: URLリンク(search.cpan.org)
Installed: 1.18 (perl)
3: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Ned Konz (perl@bike-nomad.com)
Require: Compress-Zlib
Repo: bribes
CPAN: URLリンク(search.cpan.org)
Installed: 1.18 (perl)
こんな感じです。
238:デフォルトの名無しさん
07/01/08 17:32:10
>>227
おもったが、他の文字コードに変換してsplitするのはどうよ。
いちばんお手軽。
open(IN,"$file");
while(1) {
$line = <IN>;
$line=Jcode->new($line)->euc;
@data = split(/,/ ,$line);
if ( $line eq "" ) { last;}
if ( $data[0] =~ /$in{'test'}/ ) {
print Jcode->new("$data[1]\n")->sjis;
}
}
close(IN);
239:デフォルトの名無しさん
07/01/08 17:41:21
たまに思うのだが、単なる文字列のスカラを
"$file" とかって、ダブルクォートで括って書くの無駄だよね。
全く同じ内容の、新しい文字列を生成してる訳でしょ?
だったら単に $file って書いた方が効率良いのに。
KENTとか、どっかのサンプルでわざわざ括るようになってるのかな。
こういう書き方してる人が、どこで習ってくるのか知りたい。
240:デフォルトの名無しさん
07/01/08 17:51:09
>>238
$in{'test'}が正規表現の場合の話か。
EUCにするくらいなら、変換に多少コストが掛かるがUTF-8にして処理したほうがいいと思う。
今度は>>176こういう問題が発生する。SJISでも率は低いが起こるけれどね。
ってもしかして元質問も正規表現を入力する質問だったんだろか…
indexの代わりにマッチングを行ってるだけかと思って\Q\Eで答えちゃったけれども
>>239
最近は見ないけれど
print "@hoge";
とやっておいてなんか表示が変だと質問してくる人までいるから困る。
ついでにperlfaq
URLリンク(www.kt.rim.or.jp)
241:デフォルトの名無しさん
07/01/09 00:43:01
>>239
あ、それ昔やってた。
なんかprint = ダブルクォート括らないと不安、みたいな気がしてたような。
242:デフォルトの名無しさん
07/01/09 00:46:26
#俺にも
print $a, $b; #とすればいいところを
print $a . %b; #としていた時代や
print "$a$b"; #としていた時代があったなあ
243:デフォルトの名無しさん
07/01/09 01:05:55
カンマは直接に文字連結の意味じゃないから余り好きじゃないなぁ。。
そっちの方が速いんだけどね。
244:デフォルトの名無しさん
07/01/09 01:39:08
強制的に文字列コンテキストに変えたいときとか。
オブジェクトじゃなくてその文字列表現だけ保持したい場合とかあるでしょ。
245:244
07/01/09 01:46:32
ちゃんと読んでなかった。スマソ
246:デフォルトの名無しさん
07/01/09 12:09:24
>>243
散々既出だが、一応突っ込んどく。カンマの方が遲い
use Benchmark ;
my ( $hoge, $moge ) = ( 'hoge', 'moge' ) ;
sub dot { print STDERR $hoge . $moge . "\n" ; }
sub dq { print STDERR "$hoge$moge\n" ; }
sub comma{ print STDERR $hoge , $moge , "\n" ; }
timethese ( 1000000, { op1 => 'dot', op2 => 'dq', op3 => 'comma' } ) ;
$ perl Bench.pl 2> /dev/null
Benchmark: timing 1000000 iterations of op1, op2, op3...
op1: 15 wallclock secs ( 7.67 usr + 4.81 sys = 12.48 CPU) @ 80128.21/s (n=1000000)
op2: 12 wallclock secs ( 7.37 usr + 4.67 sys = 12.04 CPU) @ 83056.48/s (n=1000000)
op3: 22 wallclock secs ( 9.13 usr + 11.23 sys = 20.36 CPU) @ 49115.91/s (n=1000000)
247:243
07/01/09 13:10:54
>>246
初心者でゴメン。Windowsだから、nulに出力して実行してみた。
(Windows XP SP2 ActivePerl5.8)
Benchmark: timing 10000000 iterations of op1, op2, op3...
op1: 12 wallclock secs (11.02 usr + -0.02 sys = 11.00 CPU) @ 909173.56/s
(n=10000000)
op2: 12 wallclock secs (10.87 usr + 0.00 sys = 10.87 CPU) @ 919540.23/s
(n=10000000)
op3: 8 wallclock secs ( 7.02 usr + 0.00 sys = 7.02 CPU) @ 1425516.75/s
(n=10000000)
あれ?最初自分の考えでは関数を二回使ってるカンマの方が遅いと思ってたんだけど、
ベンチしたらドットの方が速いんで>>243を書いた。
なんで結果違くなっちゃうのか誰か教えて〜。
248:243
07/01/09 13:29:23
あー、わかった。Perlでの出力処理はcommaの方が速いけど、
systemのIOでのオーバーヘッドで結果的にdotの方が速いという寸法か。>>246
Windowsで実際にファイルに出力して計測してみると大体同じ(わずかにcommaが速い)になった。
ここらへんはLinuxとWindowsで違うんだろうね。
249:デフォルトの名無しさん
07/01/09 14:06:58
>>246
うんにゃ。
8Bのメモリ確保なら大してコストかからんからサンプルとして不十分じゃないか?。
$hogeが十キロの単位になってくるとカンマが追い抜くんじゃないだろうか。
250:デフォルトの名無しさん
07/01/10 01:42:28
>>248
いや、>>246はSTDERRに出力してるからカンマ区切りが遅くなっているだけ。
STDERRはperl内部でも特別扱いされていて、カンマで区切られた要素毎に fflush される。
なので、STDERRへ出力する場合はカンマ区切りの方が(fflushの増える分だけ)遅くなる。
他のハンドルだと($|=1でも)、普通はカンマ区切りの方が速くなる。
251:デフォルトの名無しさん
07/01/10 04:22:12
えっちだから遅いんだね。
252:デフォルトの名無しさん
07/01/10 15:25:22
フリーウェアのソースを眺めてると、一つのファイルにやたらと機能を詰め込んでるのが
多いように感じるんだけど、これってどうなんだろう。
掲示板だったら、表示.cgi 書込み.cgi とか分けた方が保守しやすいのでは、と。
意見求みまする。
253:デフォルトの名無しさん
07/01/10 15:43:02
>>252
インスコするファイルがたくさんあるとお子様が混乱してしょうもない
質問で邪魔してくるので、ソースメンテする手間はかかるけどトータル
では得らしい。
254:デフォルトの名無しさん
07/01/10 15:51:55
コーディング外の質問です。
今、plファイルのwindows向けのアイコンを何となく作っていますが、
真珠っぽいのがファイルについたアイコンか、らくだの絵のアイコンかどちらがふさわしいと思いますか?
255:デフォルトの名無しさん
07/01/10 16:07:31
当然らくだ
256:デフォルトの名無しさん
07/01/10 16:18:38
PARのparl.exe
257:デフォルトの名無しさん
07/01/10 16:25:41
>>256
258:デフォルトの名無しさん
07/01/10 20:00:56
初めて書き込みさせて頂きました。
現在、perl(HPUX)とNet-Telnet-3.03を利用してtelnet接続しているのですが、
telnet中にESCキーを入力させる事は可能なのでしょうか?
perl:v5.8.0 built for PA-RISC1.1-thread-multi
telnet:Net-Telnet-3.03
対話式なプログラムを実行していき、途中で
どうしてもESCキーが必要になりました。
$telnet->print("\x1B");
こんな感じで文字コード入力でもダメでした。。
259:韋駄天はふと考えた
07/01/10 23:02:23
あなた達も↓のような経験が一度や二度あるでしょう。私はわずか4年の間に
2回もパソコンをウイルスによって不調になり使えなくなりました。
私達はパソコン製造業者及び修理業者とパソコン関連で商売をしている業者を
あまりにも野放にしすぎました。
その結果が自作自演ウイルスバラ撒きの悪徳商法です。
703 :韋駄天はふと考えた :2007/01/10(水) 22:11:17 ID:ZKnpXOph
ノートンがウイルスを検出しました。
あなたのパソコンを60日間に渡り78250個ものウイルスから守ってきました。
もうすぐ無料期間が終わりますので、ウイルス対策有料ソフトを購入してください。
はぁ????なにいってんの?なんで、たった60日間で78250個ものウイルスが進入してくんだよ?
明らかに自作自演目的の業者の仕業じゃねえか?
犯人はおまえらだろが!この犯罪者かぶれの集団が!!
あちこちのサイトを開く度にコンピューターウイルスがパソコンにバンバン進入してくる。
おまえらな!自分で作ったサイトにコンピューターウイルスを混ぜて、他人の
何十万台ものパソコンを不調にさせたり故障させて、ウイルス対策ソフトを
高額で売りつけてまで儲けたいのかよ?
自転車屋が地域の自転車をパンクさせて回ったり、消防士が管轄地域で放火して
回るのと同じ犯罪をおまえらがやっているんだよ!
てめえらで新たなコンピューターウイルスを次々に作ってはバラ撒いては、ウイルス対策ソフトを
高値で売りつける自作自演商売しやがって!
この腐れ外道共が! 恥知らずの犯罪者共めが!
260:デフォルトの名無しさん
07/01/10 23:06:09
>254
でっかく「PL」とか「Perl」の文字が入ってるアイコンとか……。(聞いてない)
261:デフォルトの名無しさん
07/01/11 00:08:30
>>255
公式のらくだの絵をちょっと使って作ってみました。
>>256
あれはそのままでも結構かっこいいのですが、ちょっと抵抗があったので。。
>>260
一応Perlの文字を入れました。
どうもでした。
262:デフォルトの名無しさん
07/01/11 01:01:46
ファイルを最終行から順にさかのぼって読む方法ないですか?
seek , getc等で1文字単位で読むしかないかな?
263:デフォルトの名無しさん
07/01/11 01:09:57
>>262
つFile::ReadBackwards
264:デフォルトの名無しさん
07/01/11 01:15:30
>>263
ありがとうございます。
265:デフォルトの名無しさん
07/01/11 17:03:13
課題で
aを1文字の文字列、$bを数字とし、上の行から$aを$b回と表示していき、3角形を描くプログラム。
というのが出ています。
print "a? ";
chomp($a=<stdin>);
print "b? ";
chomp($b=<stdin>);
でaに+をいれ、bに5といれると
+
++
+++
++++
+++++
こんな感じで表示させたいです。
for文の入れ子でやると思うのですが、表記がわかりません。
ヒントだけでもいただけないでしょうか?
266:デフォルトの名無しさん
07/01/11 17:09:13
bに1を足してaをb個並べてプリントしたら改行を繰り返す
267:デフォルトの名無しさん
07/01/11 17:19:33
forの入れ子でやるとかいうと、もしかしたらこういう
おぞましいコードを期待してるかもしれないんだけど
for (my $line=1; $line <= $b; ++$line) {
for (my $num=1; $num <= $line; ++$num) {
print $a;
}
print "\n";
}
こういう風に簡潔にかける。
for my $num (1..$b) {
print $a x $num, "\n";
}
268:デフォルトの名無しさん
07/01/11 17:21:58
あと $a と $b は sort とかで使われるから使うなといっとけ
269:265
07/01/11 17:33:51
>>267
できました。ありがとうございます。
入れ子でわけわからない長いプログラムを作っていた自分がアホらしくなりましたw
もし入れ子でやるとしたら
入れ子の方の後半部分の
print $a;
}
print "\n";
}
はどういうことでしょうか?
270:デフォルトの名無しさん
07/01/11 17:34:37
すぐ答え出す奴ってなんなの・・・
271:デフォルトの名無しさん
07/01/11 17:54:51
漁師さん
272:デフォルトの名無しさん
07/01/11 18:12:08
こういう場合は普通、for文を使わずにトリッキーなコードを書いてあげるのが
お決まりなんだけどね。
273:デフォルトの名無しさん
07/01/11 18:21:32
print map { $a x $_ . "\n" } 1..$b;
274:デフォルトの名無しさん
07/01/11 18:58:59
チューニングした答え書いて分かるかよ。
いっそのことCPANで(笑
275:267
07/01/11 19:02:50
$a='+';$b=5;$t=0;
(${a}x(($b*$b+$b)/2))=~m{((??{++$t;".{$t}"}))(?{print"$^N\n"})}g;
こうですか?わかりません><
276:デフォルトの名無しさん
07/01/11 19:17:38
$^Nなんて使ってるのはじめてみた(笑)
277:デフォルトの名無しさん
07/01/11 19:26:01
(笑)なんて使ってるのはじめてみた(笑)
278:デフォルトの名無しさん
07/01/11 20:25:30
確かにな(藁
279:デフォルトの名無しさん
07/01/11 20:27:11
まぁ、ありえない
280:デフォルトの名無しさん
07/01/12 02:12:36
print map "$_¥n", unpack +( join '', map "A${_}X${_}", 1..$b ), $a x $b ;
不毛だ…
281:デフォルトの名無しさん
07/01/12 02:31:38
$_が半角文字"@"(0x40)を含むときのみデータを取得したいのですが、
以下のコードだと、$_が"病院"(0x95,0x61,0x89,0x40)とかの場合でも
データを取得してしまいます。
このような2バイト文字を取得しないようにするには
どの様に修正すればいいですか?
if ( $_ =~ "@" ) {
$data[$i++] = $_;
}
282:デフォルトの名無しさん
07/01/12 03:56:45
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz
CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。
具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=URLリンク(www.xxx.com)
と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。
渡されてきたURLを「URLリンク(www.xxx.com)」のように、
そのまま表示するにはどうしたらいいでしょうか?
一応書いておくと、スクリプトはUTF-8Nで書いています。
283:デフォルトの名無しさん
07/01/12 04:00:48
>1に全てが隠されているんじゃないだろうか。
284:デフォルトの名無しさん
07/01/12 04:08:40
>>283
orz
CGIはスレ違いだったんですね。本当にごめんなさい。
一日考え続けてて疲れてたのか、>>1を確認するのを失念してました。
向こうの初心者質問スレで質問してくる事にします。
スレ汚し失礼しました。
285:デフォルトの名無しさん
07/01/12 04:14:03
プログラム板から誘導されて来ました。
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz
CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。
具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=URLリンク(www.xxx.com)
と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。
渡されてきたURLを「URLリンク(www.xxx.com)」のように、
そのまま表示するにはどうしたらいいでしょうか?
一応書いておくと、スクリプトはUTF-8Nで書いています。
286:デフォルトの名無しさん
07/01/12 04:20:09
ぎゃー!!!
ありえない誤爆・・・。
ほんっとうにごめんなさい・・・。
287:デフォルトの名無しさん
07/01/12 04:23:33
>1に全てが隠されているんじゃないだろうか。
288:281
07/01/12 04:29:08
自己解決しました。
おさわがせしました。
289:デフォルトの名無しさん
07/01/13 00:44:28
>>281見てて、ふと、半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、
うーんうーん悩んでいた時のことを思い出した。
そういや、半角英字を全角英字に置換することってできるの?
290:デフォルトの名無しさん
07/01/13 00:53:02
use utf8やるとか。
291:デフォルトの名無しさん
07/01/13 01:42:35
EncodeもあるしUnicode::Japaneseもあるし。
292:デフォルトの名無しさん
07/01/13 22:09:16
WebProg板に書いたけど、こっちの方がふさわしそうなので
こちらでお聞きします。
キー入力を待って、キー入力があれば処理を次に進める、ということをやりたいのですが、
C言語でいうところの、getch() に相当する関数はないでしょうか?
293:デフォルトの名無しさん
07/01/13 22:10:05
4年前ぐらいまでPG兼SEをしていたのだが、
そのころと比べるとかなりPerlは寂れた?
294:デフォルトの名無しさん
07/01/13 22:34:22
>>292
Term::Getch
295:デフォルトの名無しさん
07/01/14 00:42:13
こんな配列 @result=("E:15000", "S:20000", "W:15000", "N:50000")を作りまして
ここから、1位=N、2位=S、3位=E、4位=W、という結果を出したいと思っています。
得点が同点の場合、E→S→W→Nの順で優先となります。
とりあえず、$rank{E}='15000',$rank{S}='20000',,,として、
if(($rank{E}>=$rank{S})&&($rank{E}>=$rank{W})&&($rank{E}>=$rank{N})){
#E=1位
#SとWとNで2位以下の判別
#何かと何かで3位と4位の判別
} elsif (($rank{S}>=$rank{W})&&.......
#S=1位
#EとWとNで2位以下の判別
#何かと何かで3位と4位の判別
}elsif(..
と、やり始めましたが、とてつもない作業になりそうです。
何か、よい解決法がございましたらご示唆お願いします。
296:デフォルトの名無しさん
07/01/14 00:49:18
普通にソートすりゃいいやん
@result= sort {(split/:/,$b)[1]<=>(split/:/,$a)[1]} @result;
297: ◆TWARamEjuA
07/01/14 01:04:42 BE:1633853-BRZ(6701)
とん・なん・しゃー・ぺー♪
298:デフォルトの名無しさん
07/01/14 01:06:36
use strict;
# こんな配列
my @results = ("E:15000", "S:20000", "W:15000", "N:50000");
# 得点が同点の場合の順
my %prio_of = (
E => 0, S => 1, W => 2, N => 3,
);
my @s_results = map { $_->[0] }
sort { $b->[2] <=> $a->[2] || $prio_of{$a->[1]} <=> $prio_of{$b->[1]} }
map { [ $_, (split/:/=>$_)] } @results;
299:デフォルトの名無しさん
07/01/14 01:23:07
数値として使う予定の変数を、文字列で宣言するのって確か非効率だよね。
随分長い間Perlから離れてるので間違ってるかも知れないけど
$foo = '2000';
と文字列にしておいて、その後で $foo を数値として使った場合、
スカラ変数の構造体は、
文字列型のものから、数値も文字列も両方入る奴に切り替わる。
構造体切り替えの手間もあるし、構造体のサイズも大きくなるから非効率
…だったような気がする。
300:295
07/01/14 01:43:35
すばやいご提示、ありがとうございます。
>>296 様
すみません、説明が不足していました(ということに気づくのに、いただいた式を
眺めながらかなり時間がかかりました・・・)。実は、EやSが変数の中に出てくる
順番は毎回変わる可能性がありました。申し訳ありません。
>>298 様
欲しい結果が出せました。ただ、内容の理解には私にはまだまだ時間がかかりそうです・・
なんとか少しずつ、吟味していきたいと思います。
>>297 様
わかりましたか。そのとおりです。
皆様、すばらしいご教授、どうもありがとうございました。
301:デフォルトの名無しさん
07/01/14 01:59:22
>>299
perl は型はなしでしょ。
$foo = '2000';
も
$foo = 2000;
は同じでしょ。
302:デフォルトの名無しさん
07/01/14 02:13:38
>>301
つ [perlguts]
つ [Devel::Peek]
303:デフォルトの名無しさん
07/01/14 02:45:43
>>302
もちっと教えてくれんかのう。
perldataには
「あるスカラー変数が、“文字列”型、“数値”型、“ファイルハンドル”型、
あるいはその他の型であるように宣言する方法はありません。」
とあるかんだけど、それとは違うレベルで何かあるのか?
304:デフォルトの名無しさん
07/01/14 03:03:20
提示されている情報ぐらい見なさい。
> Double-Typed SVs
> スカラー変数は通常、整数、倍精度、ポインタ、リファレンスのうちの いずれか一つの型をとります。Perl は実際のデータに対して、
> 蓄積されている型から要求されている型へ、自動的に変換を行ないます。
305:265
07/01/14 03:39:50
>>275 を提出したんですが、授業後
せんせから呼び出し受けました。
306:303
07/01/14 03:57:55
>>304
どうもありがとう。
文脈によってperl内部で数値と評価されたり文字列として評価されたりすることは分かっています。
しかし、シンタックス上
$foo = '2000';
と
$foo = 2000;
に違いがあるとは読み取れませんでした。
#$foo = '2000' . '';
#と
#$foo = 2000 + 0;
#が違うのはわかりますよ。
307:303
07/01/14 04:24:03
試してみれば良いんだね。
$foo = 2000;
の場合数値コンテキストになるんだ。(そりゃそうか)
308:デフォルトの名無しさん
07/01/14 13:40:27
>>305
ワロタ
なんていわれたの?w
309:デフォルトの名無しさん
07/01/14 14:38:20
先生が読めなかったか
先生がこのスレを見ていたか
どっちかな
310:デフォルトの名無しさん
07/01/14 14:54:53
>>289
>半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、
>うーんうーん悩んでいた時のことを思い出した。
>そういや、半角英字を全角英字に置換することってできるの?
次スレのテンプレ予定の>>115に忠実に従えば、
tr/a-zA-Z/a-zA-Z/
でできる。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5375日前に更新/220 KB
担当:undef