トップページ⇒php
1001コメント356KB

Perlコーディング初心者質問スレ Part 53

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/11/26(日) 14:38:23ID:SlmGsFMB
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0607nobodyさん2006/12/31(日) 04:17:23ID:oF4MMStz
やはり上手く行きませんでしたonz

%hash = (
a => 'あああ',
b => [
  { c => 'いいい' },
  { d => [
    { e => 'ううう' }
  ] }
);

このようにハッシュのvalueに幾度(無限に)も配列のリファレンスがネストしてあるとき、どのようにすれば下層部のハッシュ(上記の場合e => 'ううう')が取り出せるのでしょうか?
0608nobodyさん2006/12/31(日) 10:20:33ID:???
>>607
再帰処理
0609nobodyさん2006/12/31(日) 10:33:33ID:oF4MMStz
>>608
試してはみたんですが、出来ませんでした。。。
端折ると↓のようにしてみたんですが

sub aaa {
  foreach () {
    if (ref()) {
      &aaa();
    } else {
      普通のしょり
    }
  }
}
0610nobodyさん2006/12/31(日) 14:29:56ID:???
引数
0611nobodyさん2006/12/31(日) 17:01:53ID:???
くだらない質問で申し訳ありません。

【書き方1】

function check() {
  if ($x == 2) {
    print "Xは2です。";
  } elsif ($x == 5) {
    print "Xは5です。";
  } else {
    print "Xは2でも5でもありません。";
  }
}

【書き方2】

function check()
{
  if ($x == 2)
  {
    print "Xは2です。";
  }
  elsif ($x == 5)
  {
    print "Xは5です。";
  }
  else
  {
    print "Xは2でも5でもありません。";
  }
}
06126112006/12/31(日) 17:05:01ID:???
みなさんは上記の 【書き方1】 と 【書き方2】 のどちらが好きですか?
自分は 【書き方2】 で理由は、

・開始括弧と終了括弧が揃っている。
・開始括弧の行が空く (括弧だけの行ができる) ので見やすい。【書き方1】 だと空行入れるべきか入れないべきかで毎回迷ってやりにくい。
・elsif の行がスマートになる。

です。

皆さんのお好み、または標準のコーディングルールがあれば教えて下さい。
あと、自分はインデントはタブで、タブは半角スペース4つ分にしていて、文のあとにコメントを入れる場合にはタブ1つあけることにしていますが、
こちらについても教えていただけたら幸いです。

0613nobodyさん2006/12/31(日) 17:51:26ID:???
>>611
ベストプラクティスでは、「重要なのは、首尾一貫したスタイルを1つ採用することである。」としたうえで
レイアウトガイドラインの「提案」として、K&Rスタイルを採用しているね。つまり

if ($x == 2) {
    print "Xは2です。";
}
elsif ($x == 5) {
    print "Xは5です。";
}
else {
    print "Xは2でも5でもありません。";
}

こう。んで、タブを使わず半角スペース4つを1インデントとしている。
個人的にも、特にこだわりはないので、このベストプラクティスを標準としてるなぁ。
ただ、チーム開発の時はチームのコーディングルールに合わせるけど。
でも、Perl は TMTOWTDI がモットーなんだし、好きな書き方で良いと思う。
06146112006/12/31(日) 17:55:49ID:???
>>613
なるほど
回答していただきありがとうございました

標準的なコーディングルールを使ったほうが他の人と共有する場合や配布する場合には便利ですね。

> タブを使わず半角スペース4つを1インデントとしている。

これに関しては、自分が使っている 「phpエディタ」 も 「TeraPad」 も Tabキーで半角スペースを4つ入れる機能がないので
不便でしょうがないです(´・ω・`)
0615nobodyさん2006/12/31(日) 17:58:21ID:???
半角4つにすると、インデント消す時バックスペース4回も押すのマンドクセ
0616nobodyさん2006/12/31(日) 18:00:26ID:???
最近のエディタならたいがいバックスペースでアンインデントできるようになるでしょう
0617nobodyさん2006/12/31(日) 18:08:53ID:???
こん↓な時タブを使われると、環境によってずれるから嫌な気分になる。

abcd = 1 + 2 + 3 +
     4 + 5;
0618nobodyさん2006/12/31(日) 18:40:04ID:???
こんな感じかな。
use strict;
use Data::Dumper;

my %hash = (
a => 'あああ',
b => [
{ c => 'いいい' },
{ d => [ { e => 'ううう' } ]}
]
);


parse(\%hash);

sub parse {
my $tmp = shift;
#print Dumper $tmp;
if (ref $tmp eq 'ARRAY') {
foreach (@$tmp) {
parse($_);
}
} elsif (ref $tmp eq 'HASH') {
foreach (keys %$tmp) {
parse($tmp->{$_});
}
} else {
print "$tmp\n";
}
}
0619nobodyさん2006/12/31(日) 21:54:59ID:???
@a = qw{ a b c d e };
@b = qw{ 1 2 3 4 5 6 };

@array = \(@a, @b);

こんな風になっている場合、@arrayから@aの要素数にアクセスするにはどう書けばよいでしょうか。
0620nobodyさん2006/12/31(日) 22:31:17ID:???
scalar @{$array[0]}
06216192006/12/31(日) 22:45:49ID:???
>>620
ありがとうございます。
今年終わる前におしえてもらえてよかった・・・(T_T)ノ
よいお年を。
0622nobodyさん2007/01/01(月) 20:57:03ID:QvA3S+in
あけましておめでとうございます。新年初の質問です。どうぞよろしくお願いします。
#####書き換え前#####
# メッセージ内で使用を禁止する言葉の処理
if (crypt($FORM{'spwd'},substr($password,$salt,2)) ne $password)
{@ngword = split(/\s+/,$ngw);
foreach $ngw (@ngword){
if ($FORM{'value'} =~ /\Q$ngw\E/i){
&error('メッセージ内に使用禁止ワードが含まれています。');}}}
#####ここまで#####
☆備考☆
$ngw = 'テスト test TEST';
これをファイルを読み込み形式にしたいと思い↓のようにしました。
#####書き換え後#####
if (crypt($FORM{'spwd'},substr($password,$salt,2)) ne $password)
{if ( !open(NGW, "$spamdata") ){
&error('0');}
@xx = <NGW>;
foreach $ngw (@xx){
@ngword = split(/,+/,$ngw);
foreach $ngw (@ngword){
if ($FORM{'value'} =~ /\Q$ngw\E/i){
&error('メッセージ内に使用禁止ワードが含まれています。');}}}close(NGW);}
#####ここまで#####
☆備考☆
$spamdata = 'spamdata.cgi';
※質問
そこで、foreach $ngw (@xx){}とforeach $ngw (@ngword){}が重複しているようで、
表記としておかしくないか疑問に思いました。
なにぶんPerlの知識も経験も乏しいもので、チェックをお願いします。
より適切な表記の仕方があったらご指摘も戴けるとうれしいです。
備考
spam対策のために禁止語句をCGIファイルから読み込みたいと思い書き換えました。
0623nobodyさん2007/01/01(月) 21:04:13ID:???
では新年初のスルーで
0624nobodyさん2007/01/01(月) 23:37:36ID:???
>>622
>そこで、foreach $ngw (@xx){}とforeach $ngw (@ngword){}が重複しているようで、
>表記としておかしくないか疑問に思いました。

そりゃどう考えてもおかしい。perlに限らずプログラミング一般論として。

>spam対策のために禁止語句をCGIファイルから読み込みたいと思い書き換えました。

CGIの意味知ってる?
そこは単にテキストファイルでしょ。なんで、そんなファイルの拡張子に".cgi"付けるの。
新年早々猪突突進か
0625nobodyさん2007/01/01(月) 23:59:59ID:???
ファイルの拡張子なんか何だって良い。
0626nobodyさん2007/01/02(火) 00:10:37ID:???
http server が拡張子に影響されないなら良いが、".cgi" だと影響受けるだろ。
0627nobodyさん2007/01/02(火) 00:17:55ID:???
拡張子cgiは、htaccessを使わず(使えない場合も)、ファイルの中身を見せない簡単な方法だね。
目くじら立てることでもない。
0628nobodyさん2007/01/02(火) 00:29:14ID:???
>>627にも一理あるが、>>622がそこらへん理解してれば良いが。
こぢんまりしたサイトでは目くじら立てなくてもいいかも知れないが、
職業プログラマが製品レベルではやらないことだな。
0629nobodyさん2007/01/02(火) 00:46:17ID:???
俺は他人のデータを扱うときはHTTPから見えないところに置くけど、
自分だけのデータならランダムで32文字でつけたディレクトリにデータファイル入れたりしてる
0630nobodyさん2007/01/02(火) 01:29:17ID:???
>>622
とりあえず、2つのforeach文をそれぞれ同じ変数$ngwに入れてるみたいだから、それを別々にしてみよう。
一つ目を$ngw1、二つ目を$ngw2とか。
で、
if ($FORM{'value'} =~ /\Q$ngw\E/i){
を
if ($FORM{'value'} =~ /\Q$ngw2\E/i){
にしてみると大丈夫だと思うよ。
0631nobodyさん2007/01/02(火) 02:15:39ID:???
ライブラリファイルを読み込もうとしたのですが
『次のファイルを開こうとしています。』となって表示されません。
ライブラリファイルの拡張子は.plなのですが、保存したファイルは普通にダブルクリックで開けてしまいます。
.pl拡張子は何か特別な設定が必要なのでしょうか?
0632nobodyさん2007/01/02(火) 02:24:31ID:???
> ライブラリファイルを読み込もうとしたのですが
どう読み込もうとしたのか。requireとかopenとか…ダブルクリックとか。

> 『次のファイルを開こうとしています。』となって表示されません。
これは自作メッセージ?STDOUTかSTDERRに出てるのか、UAの画面に表示されるのか。
CLIのお手軽アプリを作ったときに、こういうメッセージをprintしてファイルの中身をSTDOUTに吐く前に
無限ループにはめて先に進まなくなったことは何度もある。

# open(FH, '<', "hoge.dat"); flock(FH, 2); @buffer = <FH>; close(FH);
# while (@buffer) { print 'while でなく foreach と書いたつもりの酔っ払い', "\n"; }

質問がWebProg関係なのかどうかも含めて、ちょっとよくわかんない。
.plだからとくにどうこう、ってのはないです。
06336312007/01/02(火) 02:43:47ID:???
>>632
すいません自己解決しました
0634622@解決済み2007/01/02(火) 09:03:38ID:5ekfui+1
>>624
>>630
ありがとうござます。↓昨日また少し考えてこんな感じになりました。

if (crypt($FORM{'spwd'},substr($password,$salt,2)) ne $password)
{if ( !open(NGW, "<$spamdata") )
{
&error('0');
}
flock(NGW, 1);
@xx = <NGW>;
close(NGW);
foreach $ngw (@xx){
@ngword = split(/,+/,$ngw);
foreach $ngwbb (@ngword)
{
if ($FORM{'value'} =~ /\Q$ngwbb\E/i)
{
&error('メッセージ内に使用禁止ワードが含まれています。');
}
}
}
}

ご協力ありがとうございました。
0635nobodyさん2007/01/02(火) 17:42:57ID:???
WINDOWSの鯖でファイルが書き込み可能かどうかを判断するにはどうしたらいいんですか?
WINDOWS鯖の場合だと
if (-w $write_file_path) { print "書き込み可能\n"; }というプログラムがが使えないんです
0636nobodyさん2007/01/02(火) 19:27:19ID:???
おいコラはやく答えろや 人間電卓どもが!!!
0637nobodyさん2007/01/02(火) 19:31:28ID:???
電卓すらも使えない人間がここに一人ry
0638nobodyさん2007/01/02(火) 20:42:50ID:???
パソコンよりレジや電卓のほうが難しいと思う
0639nobodyさん2007/01/02(火) 21:13:35ID:???
いや、計算尺の方が…
0640nobodyさん2007/01/03(水) 11:08:33ID:???
>>635 = http://pc10.2ch.net/test/read.cgi/tech/1166708139/139

マルチ放置推奨
0641nobodyさん2007/01/03(水) 22:13:23ID:???
ふと疑問に思ったのですが、perlの最大計算桁数って何桁
なのでしょうか?

そういえば1年前に5000兆まで計算させるシステムを作った
のを思い出したのですが、その頃は最大計算桁数のことを
考えていなかったような気がするので質問させていただいた
次第です。

ご教示いただけますと幸いです。
0642nobodyさん2007/01/03(水) 22:24:17ID:???
use bigint すれば(PCのリソース内で)無限桁ですよ。
0643nobodyさん2007/01/04(木) 00:30:50ID:???
>>642
ご教示有難うございます。
ちょっと昔のソースを改変するのにもある程度理由を
つけなければいけないので、デフォルトで何桁まで
問題ないかもしご存知でしたら教えていただけますと
幸いです。

質問続きですみません。
0644nobodyさん2007/01/04(木) 12:00:06ID:???
C言語のlong相当、たぶん
0645nobodyさん2007/01/04(木) 16:29:54ID:???
Perlが組み込み型で扱う数値にはIV、UV、NVの3つがある。
IVはポインタが格納できることが保証される符号あり整数型、
UVはIVと同様の符号なし整数型。
そしてNVは倍精度浮動小数点型となっている。

えーとだからその処理系における不動小数点型の表現がIEEE 754だと仮定すれば、
倍精度浮動小数点型の仮数部は52bitで、
32bitマシンの場合は(恐らく)UVのほうが表現できる範囲が大きい(52bit - 15~16桁)。
64bitマシンの場合はIV/NVのほうが表現できる範囲が大きい(64bit - 18~20桁)。

かな。前に齧り読んだことと、ドキュメントの関連してそうな部分を
掻い摘んで読んだのを組み合わせただけなのであってるかどうかはわからん。
See also: perlguts
0646nobodyさん2007/01/04(木) 16:40:19ID:???
>>645
訂正
> 32bitマシンの場合は(恐らく)UVのほうが表現できる範囲が大きい(52bit - 15~16桁)。
> 64bitマシンの場合はIV/NVのほうが表現できる範囲が大きい(64bit - 18~20桁)。
ここ思いっきりUVとNVが逆になってる( ´д`;) 読み替え宜しく
0647nobodyさん2007/01/04(木) 18:37:22ID:???
1ずつ足して確かめるのオススメ
0648nobodyさん2007/01/05(金) 04:06:51ID:CAClPvdI
XML::Parserモジュールがどうしてもインストールできません。
最新のexpatもいれたのですが。。
0649nobodyさん2007/01/05(金) 07:21:32ID:???
that's too bad.
0650nobodyさん2007/01/05(金) 12:28:06ID:???
まったくの初心者ですみません。
ブラウザーからの入力に応じてcgiファイルを書き換えるcgiを作ってみたいのですが。

書き換える側のCGIのソースと書きこまれる側のソースが混ざってしまって
バグがおきてしまいました。
書き込まれる側のソースにシングルクオーテーション、ダブルクオーテーション
が含まれていて書き換える側のダブルクオーテーションで囲まれた間の部分に、
書き込まれる側のダブルクオーテーションが存在してしまうようです。
他にも変数を文字列として書き出せず変数の中身、つまり何も無いスカが書き出されます。
どうすれば良いでしょうか?
0651nobodyさん2007/01/05(金) 12:36:48ID:???
>>650
煽りではなく今の君には無理ってことかと。
そんなことする意味もないし。
0652nobodyさん2007/01/05(金) 13:19:34ID:???
>648
それだけじゃ何もわからん。OSは?Perlのバージョンは?Cコンパイラは持ってる?
06536502007/01/05(金) 13:24:38ID:???
perlを入門サイトなどで勉強中でして、ファイルを制御するのを今習っています。
とりあえずCGIからいろんなファイルに書き込むプログラムを色々と書いてみているのですが。
テキストやHTMLは上手く書き込めたのですがCGIのファイルは上手くいきませんでした。
CGIファイルへの書き込みは習っても意味が無いのでしょうか?
0654nobodyさん2007/01/05(金) 14:31:51ID:???
>>653
勉強するだけならいいけど実際に共有鯖等では実行しないで欲しいね。
リスクが高いです。他のユーザーに迷惑かける可能性大。
0655nobodyさん2007/01/05(金) 14:39:32ID:???
ヒント:パーミッション
0656nobodyさん2007/01/05(金) 17:52:53ID:???
他のユーザに迷惑かけないようにする仕組みはサーバー提供者が負うべき。
ユーザは許可されている事はなんでもやってよい。
0657nobodyさん2007/01/05(金) 19:09:54ID:???
他人に迷惑をかける行為は許可なんてされてませんよ?
実行可能=やってよいとか考えているわけではありませんよね^^;
0658nobodyさん2007/01/05(金) 19:19:39ID:???
人を殺してはいけないなんていう法律は無いから、人を殺してもよい
0659nobodyさん2007/01/05(金) 20:31:05ID:5w1bms+v
>> >648
>> それだけじゃ何もわからん。OSは?Perlのバージョンは?Cコンパイラは持ってる?
OSはFedoraCore6
PerlVersionは v5.8.8 built for i386-linux-thread-multi
Cコンパイラはあります。gcc -v で確認しました。
どうもexpat関係でエラーになっています。最新のexpatはいれたのですが。
0660nobodyさん2007/01/05(金) 23:49:44ID:???
>>653 の問題はパーミッションではなくて、クォートの問題じゃないのか?

'$' の前に¥でescapeしたり、ということで解決するんじゃないか。

それ以前にcgiがcgi を書き換えるという発想はどうなのよ。
動的にプログラムを生成する必要性はそうないんじゃないか。
0661nobodyさん2007/01/06(土) 01:22:14ID:???
>書き込まれる側のソースにシングルクオーテーション、ダブルクオーテーション
>が含まれていて書き換える側のダブルクオーテーションで囲まれた間の部分に、
>書き込まれる側のダブルクオーテーションが存在してしまうようです。
>他にも変数を文字列として書き出せず・・・

自分でわかってんじゃん
0662nobodyさん2007/01/06(土) 14:46:16ID:???
コンパイルの必要なモジュールをuse libで使うにはどうすればよいのでしょうか。
0663nobodyさん2007/01/06(土) 14:55:31ID:???
自己解決しました。
そのままで良いんですね。。。
0664nobodyさん2007/01/06(土) 16:32:45ID:???
CGI動的生成プログラムを"作る必要がある"プロジェクトに関わる者なら質問しないレベルだろう

つまり>>650は何か間違った設計をしてるんだろうと思う。
てか掲示板のログファイルの拡張子を .cgi にしたいだけとかでは
0665nobodyさん2007/01/06(土) 19:32:53ID:???
超低レベルな質問お許し下さい。
PerlによるCGIの参考書を買ってゼロから勉強中ですが、
下記のプログラム(参考書を丸写し)が動作しません。エラーコードは500です。
原因は何でしょうか?
・Perlのパスはレンタルサバのサイトで確認
・ファイル名はindex.cgi
・OSはWinで、メモ帳で編集しFFFTPでUL
・パーミッションは755

#!/usr/bin/perl

print <<_EOF;
Content-type: text/html

<html>
<head><title>test</titel></head>
<body>
test
</body>
</html>
_EOF
0666nobodyさん2007/01/06(土) 19:54:15ID:???
>>665
500エラーじゃ何も判らんし、そもそもレン鯖使って勉強するなといいたいが。

・FTPの時にASCIIモードで送って無い
・パーミッションがレン鯖指定のものと違う
・そもそもindex.cgiが使えないようになっている(別名でテストしてみ)

とかそんなあたりか。ソースそのものは問題ない。
タグでtitleの打ち間違いがあるくらいか。
0667nobodyさん2007/01/06(土) 20:03:54ID:???
メモ帳だと最終行末改行がないとか
0668nobodyさん2007/01/06(土) 20:07:39ID:???
もう出てるけど、
・バイナリモードで転送した
・ヒアドキュメント終端文字列でファイルが終わってる(改行がない)
辺りが有力っぽい。
0669nobodyさん2007/01/06(土) 20:23:33ID:lBOtCkKI
掲示板の改造で、半角カタカナが本文に含まれる場合
エラーメッセージを出すようにしたいと思っています。

投稿されたメッセージ$messageに
半角カタカナが含まれているかどうかを判定する、というのは
どう書けばよいでしょうか?

全角文字があるかどうかを判定ならググって出てきましたが・・・。
0670nobodyさん2007/01/06(土) 20:23:42ID:???
>>666
回答ありがとうございます。
>・FTPの時にASCIIモードで送って無い
FFFTPの環境設定に転送設定という箇所があったので、
「常にアスキー」に設定し、ULしなおしました。

>・パーミッションがレン鯖指定のものと違う
確認したところ、実行ファイルは700が推奨されていたのでそうしました。
705も試しました。

>・そもそもindex.cgiが使えないようになっている(別名でテストしてみ)
確認したところindexで問題ないようですが、test.cgiに変更しました。

ですが、動作しませんでした。
06716652007/01/06(土) 20:31:56ID:???
>>666-668
最後に一回改行を入れてからULしたら動作確認できました!
回答ありがとうございました!
06726692007/01/06(土) 21:04:52ID:???
もっと探したらみつかりました。ごめんでした。

・・・が、さらに質問です。
名前とタイトルに含まれる半角カタカナは全角に変換でいい。
そこでログに書き込むサブルーチンregistに、
&jcode'h2z_sjis(*name);#$nameの半角を全角に
&jcode'h2z_sjis(*subject);#$subjectの半角を全角に
と書いたのですが、名前のほうが変換されません。
0673nobodyさん2007/01/06(土) 22:19:16ID:???
それだけで全てをわかってくれるエスパーさんが来るといいね
0674nobodyさん2007/01/06(土) 22:29:08ID:???
30字くらいのパスワードを暗号化したいのですが、
モジュールのインストールなしに出来る方法はどんな方法があるのでしょう。
今はuse libとuse Crypt::CBCとBlowfish_PPでやっているのですが、どうしても遅いので
もう少し早くできると良いのですが。

>>662でlinux上で単純にコンパイルしてそのままautoディレクトリをコピーしてやれば良いのかと思って
コピーしてみましたが
Blowfish.so: undefined symbol: Perl_Gthr_key_ptr
こんな感じのエラーが出てしまいました。
Blowfish_PPとBlowfishでは速度が違いすぎるので、出来ればBlowfishの方を使いたいのですが、
どうすれば使えるのでしょうか。
0675nobodyさん2007/01/06(土) 22:59:26ID:???
ちょ、パスワードをなんのために暗号化するのさ
0676nobodyさん2007/01/06(土) 23:03:37ID:???
xor暗号最強
0677nobodyさん2007/01/06(土) 23:21:18ID:???
>>672
同じ文字列入れてnameの方だけ変換ないってんなら
おまいが間違ってるとしか言えん。

>>674
モジュール無しで、ということだけならopensslに投げるという手もある。
モジュールのほうが速いと思うけど。
0678nobodyさん2007/01/06(土) 23:44:23ID:???
>>675
マジレスして欲しいのかな?
0679nobodyさん2007/01/07(日) 00:26:44ID:???
>>674
手順はそれで間違ってないと思うのだけれど
・make testは通ったのか
・perlのバージョン
を
0680nobodyさん2007/01/07(日) 00:28:09ID:???
>>675
拡張子をcgiにすればファイルの中身を見られることもないのですが、まあ気休め程度に。
>>677
すみません。解決しました。
サーバーとローカルのperlのバージョンが違ったためにモジュールのバイナリを使用できていなかったようです。
サーバーとローカルのperlのバージョンをそろえてコンパイルしなおしたらそのままコピーでuse libしたら
出来ました。
0681nobodyさん2007/01/07(日) 00:28:21ID:???
>>645
レス遅れましたが、本当に有難うございました。
検証もしてみましたので検証報告も兼ねさせていただきます。

結論から申し上げますと、16桁目の4以上、つまりは4000兆
くらいから計算が狂ってきました。
これは645さんのおっしゃる32ビットマシンの性能ということ
に当てはまったのではないかと思いました。

ご丁寧に有難うございました。
0682nobodyさん2007/01/07(日) 00:29:35ID:???
>>679
どうもです。
まさにバージョンでした。
0683nobodyさん2007/01/07(日) 19:30:50ID:???
毎度お世話になっております。

Mac OS X PantherのTerminal上にて運用する予定のPerlスクリプトをMac OS X Tigerにて作っています。
指定されたディレクトリの中にある1万個程度のテキストを片っ端からチェックして、
ある特定の文字列があったら別の文字列に置き換えて保存するという処理なのですが、
一部ファイル名の最後の文字がスペースのものがあった場合に
それらの展開に失敗する(最後のスペースが無いものとしてファイルを開こうとする)ようです。

ファイル名の最後のスペースを認識させるにはどのような方法があるのかご教示頂けますと幸いです。
よろしくお願いいたします。
0684nobodyさん2007/01/07(日) 20:02:05ID:???
>>683
>>1
> 2: それでこんな風にやってみたが・・・
0685nobodyさん2007/01/07(日) 20:02:08ID:???
3引数openで開けばいいんでないの
0686 ◆TWARamEjuA 2007/01/07(日) 20:11:46ID:????BRZ(6700)
何となく板違いの伊予柑♪

panther も tiger も5.8.xなのでバージョンの違いとか、OSの違いによるもんじゃないと思うそ。
0687nobodyさん2007/01/07(日) 20:15:21ID:???
Tiger(perl v5.8.6)で試してみたけど、3引数openなら大丈夫だった。
0688nobodyさん2007/01/07(日) 20:27:45ID:???
2引数openはファイル名の前後にあるスペースを削っちゃうのよね
案外知られてないのかな
0689nobodyさん2007/01/07(日) 20:47:03ID:???
>>684
とりあえずやってみたのがファイルのパスを' 'でくくるとか
" "でくくって\を付けるとかくらいなもので…

>>685
デキタ━━━━━━(゚∀゚)━━━━━━!!!!

何でなのか理屈がよく分かりませんができたっぽいです。
迅速なお答え、本当にありがとうございました!
06906832007/01/07(日) 20:52:01ID:???
>>686
ご察しの通りPerlの仕様だったようです。
これでPantherのPerlが5.6だったりしたら路頭に迷うところでした。

>>687
検証して頂きありがとうございます。
おかげさまで何とかなりそうです(*´∀`)

>>688
Perlは一応それなりに馴染んでいたつもりだったのですが
今回の件には完全にやられました。もっと精進します。
0691nobodyさん2007/01/07(日) 21:22:42ID:???
マック欲しい…
0692nobodyさん2007/01/08(月) 05:15:48ID:???
先着で500名までマックだって。急げば間に合うんじゃないか?
ttp://www.mcdonalds.co.jp/mcgriddles/index.html
0693nobodyさん2007/01/09(火) 00:38:49ID:???
PerlCGI制掲示板の改造で、半角カタカナを全角カタカナに変換するには
どう書けばいいでしょうか。
jcode.plではなく普通に置換で行いたいと思うのですが。
ここの正規表現みていたら訳が分からなくなってきた・・・。
ttp://sieg.xeong.com/archives/2005/06/perl.html
0694nobodyさん2007/01/09(火) 00:48:18ID:???
>>693
それ・・・問題おきまくりだよ
0695nobodyさん2007/01/09(火) 01:08:35ID:???
jcodeg.pl使うと半角カナを化けずに使えるけど、これって問題ある?
0696nobodyさん2007/01/09(火) 01:11:19ID:???
unicodeなりeucで書いておけばとりあえず半角だのなんだの気にしなくてもかまわんでしょ
06976932007/01/09(火) 02:24:52ID:???
ん〜サイト全体(CGI以外)がS_JIS。
EUCはブラウザのミスによる文字化けがあるから嫌なんです(タブブラウザにしなくていいからこっちを先に治せM$)。
CHARSET設定していながら何かの拍子に化ける→エンコードし直しうざい

それに半角カタカナを使えるようにしたいのではないので。
・・・大体、半角カタカナを使って書く言葉って、あまりいい意味の言葉じゃないですよね。
06986972007/01/09(火) 02:37:18ID:???
しかし問題ありなんですね・・・>>694
tr使ってもダメだと書いてあるページを見つけました・・・

もともとのスクリプトではフォームデコードに
&jcode'h2z(\$value);
があって、投稿した半角カタカナは全て全角に変換されるんですが
これだと「・・・」まで変換されて(個人的に)変な感じがする。
しかもこれはカタカナではない記号ですしね。
で、他に方法はないかと思ったのですが。
半角→全角は諦めるしかないみたいですね。
レスありがとうございました。
0699nobodyさん2007/01/09(火) 02:47:31ID:???
サイト全体がSJISだからCGIもそれにあわせるとか、まったく意味の無い統一の仕方なのだが・・・
どうしてもあわせたいならHTMLをunicodeにしちゃえよ
0700nobodyさん2007/01/09(火) 03:06:27ID:???
use utf8をやればtrでも行ける。
後は濁点付きを適当に置き換えれば。
0701nobodyさん2007/01/09(火) 03:14:56ID:???
>>699
SJISだから合わせるとかなんとかってのは無視してくださいな。
そんなことどうでもいい。

とにかく半角カタカナを使ってもらいたくないというのと
半角カタカナを2ちゃん以外の場所で見たくないってだけ。

半角カタカナがあればエラーってのもやってみたし
半角カタカナを全角変換もやってみたけど
カタカナじゃないやつまで処理してしまうというのが・・・ってだけの問題。
0702nobodyさん2007/01/09(火) 04:25:59ID:???
そんなに半角カナを嫌わんでもw

ナンテイウカ タンナル アレルギー ニ シカ ミエナイ カンシ ゙ダナ
0703nobodyさん2007/01/09(火) 06:21:11ID:???
正しいパスワードを入力したはずなのにエラー(´・ω・`)
何処か一文字間違ってるんだろうけど何処が間違ってるか分からない、といったユーザの不満を解消すべく
ショッピングカートの改良しようと思っています

パスワードのMD5ハッシュをDBに保存するロジックを平文での保存にすることは簡単にできたので、
あとは何処がが間違っているかをユーザに教えるロジックを作ればいいんですが、どうするのがユーザビリティ的に好ましいでしょうか?

正しいパスワードとユーザ入力のパスワードが同じ文字数の場合には、

正しいパスワード "hoge2CH" の時、ユーザが "hoge2ch" と入力したら、
「パスワードの6文字目・7文字目が間違っています。」 と返す、のように簡単にいくんですが、

正しいパスワードが "hoge2CH" の時、ユーザが "hoge2C" と入力した場合に、
貴方がユーザだとしたらどういうエラーが返って来て欲しいかを教えて下さい。


0704nobodyさん2007/01/09(火) 06:34:19ID:???
>>703はそんなことをしたら恐ろしく少ない回数の試行で
パスワードが特定できるということを解っているのだろうか…
0705nobodyさん2007/01/09(火) 07:11:16ID:???
>>704
間違いが一定文字数以下の時だけヒントを出すようにすりゃ大丈夫じゃね?
0706nobodyさん2007/01/09(火) 09:15:15ID:???
>>703
危険なのでヤメレ
>>705
クマー
0707nobodyさん2007/01/09(火) 11:49:21ID:???
>>703
> 貴方がユーザだとしたらどういうエラーが返って来て欲しいか

正しいパスワードそのものを表示して欲しいな。
■ このスレッドは過去ログ倉庫に格納されています