perl oneliner - 영숫자가 아닌 문자를 사용한 무작위 문자열 생성기

perl oneliner - 영숫자가 아닌 문자를 사용한 무작위 문자열 생성기

영숫자와 영숫자가 아닌 문자가 혼합되어 생성되도록 지도에 영숫자가 아닌 문자를 추가하려면 어떻게 해야 합니까?

$ for i in {1..5};do perl -le 'print map { (a..z,A..Z,0..9)[rand 62] } 0..pop' 100;done
feUhC59cHXl1s39T1LIiQVQVhVOMI9I2c11wZZKjitE4gVl4LAup7s2ZUeprkSWBqNkEiZVM66m73Zkk2lRb37VcgEz5PDX0YIMao
mjIvFkxFLyzw6BXwnqLj3SrliLXivrvDFhB6Vo9R8pnemm8LlyzeXeNF9x5haCvS8iLHRflPn1wpORlexka1G2yi9E8tDRXi0sNYt
FT2SpObqjVaHhSw18zegl4V2C6SOWe65HEJwA4U2EpOBpWukTThdzgaRCLAjOfHmAocZpPhdnyIe3SmvGncODw1W6gR9j8GjLWUbq
jCmX3J34hOcDiOkpSTadMyChkO8jkGOiThbE9W2esnHRPGutBCPVTxLIuLN7onlYnMKrD7oGzPG0szpS6ijoncXSzn3MzdwrFLWJw
H4vmVPWcOqwieRagETfUJJA7wIrIFOB6LcANFSnC5fJeZ9KJvusfABFa50NWQ8NugeIpP4nrIWzNLkZhLiCuCLlNbkAPpBgCvB9Ga

답변1

사용문자기능:

perl -le 'print map chr 33 + rand 94, 1 .. 1000'

답변2

이후이 댓글qw//사용자 정의 문자를 추가하는 방법을 요청하셨습니다. 한 가지 방법은 업데이트의 개수만 기억하여 목록에 추가하는 것입니다 rand 67.

perl -le 'print map { (a..z,A..Z,0..9,qw{- _ / & ?})[rand 67] } 0..100'

답변3

이것이 당신이 다루고 있는 단순한 문제 그 이상이고 그것에 대해 더 알고 싶다고 가정하면, 이를 더 쉽게 개발하고 유지 관리할 수 있는 방법이 있습니다. (잠깐만요, 제가 방금 Perl 한 줄짜리 코드 중 하나를 사용한 걸까요?!)

나는 문자를 세고 무언가를 변경할 때 업데이트하는 것을 싫어합니다. 당신이 되기로 약속하지 않는 한하나의Perl 라인에서는 목록을 먼저 만든 다음 사용하는 것이 좋습니다. 즉, a) 다른 방법을 사용하여 문자 목록을 만들고 b) 나중에 얼마나 오래 걸리는지 물어볼 수 있습니다.

저는 정규 표현식이 제공하는 유용한 문자 세트를 좋아합니다. 이를 통해 관련 문자 그룹을 나타낼 수 있습니다(사용 사례에 적합한 경우). 따라서 제가 취하는 보다 일반적인 접근 방식은 다음과 같습니다.

문자 목록을 작성합니다(예제를 사용하고 댓글에 언급된 대로 "!" 및 "-"를 추가합니다). 이 생성됩니다모두7비트 ASCII 문자(최대 127자), 문자 클래스와 일치하는 문자만 유지합니다.

@chars = grep /[a-zA-Z0-9!-]/, map chr, 0..127

그런 다음 무작위 시퀀스를 내보냅니다("rand @chars"는 "@chars"를 숫자 컨텍스트로 강제하고 0부터 시작하는 배열 길이를 제공합니다).

print map { $chars[rand @chars] } 0..pop

모두 종합하면 다음과 같습니다.

perl -le '@chars = grep /[a-zA-Z0-9!-]/, map chr, 0..127;print map { $chars[rand @chars] } 0..pop' 100

간단히 각 문자를 클래스에 명시적으로 추가할 수 있습니다. (필요한 경우 이스케이프 처리하도록 주의하세요. 예를 들어 저는 그냥아니요마지막에 대시를 그대로 피하세요)

일부 또는 전부 읽기perlrechar 클래스 문서더 많은 정보를 얻으세요.

내 예에서는 기본적인 7비트 ASCII 항목에만 관심이 있는 것 같아서 "127"을 선택했습니다.

좀 더 난해한 것에 관심이 있다면 더 큰 숫자로 달려가야 할 것입니다. 디지털 재미를 느끼고 싶다면 다음을 시도해 보세요.

@chars = grep /\p{Numeric_Type=Digit}/, map chr, 0..65535

관련 정보